Skip to main content
Glama

curseforge-ark-mcp

ARK: Survival Ascended 向け CurseForge の Mod キュレーション、発見、アップデート監視のための読み取り専用 MCP サーバー。

これはまだ v0 です — 部分的に検証済み、未検証。

2026-08-18 の変更点: CurseForge API キーが届き、クライアントが初めて認証付き呼び出しを行い、読み取るすべての Mod および File フィールドパスがライブレスポンスに存在することが確認されました。修正は不要でした。 サンプル: 748 個の個別の ARK: Survival Ascended Mod、1899 件のファイルレコード。

なぜまだ v0 なのか。 4 つの点が未確認であり、そのうち 1 つは確認しようがありません。

  • FileDependency のエッジ形状 は一度も観測されていません — サンプリングした 1899 件の ASA ファイルのうち、依存関係を宣言したものは 0 件で、dependencies 配列は毎回存在するものの空でした。

  • FileRelationType の整数値は未公開であり、このカタログでは使用されていません。

  • FileReleaseType の整数値 1、2、3 は確認されました。どれがリリース、ベータ、アルファを意味するかはまだ不明であり、このサーバーは推測しません。

  • ベンダーによる一括読み取り ID 配列の上限: 300 ID までは見つからなかったため、不明です。

部分的に検証されたクライアントは検証済みではありません。バージョン番号は検証状態に関する主張であるため、0.2.0 です — 1.0.0 ではなく、意図的に 1.0.0-anything でもありません。

このリポジトリ自体の動作は API とは独立して検証されています。エンドポイント許可リスト、ホスト固定、パス正規化、ページネーション境界、エンベロープ処理、および 3 状態(不在/空/不明)の規律。これらすべては、キーもネットワークもない、注入された偽の fetch に対してテストされています。執筆時点で 156 テスト、0 失敗。

設計記録: docs/adr/ADR-002-endpoint-allow-list.md (ステータス: PROPOSED)。以下のセクション参照 (§1、§4.3、§14.3 …) はすべてそこを指しています。


Related MCP server: neoforge-kb-mcp

できること、そして意図的にできないこと

7 つのツール、すべて読み取り専用:

ツール

回答

search_mods

「この用語に一致する ASA Mod はどれ?」

get_mod

「プロジェクト 777001 は何?」

list_mod_files

「この Mod はどのファイルを公開している?」

get_mod_file

「この特定のファイルは何?」

get_latest_file

「今実行しているファイルよりも新しいバージョンはあるか?」

resolve_mod_dependencies

「この Mod は何を引き込むか?」(バッチ処理、ツリーレベルごとに 1 リクエスト)

get_api_diagnostics

「問題は私か、キーか、それとも CurseForge か?」— そして「このビルドはどの程度正直か?」

できないこと:

  • 何もダウンロードまたはインストールしない。 GET /v1/mods/{modId}/files/{fileId}/download-url は文書化された読み取りであり、固定ホスト上にありますが、拒否されます — エンドポイント許可リストにないためです (DEC-002 §11.3)。Nitrado は自身で Mod をインストールします。

  • どこにも書き込まない。 許可リストのエントリは変更エンドポイントを指定していません。CurseForge は別のホスト上で変更アップロード API を運用しています (§14.2)。ホスト固定は独立した理由でそれを二度拒否します。

  • Mod を公開または作成しない。 完全に拒否されます (DEC-002 裁定 2)。約束ではなく起動アサーションによって強制されます。ティア 1 以外を宣言するツールを登録すると、プロセスは起動を拒否します。

  • Nitrado に触れない。 このリポジトリの構成面には NITRADO_* 変数は存在せず、その不在は制御です。このサーバーは Nitrado トークンを保持せず、Nitrado 設定を読み取りません。

  • タイマーで起動してサーバーを更新しない。 スケジューラ、ポーリングループ、永続化された「最終確認バージョン」状態はありません (§10)。監視とは、モデルが新しいバージョンを観測できることを意味します。行動することはできません。


チョークポイント: メソッドチェックではなくエンドポイント許可リスト

コードに触れる前に読む価値のある設計上の決定はこれだけです。

CurseForge は 読み取りに POST を使用します。POST /v1/mods と POST /v1/mods/files は一括取得であり、これにより resolve_mod_dependencies は依存関係ノードごとではなく、依存関係レベルごとに 1 リクエストで済みます。したがって、兄弟リポジトリの method !== "GET" → refuse はここで最も高くつく方法で失敗します: それは動作します。 拒否し、自身のテストに合格し、静かにサーバーを仕事に不適切にします。

そして明白な修正はバグよりも悪いです:

allowed = { GET }          → the batch reads are refused (broken, loudly)
allowed = { GET, POST }    → every request this client can construct is allowed

文書化されたカタログ API には GET と POST のみが含まれています。両方を受け入れるゲートはすべてを受け入れます — 見た目はそのままに。

その代わり、すべての送信リクエストは、閉じた {method, path} ペアのリスト内の明示的なエントリと一致する必要があります。7 つのエントリ、src/allowlist.ts 内:

#

Method

Path

提供するもの

E1

GET

/v1/games

ゲーム ID 解決、get_api_diagnostics

E2

GET

/v1/mods/search

search_mods

E3

GET

/v1/mods/{modId}

get_mod、get_latest_file

E4

GET

/v1/mods/{modId}/files

list_mod_files、get_latest_file

E5

GET

/v1/mods/{modId}/files/{fileId}

get_mod_file

