Index Agentica について
Index Agentica は、ツール、MCP サーバー、API、プロトコル、スキルを探すエージェントや利用者向けの公開ディレクトリ検索サービスです。認証不要のステートレスなリモートサーバーで、掲載情報や長文ガイドも取得できます。
主な機能
- 01掲載項目とガイドの検索
- 02掲載項目の詳細取得
- 03ガイド、比較、スタック、スキルの取得
- 04カテゴリの閲覧
- 05ディレクトリへの掲載申請
活用シーン
- 01タスクに使う MCP サーバーの検索
- 02ツールやエージェントスタックの比較
- 03スキルや長文ガイドの取得
- 04ディレクトリへのプロジェクト掲載提案
MCP 対応
検索、掲載項目とコンテンツの取得、カテゴリ一覧、掲載申請のツールを備えたリモート Streamable HTTP MCP サーバーを提供します。認証不要で、掲載申請を除き読み取り専用です。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mcp.indexagentica.com/mcpclaude mcp add --transport http com-indexagentica https://mcp.indexagentica.com/mcp{"mcpServers":{"com-indexagentica":{"type":"http","url":"https://mcp.indexagentica.com/mcp"}}}Cursor で開く{"servers":{"com-indexagentica":{"type":"http","url":"https://mcp.indexagentica.com/mcp"}}}VS Code で開く{"mcpServers":{"com-indexagentica":{"type":"http","url":"https://mcp.indexagentica.com/mcp"}}}{"mcpServers":{"com-indexagentica":{"serverUrl":"https://mcp.indexagentica.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
5| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| tags | array | いいえ | 任意のタグ slug のリスト。結果は指定したすべてのタグに一致する必要があります(例:["open-source", "python"])。 |
| type | enum | いいえ | 任意の結果タイプ:entry(ディレクトリエントリ)、guide、comparison、stack、skill、または all(デフォルト)。entry | guide | comparison | stack | skill | all |
| limit | integer | いいえ | 結果の最大件数(1~50、デフォルトは 10)。 |
| query | string | いいえ | フリーテキストの検索語。例:"browser automation" または "payments x402"。category または tags を指定した場合は空でもかまいません。 |
| category | string | いいえ | 結果を絞り込む任意の entry カテゴリ slug(type は entry に設定されます)。現在のカテゴリ:skills、harnesses、mcp-servers、tools、protocols、apis、information、finance-payments、directories、infrastructure、evals-observability。 |
詳細
indexagentica-mcp
リモート MCP サーバー(Streamable HTTP)および REST 検索 API。エージェントを最優先にした、スキル、ハーネス、MCP サーバー、ツール、プロトコル、API に加え、長文ガイド、比較、スタック、ダウンロード可能な Agent Skills を掲載するディレクトリ、Index Agentica のためのものです。**Cloudflare Workers(無料プラン)**で動作し、ステートレスで、Durable Objects も認証もなく、CORS はオープンです。読み取り専用ですが、request_listing / POST /v1/requests は例外で、Curator の審査用に掲載リクエストをキューに登録します(D1)。
セルフホスト: 新規クローンから独自のコピーを実行する方法については、SELF_HOSTING.md を参照してください(テンプレート設定、独自の KV/D1、独自のデータミラー、ローカルおよびリモートのスモークテスト)。wrangler.toml と DEPLOY.md は、メンテナー自身のデプロイに使用するものです。
インストール
リモートサーバー:インストール不要、API キー不要。Streamable HTTP は https://mcp.indexagentica.com/mcp(稼働中)です。
claude mcp add --transport http indexagentica https://mcp.indexagentica.com/mcp
その他のクライアント:認証なしの Streamable HTTP サーバーとして URL を追加してください(llms-install.md を参照)。
同じ Worker は https://indexagentica-mcp.indexagentica.workers.dev/mcp
でも応答します(DEPLOY.md を参照)。
エンドポイント
| メソッド | パス | 内容 |
|---|---|---|
| POST | /mcp | MCP Streamable HTTP エンドポイント(JSON-RPC 2.0、JSON レスポンス) |
| GET/DELETE | /mcp | 405(独立した SSE ストリームなし、セッションなし) |
| GET | / | MCP エンドポイント、REST、llms.txt、ドキュメントへのリンクを含む JSON 形式の自己紹介 |
| GET | /search?q=&type=&category=&tags=a,b&limit= | エントリーおよび長文コンテンツのランキング付き検索(type:entry、guide、comparison、stack、skill、または all(デフォルト);category はエントリーに適用;limit は1〜50、デフォルトは10;tags は AND 条件) |
| GET | /entries/<id>(または <id>.json) | エントリー全体を1件取得。404 には suggestions が含まれます |
| GET | /entries | すべての ID |
| GET | /content/<type>/<id>(または <id>.json) | ガイド、比較、スタック、スキルのいずれか1件:メタデータ+Markdown(?include_html=1 を指定すると HTML を追加);404 には suggestions が含まれます |
| GET | /content?type= | 公開済みの長文コンテンツ(メタデータ) |
| GET | /categories | カテゴリーと件数 |
| GET | /openapi.json | REST API の OpenAPI 3.1 |
| GET | /.well-known/mcp/server-card.json | 静的サーバーカード(Smithery スキャンのフォールバック):serverInfo、authentication: {required: false}、tools/list と同じ tools、空の resources/prompts |
| GET | /stats | 公開利用統計(JSON):サイトのページビュー、外部リンクのクリック数、スキルのダウンロード数、ツール別の MCP ツール呼び出し数、REST リクエスト数、エージェント/人間の内訳;過去24時間、過去7日間、since タイムスタンプ以降の全期間。キャッシュ期間は10分です。利用統計を参照 |
| GET | /v1/usage | /stats のエイリアス(サイトで使用;コンテンツブロッカーのフィルターに検出されにくい) |
| POST | /v1/e | /hit のエイリアス(サイトで使用) |
| GET, HEAD | /skills/{id}.zip, /skills/{id}/SKILL.md | スキルを直接ダウンロード:ダウンロード数を1件記録した後、indexagentica.com の静的ファイルへ 302 でリダイレクトします。不明な ID は 404 になります。スキルの直接ダウンロードを参照 |
| POST | /hit | indexagentica.com のインラインスクリプトからのサイト利用状況ビーコン(オリジンを検証し、厳密にバリデーションを行い、204 を返します)。サイトビーコンを参照 |
| POST | /v1/requests | リスティングをリクエストします(request_listing ツールと同じロジック)。JSON ボディ {wanted, category, url?, reason?, requester?};新規は 201、統合は 200。リスティングリクエストを参照 |
| GET | /v1/requests?status=&limit= | リクエスト数の多い項目の公開リスト(サニタイズ済み;却下された項目は非表示;url は検証済み/掲載済みの場合のみ) |
| GET | /v1/requests/admin?status= | キュレーター向け:キュー全体(Bearer REQUESTS_ADMIN_TOKEN) |
| POST | /v1/requests/<id>/status | キュレーター向け:{status, entry_id?, note?} または {delete: true}(Bearer トークン) |
| GET | /v1/admin/tool-calls?hours=48 | 管理者向け:tools/call 以外の呼び出し数を、要求されたツール名とクライアント別に集計。不明な名前も含みます(Bearer トークン;/stats には含まれません) |
| GET | /health | 稼働状態(レート制限なし) |
エラーは常に JSON です:{"error":{"status":400,"code":"bad_request","message":"..."}}
(コード:bad_request、not_found、method_not_allowed、rate_limited、upstream_error)。
MCP ツール
| ツール | 入力 | 出力(structuredContent) |
|---|---|---|
search | query(文字列)、type?(entry|guide|comparison|stack|skill|all、デフォルトは all)、category?(スラッグ。エントリーのみ)、tags?(文字列配列。すべて一致する必要があります)、limit?(1~50) | {query, type, category?, tags, limit, total, results[]}。各結果には type, id, name, summary, url, tags, score, links が含まれ、さらに category(エントリー)または author, last_verified, entries(長文コンテンツ)が含まれます |
get_entry | id(ケバブケース) | {entry}(エントリーのスキーマに準拠した完全なエントリー、links、長文コンテンツからの逆参照) |
get_content | type(guide|comparison|stack|skill)、id、include_html? | {content}:フロントマター、メタデータ、markdown(スキームリンクは絶対 URL に解決済み)、links。比較には comparison(基準、表、結論)、スタックには stack(ユースケース、コンポーネント)、スキルには skill_md(完全な SKILL.md)と links.zip / links.skill_md が追加されます |
list_categories | なし | {total, generated, categories[{slug,name,description,count,html,json}]} |
request_listing | wanted(≤120)、category(カテゴリのスラッグまたは other)、url?(http(s)、≤300)、reason?(≤500)、requester?(≤60) | {ok, id, merged, vote_counted, request{id,wanted,category,votes,status,first_seen,last_seen}, note, list}。唯一の読み取り専用ではないツール(readOnlyHint: false。破壊的ではありません) |
各ツールには JSON-Schema の inputSchema、outputSchema、readOnlyHint アノテーションがあり、structuredContent と同じ JSON を text コンテンツブロックとして返します。不正な引数や不明な ID の場合は、isError: true のツール結果が返されます(モデルが自ら修正できます)。不明なツール名の場合は、JSON-RPC -32602 が返されます。そのメッセージには有効なツールが列挙され、明確に一致する候補がある場合(mcp__indexagentica__search などのクライアント名前空間のプレフィックス、search_index / find などの同義語、編集距離 2 以内の誤字)は候補が提案されます:error.data = {requested, valid_tools, suggestion?}。提案された候補が実行されることはありません。明示的なエイリアス(src/tools.js の TOOL_ALIASES)は、実際のクライアントから呼び出されたことが確認された、曖昧さのない名前に限って追加されます。これらは tools/list では公開されず、ログには当初要求された名前が記録されます(detail = alias:<tool>)。
スコアリング:クエリ内の各単語について、ID/名前の完全一致は 12、ID の部分一致は 6、名前の部分文字列一致は 5、タグの完全一致は 4(タグの部分一致は 2)、概要は 2、カテゴリは 1.5、説明は 1 です。名前にフレーズ全体が含まれる場合は 8 が加算され、単語の一致率が乗算されます。
プロトコルのサポート(2世代対応、ステートレス)
- 2026-07-28(現行仕様、「modern」):ハンドシェイクはありません。各 POST には
_meta["io.modelcontextprotocol/protocolVersion"]とMCP-Protocol-Version、Mcp-Method(およびtools/callの場合はMcp-Name、base64 sentinel に対応)のヘッダーが含まれます。 サーバーはヘッダーを本文と照合して検証し(-32020 HeaderMismatch)、不明なバージョンは-32022とsupportedリストを返して拒否し、server/discoverを実装し、resultType: "complete"、結果の_metaにserverInfoを返し、tools/listとserver/discoverにttlMs/cacheScopeのキャッシュヒントを付与します。不明なメソッドは HTTP 404 と-32601を返します。 - 2025-11-25/2025-06-18/2025-03-26(「legacy」):
initializeに応答します (バージョンをネゴシエーションし、フォールバック先は 2025-11-25)。notifications/initializedは 202 を返し、ping、tools/list、tools/callに対応します。2025-03-26 のバッチも受け付けます。Mcp-Session-Idは 発行されないため、各リクエストは独立しており、どの Worker isolate でも処理できます。 - 応答は常に
application/jsonです(SSE は使用しません)。OriginはALLOWED_ORIGINSと照合されます (データは公開され読み取り専用のため、デフォルトは*です)。
仕様への参照:Streamable HTTP 2026-07-28、 バージョン管理/2世代対応、 server/discover。
データとキャッシュ
信頼できる情報源は公開済みの静的サイトです。GET https://indexagentica.com/api/index.json
(すべてのエントリーとカテゴリ)と GET /api/longform.json(長文メタデータ)を
同時に取得します。長文インデックスを読み込めない場合でも、エントリーは引き続き利用できます。get_content は
オンデマンドで /api/longform/<route>/<id>.json を取得します(同じキャッシュを使用)。取得元は常に
DATA_BASE_URL です。Worker は CACHE_TTL_SECONDS(600 秒)の間、インデックスを isolate メモリに保持し、
Cloudflare Cache API にも保存します(カスタムドメインでは有効、workers.dev では何もしません)。同時に発生した
更新処理はまとめられ、上流の取得に失敗した場合は古いコピーを配信します。サイトのビルドで追加されたカテゴリは
自動的に反映されます。どこにも書き込みは行いません。
使用状況のログ記録(Workers Analytics Engine)
OPTIONS、/health、/robots.txt、/favicon.ico、/hit、/stats を除く各リクエストで、Analytics Engine データセット indexagentica_mcp(wrangler.toml のバインディング ANALYTICS)にデータポイントを 1 つ書き込み、ツールおよびクライアントごとのエージェントの利用状況を集計できるようにしています。バインディングがない場合(ローカルテスト、ratelimit-test 環境)、ログ記録は何も行わず、書き込みに失敗してもレスポンスには影響しません。Workers Free では 1 日あたり 100,000 データポイントを書き込めます(料金)。データは 3 か月間保持されます(制限)。
| 列 | フィールド | 備考 |
|---|---|---|
index1 | <route>:<tool or method or endpoint> | 例:mcp:search、rest:get_entry |
blob1 | route | mcp または rest |
blob2 | endpoint | 正規化された値:/mcp、/search、/entries/{id}、/content/{type}/{id}、…、other |
blob3 | JSON-RPC メソッド | initialize、tools/call、batch、…(MCP のみ) |
blob4 | ツール | MCP ツール名、または REST の同等の値(search、get_entry、get_content、list_content、list_categories) |
blob5、blob6 | クライアント名、バージョン | initialize の clientInfo、または 2026-07-28 の _meta["io.modelcontextprotocol/clientInfo"] から取得。64/32 文字に切り詰められます |
blob7 | User-Agent | 128 文字に切り詰められます |
blob8、blob9 | プロトコルバージョン、時代 | modern/legacy |
blob10 | 結果 | ok、error(HTTP ≥ 400、JSON-RPC エラー、または isError ツール結果)、rate_limited |
blob11 | 詳細 | JSON-RPC エラーコード、tool_error、または HTTP ステータス |
blob12、blob13 | 国、colo | request.cf から取得 |
blob14、blob15、blob16 | タイプフィルター、カテゴリフィルター、対象 ID | kebab-case の値のみ(公開カタログのスラッグ/ID)。それ以外はすべて invalid として保存されます |
blob17 | UA クラス | human(一般的なブラウザーの User-Agent)または agent(それ以外すべて:MCP クライアント、SDK、curl、クローラー、ヘッドレスブラウザー)。src/ua.js を参照してください。2026-10-03 に追加。それ以前の行はクエリ実行時に blob7 から分類されます |
blob18 | トラフィック | internal(自分たちのテスト/エージェント。内部トラフィック を参照)または outside。2026-10-12 より前は空 |
blob19 | 内部ルール | header、ua、ip(外部トラフィックの場合は空) |
double1 | HTTP ステータス | |
double2 | レイテンシ(ms) | Worker 内の経過時間(Workers のクロックは I/O 中も進みます) |
double3 | ASN | request.cf.asn から取得(個人ではなくネットワーク) |
double4 | 結果数 | 検索の total |
double5、double6 | クエリの文字数、単語数 |
プライバシー: IP アドレス、検索クエリのテキスト、自由記述のツール引数、Cookie、トークン(サーバーには存在しません)は記録しません。また、サイトビーコンではリファラー、クエリ文字列、クライアント識別子も記録しません。クライアントは、自己申告の名前/バージョンと、切り詰められた User-Agent のみで識別されます。クエリの例(SQL API):
SELECT blob4 AS tool, blob5 AS client, SUM(_sample_interval) AS requests FROM indexagentica_mcp WHERE timestamp > NOW() - INTERVAL '1' DAY GROUP BY tool, client ORDER BY requests DESC。
サイトビーコン(POST /hit)
indexagentica.com のすべてのページには、小さなインラインスクリプトが含まれています(Cookie、localStorage、識別子、サードパーティーコードは使用しません)。navigator.webdriver が設定されている場合、またはブラウザーが Do Not Track もしくは Global Privacy Control を送信する場合は実行されません。navigator.sendBeacon を使って(CORS プリフライトを発生させないよう text/plain として)次の情報を送信します。
| イベント | 本文 | タイミング |
|---|---|---|
| ページビュー | {"t":"pageview","p":"/entries/x402/"} | ページ読み込み時。p はページの正規パス(クエリー文字列とリファラーを含みません) |
| 外部リンクのクリック | {"t":"click","p":"/entries/x402/","id":"x402","h":"www.x402.org"} | エントリーページで、掲載項目のウェブサイト/リポジトリ/ドキュメント/ソースへのリンクをクリックしたとき |
| ダウンロード | {"t":"download","p":"/skills/<id>/","id":"<id>","k":"zip"|"skill_md"} | スキルの zip または生の SKILL.md リンクをクリックしたとき |
サイトは mcp.indexagentica.com のエイリアス /v1/e に POST し、失敗した場合は indexagentica-mcp.indexagentica.workers.dev の同じパスにフォールバックします(同じ Worker、同じ検証)。Worker は Origin: https://indexagentica.com(HIT_ORIGINS)、512 バイト以下の本文、正確に所定のフィールドを持つ3種類のイベント、サイトが公開しているページの集合に含まれる p、公開インデックスに存在する ID、エントリーが実際にリンクしているホストのみを受け付けます。それ以外は 400 となり、保存されません。/hit には専用のレート制限カウンターがあります(IP あたり同じく 120 回/分)。受け付けたヒットは、別データセット indexagentica_hits(バインディング HITS)、インデックス hit:<event> に保存されます。
| 列 | フィールド |
|---|---|
blob1 | イベント:pageview、click、download |
blob2 | ページパス |
blob3 | エントリーまたはスキル ID(クリック、ダウンロード) |
blob4 | リンク先ホスト(クリック) |
blob5 | ダウンロード種別:zip、skill_md |
blob6 | UA クラス(human/agent) |
blob7 | 国(request.cf から取得) |
blob8 | トラフィック:internal/outside(2026-10-12 以前は空) |
blob9 | 内部判定ルール:header、ua、ip |
blob10 | プローブ(イベントが direct の場合のみ):計上対象のダウンロードでは空、head または bot |
double1 | 1 |
スキルの直接ダウンロード(GET /skills/<id>)
エージェントは curl でスキルを取得し、サイトのビーコンは実行しないため、エージェント向けに公開されているダウンロードリンク(llms.txt、llms-full.txt、/api/longform*.json、MCP get_content リンク)は、次のホストを参照します。
https://mcp.indexagentica.com/skills/<id>.zip および https://mcp.indexagentica.com/skills/<id>/SKILL.md。
Worker(src/downloads.js)は <id> が ^[a-z0-9]+(-[a-z0-9]+)*$(最大64文字)に一致すること、およびサイトの /api/longform.json に公開済みのスキルであることを確認します(10分間キャッシュ)。それ以外は 404 となり、Location は常に DATA_BASE_URL から組み立てられるため、オープンリダイレクトにはなりません。Worker は indexagentica_hits に1行を書き込み(イベント direct、インデックス hit:direct、列は同じ。blob2 はリクエストパス)、Cache-Control: no-store を付けて 302 を返します。HEAD リクエスト、およびクローラー/リンクチェッカー/モニターの User-Agent(BOT_UA_RE)は blob10 に head/bot として保存され、ダウンロードではなく site.direct_downloads.crawlers_and_probes として報告されます。内部トラフィックは通常どおりフラグ付けされます。このルートには専用のレート制限カウンター(dl:)があります。制限を超えてもリダイレクトは機能しますが、リクエストは記録されません。サイト独自の HTML ダウンロードボタンは引き続き静的ファイルにリンクし、クリックビーコン(site.downloads)で計上されます。site.skill_downloads はクリックと直接ダウンロードの合計です。
使用状況統計(GET /stats)
Analytics Engine SQL API を通じて両方のデータセットを集計し、シークレット CF_ANALYTICS_TOKEN(Account Analytics Read)と CF_ACCOUNT_ID を使用します。カウントには
SUM(_sample_interval) を使用します。期間は last_24h、last_7d(ローリング)および all_time です。Analytics
Engine でデータが保持される期間は 3 か月のため、毎日の cron(30 0 * * *)で、完了した各 UTC 日の合計を Workers KV
(STATS_KV、キー day:YYYY-MM-DD)に保存します。all_time は保存済みの日の合計に、まだ保存されていない最初の日からのライブクエリを加算した値です(/stats は不足している日も遅延補完します)。since.mcp_api(リクエストログ記録を開始した最初のデプロイを示す STATS_API_SINCE)と since.site_beacon(ビーコンのデプロイを示す STATS_BEACON_SINCE)は、カウントの開始時点を示します。それ以前のデータは推定も遡及補完も行いません。公開されるのはサーバー独自のツール名のみで、それ以外はすべて unknown_tool になります。レスポンスは 10 分間キャッシュされます(Cache API とインメモリ、Cache-Control: public, max-age=600)。トークンがない場合、エンドポイントは数値を含まない {"status":"collecting", ...} を返します。SQL API が失敗した場合は、503 {"status":"unavailable"} を返します。
各期間では外部トラフィックのみをカウントし、次の項目を追加します。site.downloads.by_skill、site.direct_downloads(合計、zip、skill_md、by_skill、crawlers_and_probes)、site.skill_downloads(合計 = クリック数 + 直接ダウンロード数、全体およびスキル別に {total, clicks, direct})、site.outbound_clicks_by_entry、mcp.top_clients(MCP クライアントが自己申告した名前を小文字に変換し、[a-z0-9._ -] 以外の文字を除去したもの。上位 10 件、3 回以上確認された名前のみ)、top_user_agent_families(ボット名、browser、headless-chrome、または最初の製品トークン。上位 10 件、3 回以上)および internal_excluded(ルール別の除外件数)。KV の各日のデータには集計バージョン(v)が記録されます。古いバージョンのデータは、元データがまだ保持されていれば再計算されるため、ルールの変更は遡及適用されます。遅延補完では /stats の呼び出しごとに最大 2 日分、cron では実行ごとに最大 5 日分を再計算します(1 日あたり約 7 件の SQL サブリクエスト。Workers Free では 50 件まで利用できます)。
内部トラフィック
自社のテスト、モニター、エージェントはログに記録されますが、/stats からは除外されます。次のいずれかのルールに一致する場合、リクエストまたはビーコンは内部トラフィックとして扱われます(src/internal.js)。
| ルール | 一致条件 |
|---|---|
header | X-Indexagentica-Internal: 1(CORS で許可済み。test/e2e.mjs はすべてのリクエストにこれを付与します) |
ua | User-Agent に indexagentica が含まれる(自社のクライアントは indexagentica-<agent>/1 を使用します) |
ip | クライアント IP が、任意のシークレット INTERNAL_IPS(カンマ区切りの IPv4/IPv6)に記載された CIDR の範囲内にある。未設定の場合、自社の共有ボックスは共有リレー範囲内のローテーションするアドレスから送信するため、IP ルールを適用すると無関係なユーザーも除外されてしまいます |
フラグが存在する前(2026-10-12)に記録された行は、自社セッションの署名を使って SQL で遡及的に照合されます(src/stats.js の API_RETRO / HITS_RETRO)。対象となるのは、MCP クライアント名が e2e(自社のテストスイート)の API 行、またはドキュメントに記載された起動・検証時間(2026-10-02 20:15–20:45 および 2026-10-03 04:55–05:50 UTC)内に、US から curl/node/python/headless-Chrome の User-Agent で行われた API リクエストです。また、2026-10-03 05:00–05:50 UTC に US から送信されたサイトビーコンも対象です。これはベストエフォートです。外部トラフィックに見えた内部セッションがカウントされる場合があり、同じ時間帯に一般的なクライアントを使った外部リクエストが除外される場合もあります。
自社のエージェントがサーバーを呼び出す方法:
curl -H 'X-Indexagentica-Internal: 1' -A 'indexagentica-steward/1' https://mcp.indexagentica.com/stats
レート制限
- デフォルト:クライアント IP アドレスごと、Cloudflare ロケーションごとに 60 秒あたり 120 リクエスト。
Workers Rate Limiting バインディング
(wrangler.tomlの[[ratelimits]]。2025 年 9 月から GA。期間は 10 秒または 60 秒である必要があります)を使用します。
意図的に概算です(最終的整合性があり、ロケーションごとに適用されます)。 - バインディングが存在しない場合、またはエラーが発生した場合は、同じ値(
RATE_LIMIT_REQUESTS/RATE_LIMIT_PERIOD_SECONDS)を使う、分離インスタンスごとのトークンバケットに切り替わります。 - 上限を超えると、
Retry-Afterを含む HTTP 429 が返されます。/mcpでは本文が JSON-RPC エラー(-32000)になり、それ以外では JSON エラーエンベロープになります。/healthとOPTIONSは計測対象外です。レスポンスにはx-ratelimit-limit/x-ratelimit-periodが含まれます。 - 留意すべき Free プランの上限:Workers Free では、アカウントあたり 1 日 100,000 リクエスト、リクエストあたり CPU 時間 10 ms が許可されています(上限)。
コールド検索では約 1~3 ms の CPU 時間がかかります(約 135 KB のインデックスを解析)。ウォームリクエストは 1 ms を大きく下回ります。
ローカル開発とテスト
npm install
npm run dev # wrangler dev on http://127.0.0.1:8787 (no Cloudflare login needed)
npm test # unit tests + 2x wrangler dev + E2E (REST, MCP both eras, rate limit) + MCP Inspector CLI
npm run test:unit # pure unit tests (no network)
BASE=https://<deployed-host> npm run test:e2e # E2E against any deployment
DATA_BASE_URL=http://127.0.0.1:8089 npm test # point the local Workers at another copy of the site
詳細な E2E チェックはデータに応じて動作します。公開済みのアイテムがある場合は、REST と MCP を通じて各タイプから 1 つずつ取得します。アイテムがない場合(すべて下書き)は、空の一覧と見つからない場合のパスをチェックします。公開前に一連の処理全体を試すには、下書きを公開した状態でサイトをビルドし(例:サイトリポジトリで INCLUDE_DRAFTS=1 SITE_URL=http://127.0.0.1:8089 node scripts/build.mjs を実行)、そのポートで dist/ を配信して、DATA_BASE_URL を設定した状態で npm test を実行します。
scripts/test-local.sh は通常の Worker を :8797 で、低い上限を設定したコピー(--env ratelimit-test、10 秒あたり 5 リクエスト)を :8798 で起動し、test/e2e.mjs を実行します。その後、デフォルトの legacy era と modern era に固定した設定(protocolEra: "modern")で @modelcontextprotocol/inspector --cli を使ってサーバーをチェックします。
手動チェック:
npx mcp-inspector --cli http://127.0.0.1:8787/mcp --transport http --method tools/list
npx mcp-inspector --cli http://127.0.0.1:8787/mcp --transport http --method tools/call \
--tool-name search --tool-args-json '{"query":"browser automation","limit":3}'
curl -s http://127.0.0.1:8787/mcp -H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_entry","arguments":{"id":"x402"}}}'
クライアントへの接続
claude mcp add --transport http indexagentica https://mcp.indexagentica.com/mcp
JSON 設定(例:Claude Code の .mcp.json。Claude Code ではリモートサーバーに "type": "http" が必要です):
{ "mcpServers": { "indexagentica": { "type": "http", "url": "https://mcp.indexagentica.com/mcp" } } }
その他のクライアントでは、Streamable HTTP に独自の名前を使用します(Cline:"type": "streamableHttp"。"url" だけでよいクライアントもあります)。
設定(wrangler.toml の [vars])
| 変数 | デフォルト | 意味 |
|---|---|---|
DATA_BASE_URL | https://indexagentica.com | /api/index.json の取得元 |
CACHE_TTL_SECONDS | 600 | メモリ内 / Cache API の TTL |
RATE_LIMIT_REQUESTS, RATE_LIMIT_PERIOD_SECONDS | 120, 60 | ドキュメントに記載された上限とフォールバック用バケット([ratelimits.simple] と同期してください) |
ALLOWED_ORIGINS | * | ブラウザーからの呼び出しを許可する Origin のカンマ区切りリスト |
PUBLIC_BASE_URL | リクエストのオリジン | GET / のリンクに使用する正規のベース URL |
CF_ACCOUNT_ID | (なし) | Analytics Engine SQL API(/stats)のアカウント |
STATS_API_SINCE, STATS_BEACON_SINCE | 2026-10-02T20:21:47Z, (デプロイ時刻) | MCP/REST とサイトビーコンのカウントを開始する日時(/stats では since として表示) |
INTERNAL_IPS(シークレット、任意) | (なし) | リクエストが内部トラフィックとしてカウントされる CIDR のカンマ区切りリスト |
HIT_ORIGINS | https://indexagentica.com,https://www.indexagentica.com | POST /hit を許可するオリジン |
シークレット:CF_ANALYTICS_TOKEN(Account Analytics Read)。wrangler secret put CF_ANALYTICS_TOKEN で設定します。
バインディング:ANALYTICS と HITS(Analytics Engine)、STATS_KV(KV)、RATE_LIMITER。cron:30 0 * * *。
デプロイ
独自のコピーを実行するには、SELF_HOSTING.md に従ってください。mcp.indexagentica.com の独自のデプロイに関するメモ(オプションと、必要な Cloudflare/GoDaddy アクセスの詳細)は DEPLOY.md にあります。私たちのデプロイの概要:
export CLOUDFLARE_ACCOUNT_ID=... # from the Cloudflare dashboard
export CLOUDFLARE_API_TOKEN=... # custom token, permissions in DEPLOY.md
npm run deploy:dry # build only
npm run deploy # -> https://mcp.indexagentica.com (custom domain)
# + https://indexagentica-mcp.indexagentica.workers.dev
BASE=https://mcp.indexagentica.com npm run test:e2e
掲載リクエスト
エージェントは、request_listing ツールまたは POST /v1/requests(共通コード:src/requests.js)を使って、不足している掲載項目をリクエストします。
保存先:Cloudflare D1 データベース indexagentica-requests(バインディング REQUESTS_DB、スキーマは migrations/ 内。以下を実行して適用します。
CI=1 npx wrangler d1 migrations apply indexagentica-requests --remote)。
- 検証:
wantedは120文字以下、reasonは500文字以下、requesterは60文字以下、urlは300文字以下で http(s) のみ(認証情報と空白文字は不可)です。 制御文字と双方向テキスト上書き文字は拒否されます。不明なフィールドは拒否されます。本文は4 KiB以下、categoryは現在のカテゴリスラッグまたはotherである必要があります。 - 重複排除:同じ
categoryで正規化後のwantedが同じ(小文字化、アクセント記号と句読点の除去、空白の圧縮、mcp/server/the/tool/skill/api などのフィラーワードの除去)場合、または同じURLのホストとパス(カテゴリを問わない)の場合、既存のリクエストに統合されます。 統合時に1票追加されます。クライアントごと(IPハッシュ単位。IPv6は /64 単位)に最大1票です。最大10件の理由とリクエスト者名が保持されます(管理者ビューのみ)。 - レート制限:クライアントごとに1時間あたり5件、1日あたり20件(IP(IPv6は /48 単位)とUser-AgentのHMACをキーとします)。さらにIPハッシュごとに1日あたり20件です。制限超過時は
Retry-Afterとともに429を返します。 全体の120件/分の制限に加えて適用されます。送信レコードは2日後に削除されます。 - プライバシー:生のIPアドレスは保存されず、シークレット
REQUESTS_IP_SALTを使って切り詰めたHMAC-SHA256のみが保存されます。 - ステータス:
pending→verified→listed(entry_idを含む)、またはrejectedです。公開出力(GET /v1/requests)では、却下された項目は非表示になり、理由とリクエスト者は省略されます。urlはverifiedまたはlistedの項目にのみ含まれます。自社エージェントからのリクエストにはinternalフラグが付きます(管理者ビュー)。 - キュレーション:管理者用ルートには
Authorization: Bearer <REQUESTS_ADMIN_TOKEN>が必要です(シークレット。共有ボックス上のローカルコピーのみとし、コミットはしないでください)。 サイトのリポジトリにはscripts/requests-review.mjs(list / verify / listed / reject / delete)と、content/README.mdに記載されたワークフローがあります。 検証なしに掲載されることはありません。
構成
src/index.js router, CORS, JSON errors, REST endpoints, rate-limit gate
src/mcp.js stateless dual-era MCP JSON-RPC handler
src/tools.js tool definitions (schemas) + implementations shared with REST
src/search.js scoring / filtering
src/data.js fetch + cache of /api/index.json
src/ratelimit.js Workers rate limiting binding + in-isolate fallback
src/openapi.js OpenAPI document for the REST API
src/analytics.js per-request usage logging to Workers Analytics Engine (no-op without the binding)
src/ua.js human (browser) vs agent User-Agent classification
src/hits.js POST /hit: site beacon validation + logging (dataset indexagentica_hits)
src/downloads.js GET/HEAD /skills/<id>.zip|SKILL.md: direct download count + 302 to the site
src/stats.js GET /stats: Analytics Engine SQL aggregation, KV daily rollup (cron), caching
src/internal.js internal-traffic rules (header, UA, optional IP ranges)
src/requests.js listing requests: validation, dedupe, votes, rate limits, D1 queue, admin
migrations/ D1 schema for indexagentica-requests
test/ unit tests, E2E script, Inspector config
docs/ proposed copy for llms.txt, /agents and the directory listing
ライセンス:コードはMIT、ディレクトリのコンテンツはCC BY 4.0です。
レジストリのメタデータ
server.json:公式MCP Registryエントリー(com.indexagentica/mcp、スキーマ 2025-12-11)。mcp-publisher validateで検証済みです。公開にはhttps://indexagentica.com/.well-known/mcp-registry-authに対するHTTPドメイン認証を使用します。エンドポイントが稼働した後に行う、別途手動の手順です。glama.json:Glamaの所有権申請(メンテナーDrudley)。llms-install.md:Clineなどのエージェント駆動型インストーラー向けのインストール手順です。
ライセンス
コードはMITです。ツールが提供するディレクトリのコンテンツはCC BY 4.0です。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。