E6

POST

/v1/mods

resolve_mod_dependencies (一括読み取り)

E7

POST

/v1/mods/files

resolve_mod_dependencies (一括読み取り)

機械的には:

  • {method, path} で共同一致。 E3 は DELETE /v1/mods/123 を許可しません。E6 は POST /v1/mods/123 を許可しません。

  • ホストは固定 されて https://api.curseforge.com に固定され、その固定は名前付きの他を拒否するのではなく、1 つのオリジンを許可するものです。

  • ID セグメントは [0-9]+ にバインド され、[^/]+ ではありません。これは負荷がかかります: 寛容な {modId} は E3 が /v1/mods/search を飲み込む原因になります。数値バインディングにより、その曖昧さは一致順序に依存するのではなく構造的に不可能になります — そしてリスト全体を逆にして順序が救いにならないことを証明するテストがあります。

  • チェックの前に 1 回の正規化 が行われ、URL はその出力から構築されます。パーセントデコードを 1 回行い、残った % を拒否します。バックスラッシュを折りたたみます。.、..、空のセグメントを拒否します。

  • E6/E7 のみがボディを持つことができ、ディスパッチ前に形状チェックされます。GET エントリのボディは拒否され、ドロップされません。

  • resolve_mod_dependencies のみが POST エントリに到達できます (§8)、トランスポートで強制されます。

障害モードは「一致しないリクエストは拒否される」であり、「認識されないリクエストが送信される」ではありません。 機能を追加することは、レビュー可能な 1 行の差分であり、そのレビューの質問 — 「このエンドポイントは読み取りか?」 — は人間が実際に答えられるものです。

それが許可リストであることを証明するテスト

GET /v1/mods/{modId}/files/{fileId}/download-url は 拒否されます。文書化された読み取りであり、GET であり、固定ホスト上にあり、適切な形式の数値 ID を持っています。リストにないという理由だけで拒否されます。そのテストが他の理由(ホスト固定拒否、パス拒否)で合格した場合、そのプロパティは実装されていないため、テストは単に何かがスローされたことではなく、拒否のコードと詳細をアサートします。

すべての拒否テストは、偽の fetch の呼び出し回数もアサートします。なぜなら、「リクエストが構築される前に拒否される」が実際の規定であり、ディスパッチ後にスローされたエラーはより弱いアサーションを満たすからです。そして拒否スイートの前には原像テストがあり、7 つのエントリすべてがディスパッチすることを証明します — 何も送信できないクライアントに対する拒否スイートは完全に合格し、何も証明しません。


ライブ API に対して検証済み — 2026-08-18

サンプル: 748 個の個別の ASA Mod、1899 件のファイルレコード。深い検索ページ (インデックス 1000-6000) と、文書化されたすべての sortField 1-12、さらに 100 個の Mod の完全なファイルリストから抽出。日付とサイズは意図的に付けられています。「検証済み」はサンプルサイズなしでは気分であり、主張ではありません。

#

主張

結果

U1

ASA の gameId

83374、スラッグ ark-survival-ascended、名前 ARK Survival Ascended — コロンなし。完全一致のスペルでは間違っていたでしょう。それでも毎回起動時にライブ解決されます。テストでは、その数値が src/ 内のコメント以外に出現しないことをアサートします。

U2

ASA はキーから見えるか?

はい。 38 のゲームが見え、ASA もその中に含まれます。v1 ブロッキングではありません。

U3

Mod フィールドパス

すべて正しい。 id、gameId、name、slug、dateModified、links.websiteUrl、categories、allowModDistribution、latestFiles、latestFilesIndexes。

U4

File フィールドパス

すべて正しい。 id、modId、displayName、fileName、fileDate、gameVersions、sortableGameVersions、dependencies、releaseType、isAvailable。

U8

pagination の存在

ページネーション付きエンドポイント (games、search、files) には存在し、単一レコードおよび一括読み取りには存在しない — これはこのクライアントが期待するまさにその分割です。

U9

ASA Mod はオプションフィールドを埋めるか?

latestFiles、latestFilesIndexes、sortableGameVersions、gameVersions: 300/300。dependencies: 100% に存在するが、空でないのは 0%。

U11

レート制限ヘッダー

CurseForge は送信しない。 ライブ GET および POST での完全なヘッダー列挙により、トランスポート/CDN ヘッダーのみが見つかりました。したがって、null はこのクライアントのバグではありません — しかし、制限が存在しないという主張ではなく、自己課されたペーシングは維持されます。

U12

インデックス 0 を超えるページネーション

動作します。totalCount はページ間で 6848 で安定しています。しかし、結果セットの終わりを超えると、CurseForge は resultCount: 0 および totalCount: 0 を返します — totalCount はクエリではなくレスポンスを記述します。ツール出力は「何も見つからなかった」と読ませるのではなく、「終わりを超えた」と言うようになりました。

U13

ベース URL

正しい。ホスト固定は健全です。

修正が必要なフィールドパスはありません。 これは自慢ではなく、結果として記録されています。子リポジトリのコミット 5481c04 は、初めて本番環境で呼び出された日に3つの誤ったパスを修正しました。その前例があるからこそ、ここでは各パスを信頼するのではなく、一つずつチェックしています。

まだ検証されていないもの

縮小はしましたが、消えてはいません。以下は、本番APIとの接触を生き残った行です。

#

主張

ステータス

未解決の理由

U5

FileDependency = { modId, relationType }

未観測

誤りが示されたわけではない — 全く見られていない。サンプル内のASAファイルは依存関係を宣言していなかったため、エッジオブジェクトは一度も検査されていません。形状はドキュメントから導出されたもので、テストフィクスチャにのみ存在します。

U6

FileRelationType 数値列挙型

未公開 かつ ここでは観測不可

dependencies は748のMODにわたる1899ファイルすべてに存在したが空だったため、関係性の整数は一度も出現していません。ADR-002はこれを予測し、その結果を命名しました。マッピングされていない整数の走査は、暫定的な対応ではなく、答えそのものです。実際の影響:ASAでは、resolve_mod_dependencies は単一ノードのツリーを返し、出力でその旨を明示するため、空のツリーが失敗と読まれることはありません。

U7

FileReleaseType 数値列挙型

値は確認されたが、意味は不明

観測された値:1 (1893ファイル)、2 (3)、3 (3)。少なくとも3つのメンバーが存在し、Upload APIのアルファ/ベータ/リリースの3つ組と一致しますが、どの整数がどれに対応するかについての証拠は全くありません。頻度分布は値のテーブルではありません。1 = リリース と推測することは、このリポジトリが存在する目的自体が拒否する推測です。

U10

ベンダーによる一括読み取りID配列の上限

300までは上限なし

200個の異なるIDは200レコードを返し、300個は300を返しました。したがって、上限があるとしても300を超えています。このクライアントの200ID上限は維持されます。それは私たち側の、文書化されていないレート制限に対して意図的に慎重な上限であり、上限が見つからなかったプローブはまだ上限を見つけていません。

ツールの出力に見られる2つの結果

relationType と releaseType は生の整数として表示され、マッピングされることは決してありません。 required/optional にも、release/beta/alpha にもマッピングされません。CurseForgeはどちらについても値のテーブルを公開しておらず、誤ったラベルを付けると、誰も確認しない方法で間違った依存関係リストやアップデート推奨を生成することになります。したがって、resolve_mod_dependencies は すべての エッジを辿り、その旨を明示します。過剰に収集 し、その出力はそれを明白に述べます。広い網は少なくとも視覚的に広いのです。

特にASAに関しては、ライブカタログによって、ツールを使用する前に知っておく価値のある方法で、この問題は無意味になります。サンプリングされたASA MODは、依存関係を全く宣言していません。 単一ノードのツリーは、壊れた走査の症状ではなく、期待される結果であり、ツールの出力はそれがどちらであるかを示します。

get_latest_file は、「最新」の意味を指定する必要があります。 fileDate による最新、ゲームバージョンに一致する最新、特定の releaseType を持つ最新は 異なる答え を返し、間違った基準で行われたMODアップデートの決定は、まさにこのリポジトリが対策を講じている「自信を持って間違った答え」のクラスに該当します。selection には デフォルト値がありません:

selection

同時に必須のパラメータ

意味

newest_by_file_date

—

すべての候補ファイルの中で、fileDate が最新のもの

newest_matching_game_version

game_version

そのゲームバージョンを宣言している最新のファイル

newest_with_release_type

release_type(生の 整数 )

そのリリースタイプの整数を持つ最新のファイル

release/beta/alpha という名前付きフィルターはありません。なぜならU7が未解決であり、このサーバーはマッピングをでっち上げないからです。目的の整数を渡してください。

この定義は未解決のプロダクト質問です。 ADR-002の未解決質問2は、これが本サーバー構築時には決定されていなかった創設者の決定であることを示しており、そのためツールは意見を持つ形ではなくパラメータ化されています。答えが得られた時点で、それはデフォルト値になるか、またはバリアントの数が一つ減るかです — 書き換えではなく小さな変更です。各応答は、使用した順序、フィルタリング条件、検討した候補の数、候補の出所を再述します。


セットアップ

Node 20+(開発は22で実施)。設定すべきビルド手順はありません。npm test が先にビルドします。

npm install
npm test          # builds, then runs the suite — no key, no network, nothing live
npm run typecheck
npm run smoke     # LIVE once a key is configured; refuses cleanly and probes nothing without one

npm run smoke はヘルスチェックではなく、反証の実行です。キーがあれば、§14.3のレジスタを行ごとに走査し、観測した内容を出力します。キーがなければ、実行したであろうすべてのプローブを列挙して、何も送信せずに終了コード0で終了します。テストスイートはどちらの場合もネットワークに触れません。

MCPクライアントの設定(stdio):

{
  "mcpServers": {
    "curseforge-ark": {
      "command": "node",
      "args": ["C:/path/to/curseforge-ark-mcp/dist/src/server.js"],
      "env": { "CURSEFORGE_API_KEY": "your-key" }
    }
  }
}

サーバーはキーなしでは起動を拒否し、検索した2つの場所、正確な変数名、およびキーがセルフサービスではないという事実を出力します。正常に起動してから7つすべてのツールで例外を投げるstdio MCPサーバーは、デバッグが非常に困難です。

キーについて

APIキーは x-api-key リクエストヘッダーとして送信されます。これは Authorization: Bearer トークンではありません — それは子リポジトリのNitradoサーバーの方式であり、このリポジトリは意図的に両方をサポートしていません。両方をサポートすると、このコードがCurseForgeが文書化していない形式で資格情報を送信する可能性があるからです。

キーは アプリケーション単位でOverwolfから付与され、譲渡不可です。 実際的な結果、およびこの段落が存在する唯一の理由:漏洩した場合、失効させて再申請する必要があり、再申請はキュー待ちであり、セルフサービスでのリセットはできません。 コーヒーを飲みながら再生成することはできませんし、他人のものを借りることもできません。それに応じて扱ってください — .env はgitignoreされ、.env.example は変数名と空の値を持ち、どのコミットされたファイルにもキーの値は含まれません。

このリポジトリにはスコープマトリックスはありません。それは見落としではありません。 CurseForgeは読み取り専用スコープもスコープ選択も公開していないため、マトリックス化するものがないのです。このサーバーの読み取り専用プロパティは、より狭い資格情報ではなく、独自のエンドポイント許可リストに由来します。また、トークン漏洩のためのランブックもありません — 漏洩したキーは、公開カタログへの読み取りアクセスとクォータ消費を許可します。これは現実の問題であり、子リポジトリのNitradoトークン(ゲームサーバーの完全な制御と同等と文書化されている)とは同じカテゴリではありません。この適切なサイズ設定はADR-002 §12で議論されており、そこで述べられた一つの主張に基づいているため、反証可能です:CurseForgeカタログデータは、設計上公開されています。

編集、すべてのもの

一つのルール:APIキーを決してエコーバックしない。 一つの関数 src/scrub.ts が、エラーメッセージおよび上流の任意のボディスニペットに適用されます。リクエストヘッダーはエラーに決して現れません — キーも、編集されたキーも、ヘッダー名のリストも含めて。get_api_diagnostics はキーが設定されているかどうかを報告し、その値、そのプレフィックス、またはその長さを決して報告しません。


出力を読む前に知っておくべき動作

  • 空は不明ではありません。 data: [] はCurseForgeが「なし」と答えたことを意味します — 本当の答えであり、何が何も返さなかったかを確認できるようにクエリがエコーされます。存在しないフィールドは null であり、決して 0、""、[] ではありません。完了しなかったリクエスト、または形状が間違っているレスポンスは エラー であり、値ではありません。

  • data キーの欠落はエラーであり、空の結果ではありません。 それを強制的に [] にすると、壊れた統合が「結果が見つかりませんでした」に変わってしまいます。

  • ページネーションのあるエンドポイントでの pagination の欠落もエラーです。 1ページだけを仮定することは、ツールが900のMODのうち50を全てであるかのように報告する方法です(U8はまさにこの未解決の質問です)。

  • pageSize > 50 は拒否され、切り詰められることはありません。同様に、index + pageSize > 10000 も拒否され、そのインデックスでの最大の有効なページサイズがメッセージに記載されます。200を要求して黙って50を受け取ったモデルは、ページがあたかもセットであるかのように推論することになります。

  • totalCount が10000を超える場合、ツールの出力は末尾が REACHABLE NOT であると、その言葉で述べ、ページングではなくフィルターを絞り込むようアドバイスします。

  • ASA gameId は実行時に GET /v1/games から検出され、プロセスの寿命の間キャッシュされます。ハードコードされることも推測されることも決してありません。解決できない場合、サーバーは何を検索したか、キーがいくつのゲームを見ることができるかを明示して、大きく失敗します。なぜなら gameId は 必須の 検索フィルターであり、間違った値はエラーの代わりに、きれいで空で、完全に間違った結果を返すからです。組み込みの候補が間違っていることが判明した場合は、CURSEFORGE_GAME_SLUG を設定してください。

  • resolve_mod_dependencies には上限があります、深さ4、ノード数400で、循環のための訪問済みセットがあります。上限に達した場合、結果は truncated という単語で報告され、未探索のフロンティアがリストされます。


リポジトリレイアウト

src/
  allowlist.ts    THE CHOKEPOINT — seven entries, host pin, normalization, bounds, body checks
  client.ts       the single transport; the ONLY place x-api-key is attached; envelope unwrap
  config.ts       refuse-to-start; no NITRADO_*, no mode switch, no settable base URL
  coerce.ts       empty / absent / unknown, kept apart
  errors.ts       the error taxonomy
  game.ts         runtime gameId resolution (injected, process-lifetime cache)
  registry.ts     ToolDef + tier, and the boot assertion that refuses a non-tier-1 tool
  scrub.ts        never echo the key. That is the whole module.
  probe-plan.ts   one probe per unverified row, asserted complete by a test
  server.ts       stdio entry point
  smoke.ts        the falsification run (live with a key, plan-only without)
  tools/          the seven tools
test/             156 tests; fixtures are synthetic in content, structural in shape
scripts/          buildinfo generator, test enumerator

src/buildinfo.ts は 生成され、gitignoreされており、tsc 実行のたびにコミットと dirty フラグがスタンプされ、get_api_diagnostics によって公開されます。dist/ はgitignoreされており、サーバーはそこから長時間稼働プロセスとして実行されるため、「どのコードがその答えを生成したか?」は実行時に git からは答えられません — それはアーティファクトと一緒に移動する必要があります。

子リポジトリからの逸脱、意図的に述べる

ADR-002の未解決質問7と8は、これらが発生する場所で名前を挙げるよう求めています。

  • 同じベースライン、意図的に。 Node ≥20、TypeScript 5.9.3、@modelcontextprotocol/sdk 1.30.0、zod 4.4.3、同じ scripts/run-tests.mjs 列挙子を介した node:test。同じレビューア、同じイディオム、両方を読むコストを低減します。

  • @cfworker/json-schema はここでは依存関係ではありません。 これは子リポジトリのcron式検証を支えていますが、ここには検証する書き込みパスはありません。

  • registry.ts は構造的に移植され、tier を維持しますが、モード/有効化リストの仕組みは削除します — フィルタリングするものが何もないからです。すべてのツールはティア1であり、すべてのエンドポイントは読み取りです。背後に何もないモード変数は、存在しない制御を宣伝することになります。1つの5行の起動アサーションがサブシステムを置き換えます。

  • redact.ts は移植されていません(§12.1)。上記「編集、すべてのもの」を参照してください。

  • UNKNOWN_OUTCOME エラーコードはありません。 子リポジトリがそれを必要とするのは、PUT への応答が失われても世界が変わっている可能性があるからです。このクライアントが行うことができるすべてのリクエストは読み取りであるため、タイムアウトは本当に「それは起こらなかった」ことを意味し、再試行は安全です。

  • npm run smoke は、キーがないために拒否した場合、終了コード0で終了します。 拒否は今日それを実行した場合の期待される結果であり、バナーは SMOKE NOT RUN と見逃しようがなく表示されます。パイプラインをキーがない場合に失敗させたい場合は、この終了コードではなく、キー自体でパイプラインをゲートしてください。


関連レコード

兄弟リポジトリ nitrado-ark-mcp について — ここからは読み取り専用です。そのリポジトリ内のものは、このリポジトリによって一切変更されていません。

  • docs/decisions/EXECUTIVE-BOARD-2026-08-16-curseforge-mods.md — このリポジトリが実行する役員会議事録(DEC-002)。その議長裁定は拘束力を持ちます。

  • docs/decisions/decision-log.md — DEC-002、および§10の根拠となるスコープ分割に関するDEC-001。

  • docs/adr/ADR-001-write-path-enforcement.md — ADR-002が移植する形状、正規化ルール、起動時チェックの論拠、そして起動拒否の論拠の出典。

2つのサーバーは独立したままです。nitrado-ark-mcp は "これらのプロジェクトIDは active-mods に含まれている" に回答し、このリポジトリは "プロジェクトXの最新ファイルは v2.1 です" に回答します。モデルは両方を保持します。どちらのサーバーも他方を呼び出さず、どちらも他方の認証情報を保持することは決してありません。

Available Tools

8 tools
get_api_diagnosticsDiagnose this server's CurseForge connection and honesty postureA

Answers 'is it me, the key, or CurseForge?' in one call: whether a key is configured (never the key itself, nor a prefix, nor its length), whether GET /v1/games succeeded, which ARK: Survival Ascended gameId was resolved and how, which commit this build came from and whether that build was dirty, what the endpoint allow-list currently permits, and any rate-limit headers a real response actually carried. It also reports the VERSION POSTURE: this is v0 and every field path in every tool is a hypothesis. Run this first when other tools behave strangely. Read-only.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the behavior-disclosure burden. It declares the tool is read-only, states that it never reveals the key, prefix, or length, and even discloses the v0 hypothesis posture where field paths may be unreliable. This is unusually transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long and dense, but nearly every clause adds a distinct diagnostic detail or caveat. It is front-loaded with the core question the tool answers. A slightly shorter or more list-like structure would improve scannability, but there is minimal wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter diagnostic tool with no output schema, the description enumerates the reported areas comprehensively: key presence, API call success, gameId resolution, build metadata, allow-list, rate-limit headers, and version posture. It lacks an exact output format example, but the high-level coverage is sufficient for an agent to invoke and interpret the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is an empty object, so the description cannot add parameter-level semantics. The baseline for a no-parameter tool is 4, and the description appropriately focuses on what the diagnostic returns instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific diagnostic verb and resource: it answers 'is it me, the key, or CurseForge?' in one call and enumerates exactly what it reports. The title and description clearly distinguish it from the sibling mod-focused tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit guidance: 'Run this first when other tools behave strangely.' This provides a clear trigger condition for use. It does not spell out when not to use it, but the diagnostic scope makes that exclusion unnecessary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_latest_fileGet a mod's newest file, by a stated definition of newestA

Answers 'is there a newer file for this mod than the one I am running?' Default selection is 'newest_by_file_date' (founder decision 2026-08-18). The other definitions still give different answers: 'newest_matching_game_version' restricts to files declaring a game version and then orders by fileDate; 'newest_with_release_type' restricts to a releaseType INTEGER you supply and then orders by fileDate. There is no named release/beta/alpha filter because CurseForge publishes no value table for that integer (ADR-002 §14.3 U7) and this server will not invent one. Every answer restates the ordering used, whether the default was applied, the filter applied, how many candidates were considered, and where the candidates came from. The matched file includes file_length_bytes; inspect that and file_name before treating it as a content pack. Read-only.

NameRequiredDescriptionDefault
mod_idYesCurseForge numeric mod (project) id.
selectionNoWhich question you are asking. Defaults to newest_by_file_date. These give different answers; pass another variant only when that is the question you mean.newest_by_file_date
game_versionNoRequired when selection is 'newest_matching_game_version'. The game version string a candidate file must declare. This server does NOT and MUST NOT learn your server's version from Nitrado (ADR-002 §9) — you supply it.
release_typeNoRequired when selection is 'newest_with_release_type'. The raw releaseType integer a candidate must carry. Unmapped on purpose: CurseForge publishes no value table, so pass the integer you mean rather than a label this server would have to guess.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden, and it does so thoroughly. It declares Read-only, explains what every answer restates, notes the file_length_bytes caveat, and explains the deliberate refusal to invent release-type labels. There is no annotation to contradict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well organized: it front-loads the core question, then explains each selection mode and the caveats. Some internal references like 'ADR-002 §14.3 U7' add context but are slightly esoteric, keeping this from a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains what the answer will contain: the ordering, default application, filter, candidate count, and candidate source. It also draws attention to file_length_bytes and file_name for content-pack inspection, so an agent has enough to invoke and interpret the call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, so baseline 3 applies. The description reinforces parameter requirements but largely restates schema details such as 'Required when selection is...' and 'pass the integer you mean.' It adds useful context but does not need to compensate for missing schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the exact question the tool answers and identifies the resource: a mod's newest file by a defined notion of 'newest.' It explains that there are three selection definitions and names the default, so an agent can clearly distinguish this from list_mod_files or get_mod_file.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit guidance on when to use the default versus the other selection variants, stating 'pass another variant only when that is the question you mean.' It also documents the required conditions for the non-default variants and explains why a named release-type filter cannot exist.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_modGet one mod recordA

Fetch a single CurseForge mod (project) record by numeric id: name, slug, author summary, raw status integer, created/modified/released dates, website link, and its latestFiles with file length in bytes and raw releaseType integers. A record is a catalog row, not an install recommendation — inspect file_name and file_length_bytes. This is a single-record endpoint, so it carries no pagination and none is invented. Read-only. v0: all field paths unverified.

NameRequiredDescriptionDefault
mod_idYesCurseForge numeric mod (project) id. Digits only — the allow-list will not match anything else.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden. It explicitly states 'Read-only', explains the absence of pagination, warns that the record is a catalog row rather than an install recommendation, and flags 'v0: all field paths unverified' as an important caveat. It does not mention error behavior or auth needs, but this is a simple single-record read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence contributes: the field list, the catalog-vs-install clarification, the no-pagination note, the read-only flag, and the v0 caveat. It is front-loaded with the core action and resource, with no redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read endpoint with no output schema, the description explains the expected return content, clarifies the semantic meaning of the record, rules out pagination, and discloses version uncertainty. An agent has enough information to select and invoke the tool correctly, and to interpret what it gets back.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents mod_id as a CurseForge numeric mod id with a minimum, maximum, and digits-only note. The description adds only the phrase 'numeric id', which does not meaningfully extend the schema. Baseline 3 is appropriate because the structured schema handles the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch a single CurseForge mod (project) record by numeric id.' It enumerates concrete returned fields and explicitly contrasts itself with list/search endpoints by calling itself a single-record endpoint, making sibling differentiation clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: this is the tool to use when you have a numeric mod id and need one catalog record. It also clarifies that pagination is not applicable, which prevents incorrect assumptions. It stops short of explicitly naming alternatives like search_mods or get_mod_file for when a different tool should be chosen.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mod_fileGet one mod file recordA

Fetch a single file record for a mod by numeric mod id and file id: display name, file name, file date, file_length_bytes, game versions, raw releaseType integer, and dependency edges with raw relationType integers. Inspect file_name and file_length_bytes before treating a file as a content pack. NOTE: this tool does NOT return a download URL. The download-url endpoint is deliberately absent from this server's endpoint allow-list (DEC-002 §11.3) — this server curates and reports, it never downloads or installs. Read-only. v0: all field paths unverified.

NameRequiredDescriptionDefault
mod_idYesCurseForge numeric mod (project) id. Digits only — the allow-list will not match anything else.
file_idYesCurseForge numeric file id.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description correctly carries the full burden of behavioral disclosure. It explicitly states the tool is read-only, intentionally returns no download URL, and will never download or install. The v0 caveat that all field paths are unverified is valuable transparency about reliability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and returned fields, then provides caveats. Each sentenced earns its place: content-pack inspection, no-download-URL policy, read-only, and v0 unverified note. The DEC-002 citation is slightly verbose for a tool-calling agent but not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no annotations and no output schema, the description supplies the needed context: purpose, key parameters, returned field names, raw-integer encodings, read-only behavior, the download-URL absence, and reliability caveat. Its main gap is not explicitly routing to sibling tools, which was already penalized under usage guidelines.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and both parameters already have meaningful descriptions ('CurseForge numeric mod project id. Digits only...' and 'CurseForge numeric file id.'). The description only restates that the IDs are numeric and adds no substantive parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb ('Fetch') and resource ('a single file record for a mod'), and specifies the exact keys (numeric mod id and file id). This clearly distinguishes it from list_mod_files and get_latest_file in the sibling set, even without naming them. The title reinforces the singular, ID-based scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: fetch one known file by IDs, inspect file_name and file_length_bytes before treating a file as a content pack, and do not use it when a download URL is needed because it explicitly does not return one. It stops short of naming specific sibling tools for enumeration or latest-file selection, so it is not a 5, but it is far above implied usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_categoriesList ARK: Survival Ascended classes and categoriesA

List CurseForge classes and categories for ARK: Survival Ascended. Use this BEFORE search_mods when you need class_id, category_id, or exclude_category_ids — those integers are discovered here, never hardcoded. gameId is resolved at runtime and is not a parameter. Optional class_id narrows to categories under one class; classes_only returns only top-level classes. The documented response is a single array (no pagination object). Read-only.

NameRequiredDescriptionDefault
class_idNoRestrict to categories under this class id. Discoverable from a classes_only call.
classes_onlyNoWhen true, return only top-level classes for the game, not every nested category.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and meets it: it declares read-only, discloses the response shape ('single array (no pagination object)'), and flags the runtime-discovery nature of the returned IDs. It doesn't cover error/rate-limit/auth behavior, but for a read-only list endpoint the disclosed traits are the meaningful ones.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place: purpose, when-to-use, param behavior, response shape. The routing guidance is front-loaded and there is zero filler or repetition of schema text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-optional-param, read-only list tool with 100% schema coverage and no output schema, this is nearly complete: purpose, sequencing, param semantics, and pagination behavior are all covered. The only gap is the shape of the returned category/class objects (e.g., which fields besides ids are present), which an agent would need when building exclude lists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds genuine cross-tool meaning: it explains why class_id matters (to feed search_mods include/exclude params), that values must be discovered at runtime rather than hardcoded, and that gameId is intentionally absent. That's more than the schema's 'Restrict to categories under this class id' provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: 'List CurseForge classes and categories for ARK: Survival Ascended'. It separates itself from siblings directly by naming search_mods as the tool that consumes these IDs, and its subject (classes/categories) is distinct from list_mod_files/get_mod. An agent can tell what it does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit sequencing guidance: 'Use this BEFORE search_mods when you need class_id, category_id, or exclude_category_ids — those integers are discovered here, never hardcoded.' It also prunes a likely mistake by stating gameId is resolved at runtime and not a parameter, so the agent won't hunt for a nonexistent gameId param.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_mod_filesList a mod's filesA

List the published files for one mod, paginated. Each file carries its raw releaseType integer, its game versions, file_length_bytes, and its dependency edges with raw relationType integers — none of those integers is mapped to a label, because CurseForge publishes no value table for either. Inspect file_name and file_length_bytes before treating a file as a content pack. Page size is capped at 50; an over-large request is refused rather than clamped. Read-only. v0: all field paths unverified.

NameRequiredDescriptionDefault
indexNoZero-based offset. index + page_size <= 10000.
mod_idYesCurseForge numeric mod (project) id. Digits only — the allow-list will not match anything else.
page_sizeNoAt most 50. Over that is refused, not clamped.
game_versionNoFilter to files supporting this game version string. UNVERIFIED (§14.3 U9).

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though no annotations are provided, the description discloses several important behaviors: integers are raw and unmapped, page size is capped at 50 and over-large requests are refused rather than clamped, and the tool is read-only. It also warns about inspecting file_name and file_length_bytes before treating a file as a content pack, and flags the v0 field-path verification status. This goes well beyond minimal behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with dense information and no filler. It front-loads the core purpose, then provides the most important caveats. It could arguably be split for readability, but each clause carries meaningful detail. The final 'v0' note is a valuable trust signal rather than noise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description fills in the most important gaps: raw integer behavior, the 50-item cap, refusal rather than clamping, and read-only status. It lacks explicit return-value shape details, but with pagination and field names mentioned, an agent can infer the entry structure. Sibling tools like get_mod_file might provide the targeted-file alternative, but the description is sufficient for deciding when to call this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers 100% of parameters with descriptions. The tool description complements this by explaining the key semantics of page_size (refused rather than clamped) and the raw integer caveat for the values returned. It doesn't redundantly repeat every parameter, but it adds meaningful context about how the parameters affect behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('List'), a resource ('published files for one mod'), and the pagination aspect. Distinct from siblings like get_mod_file or get_latest_file because it covers all published files for a mod rather than a single targeted file. It also clearly contrasts read-only behavior without any ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates when to use this tool — when you need all published files for a mod, with pagination and dependency metadata — versus siblings like get_latest_file or get_mod_file which focus on specific files. It does not explicitly name alternatives, but it explains what this tool uniquely provides. The field-path caveat at the end ('v0: all field paths unverified') gives honest guidance about trust.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_mod_dependenciesResolve a mod dependency tree (batched)A

Walk the dependency graph of one or more mods breadth-first, issuing ONE bulk POST per level rather than one GET per node. Returns every reachable mod with the raw relationType integer on each edge. IMPORTANT: this OVER-COLLECTS. CurseForge publishes no value table for relationType (ADR-002 §14.3 U6), so required, optional, tool and incompatible edges cannot be told apart and ALL are followed. Bounded at depth 4 and 400 nodes; when a bound is hit the result is reported as TRUNCATED with the unexplored frontier listed, never silently cut. Read-only. v0: all field paths unverified.

NameRequiredDescriptionDefault
mod_idsNoSeed mod ids. At least one of mod_ids or file_ids is required. At most 200.
file_idsNoSeed FILE ids, resolved through POST /v1/mods/files to find the mods they belong to before the walk begins. Use this when you know which file you are running. At most 200.
max_depthNoHow many levels to walk. Default and maximum 4.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and succeeds: it discloses read-only behavior, highlights over-collection with 'IMPORTANT', states bounds (depth 4, 400 nodes), and explains truncation with the 'unexplored frontier' listed. It also flags 'v0: all field paths unverified', which is valuable risk context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five dense, purposeul sentences cover algorithm, result shape, caveat, bounds, truncation, safety, and maturity. The IMORTANT warning is front-loaded after the primary verb, and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, it specifies the return core: every reachable mod, raw relationType integer per edge, and the TRUNCATED/frontier behavior. It also explains why over-collection occurs and how seeds work via file_ids, leaving no material gap for safe invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schena description coverage is 100%, with detailed descriptions for mod_ids, file_ids, and max_depth. The main description primarily adds algorithm context (breadth-first, batched POST) but does not add new parameter semantics beyond what the schema already provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Walk the dependency graph of one or more mods breadth-first', giving a specific verb and resource. It clearly distinguishes itself from sibling tools by emphasizing batched bulk POST resolution rather than per-node GETs. Nothing is vague or tautological.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context: use when you need to resolve a dependency tree, and the file_ids parameter includes the explicit guidance 'Use this when you know which file you are running.' It does not explicitly name sibling alternatives or exclusions, but the intended use case is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_modsSearch ARK: Survival Ascended modsA

Search the CurseForge catalog for ARK: Survival Ascended mods. The gameId is resolved at runtime from GET /v1/games and is not a parameter — a wrong gameId returns a clean, empty, wrong result set rather than an error. Page size is capped at 50 by CurseForge and an over-large request is REFUSED rather than clamped, so that a page is never mistaken for a complete set. Every result states its pagination and whether more results exist, and says so explicitly when the tail of the result set is beyond the API's addressable window. class_id, category_id, and category_ids are include filters sent to CurseForge (discover ids via list_categories). exclude_category_ids is applied locally after the page returns — CurseForge has no exclude parameter — so pagination still describes the unfiltered upstream page. A hit is a catalog row, not an install: inspect file_name and file_length_bytes, then hand curseforge_mod_ids to nitrado-ark-mcp. Read-only.

NameRequiredDescriptionDefault
slugNoExact mod slug, when you already know it.
indexNoZero-based result offset. index + page_size must not exceed 10000.
class_idNoInclude: CurseForge section/class id. Discover via list_categories (is_class true).
page_sizeNoResults per page, at most 50. Over that is refused, not clamped.
sort_fieldNoCurseForge sort field, an integer 1-12 (documented range; the per-value meanings are not).
sort_orderNoSort direction.
category_idNoInclude: a single category id. Do not also pass category_ids.
category_idsNoInclude: up to 10 category ids. Overrides category_id at the vendor; this server refuses both at once rather than letting one silently win.
game_versionNoFilter to files supporting this game version string. UNVERIFIED: whether ASA mods populate game version fields at all is ADR-002 §14.3 U9.
search_filterNoFree-text search term, matched by CurseForge against mod names.
exclude_category_idsNoLOCAL exclude after the page returns. CurseForge cannot exclude. Pagination still describes the unfiltered upstream page. For gameplay-only, list_categories then pass Custom Cosmetics' id.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full responsibility and delivers extensively: it states runtime gameId resolution, page_size refusal rather than clamping, explicit pagination semantics, local application of exclude_category_ids, the read-only nature, and even a caveat that game_version behavior is unverified. This goes far beyond a typical tool description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: core purpose first, then edge cases, filter semantics, and output interpretation. It front-loads the main action and ends with a compact 'Read-only.' without repeating any schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity—11 optional parameters, no output schema, and no annotations—the description provides enough context for correct invocation and result interpretation. It explains the lack of a gameId parameter, pagination behavior, local filtering effects, and the key output fields (file_name, file_length_bytes, curseforge_mod_ids) to pass downstream.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds meaningful behavior beyond the schema: it distinguishes include filters sent to CurseForge from locally applied excludes, warns that category_ids overrides category_id and that passing both is refused, and notes that page_size over 50 is refused rather than clamped. This materially improves the agent's ability to pass parameters correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence 'Search the CurseForge catalog for ARK: Survival Ascended mods' names a specific verb, resource, and context, making the action unmistakable. It also differentiates from sibling tools like get_mod and list_mod_files by describing a catalog-level search with paginated results rather than a single-resource lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete cross-tool guidance, directing users to discover filter IDs via list_categories and providing a specific example for gameplay-only excludes. It does not explicitly state when to prefer this tool over get_mod or get_latest_file, but the search semantics and pagination make the intended context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.2.0
    • First observedget_api_diagnostics
    • First observedget_latest_file
    • First observedget_mod
    • First observedget_mod_file
    • First observedlist_categories
    • First observedlist_mod_files
    • First observedresolve_mod_dependencies
    • First observedsearch_mods

TDQS

A4.5/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a clearly distinct resource and action: categories, mod search, single mod, file listing, single file, latest file, dependency graph, and diagnostics. Even the file-related tools are cleanly separated by purpose, with no two tools being interchangeable.

Naming Consistency5/5

Tool names consistently follow a lowercase snake_case verb_noun pattern: list_*, search_*, get_*, resolve_*. There are no mixed conventions, vague single-word verbs, or unpredictable naming styles.

Tool Count5/5

Eight tools is well-scoped for a read-only CurseForge catalog server. Each tool earns its place, covering browsing, retrieval, dependency resolution, and diagnostics without redundant utilities or unnecessary bloat.

Completeness4/5

The server covers the domain thoroughly: category discovery, mod search, mod details, file listing, single-file retrieval, latest-file comparison, dependency traversal, and diagnostics. The deliberate absence of a download URL is consistent with the stated curation-only purpose, but minor gaps such as no file-level search or changelog endpoint prevent a perfect completeness score.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    An MCP server for Arma Reforger and Enfusion engine modding that enables users to create mods, search API classes, and generate scripts through natural language. It provides a comprehensive suite of tools for scaffolding addons, generating prefabs, and building projects using the Workbench CLI.
    63 npm
    14
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    A local MCP server for Nexus Mods mod discovery and research, backed by the v2 GraphQL API, enabling search of games, mods, collections, and users.
    149 npm
    1
    ISC