CurseForge ARK MCP Server
curseforge-ark-mcp
ARK: Survival Ascended 모드 큐레이션, 검색 및 업데이트 감시를 위한 읽기 전용 MCP 서버입니다.
아직 v0입니다 — 부분 검증 완료, 완전 검증 아님.
2026-08-18 변경 사항: CurseForge API 키가 도착했고, 클라이언트가 첫 번째 인증 호출을 수행했으며, 읽어들이는 모든
Mod및File필드 경로가 실시간 응답에 존재하는 것으로 확인되었습니다. 수정이 필요한 항목은 없었습니다. 샘플: 748개의 고유 ARK: Survival Ascended 모드, 1899개의 파일 레코드.아직 v0인 이유. 네 가지 사항이 아직 확인되지 않았으며, 그중 하나는 확인이 불가능합니다.
FileDependency엣지 형태는 한 번도 관찰되지 않았습니다. 샘플링된 ASA 파일 1899개 중 0개가 종속성을 선언했으며,dependencies배열은 매번 존재하지만 비어 있었습니다.
FileRelationType정수는 게시되지 않았으며 이 카탈로그에서 사용된 적도 없습니다.
FileReleaseType정수1,2,3은 이제 확인되었습니다. 어떤 것이 릴리스, 베타, 알파를 의미하는지는 여전히 알 수 없으며, 이 서버는 추측하지 않습니다.대량 읽기 ID 배열에 대한 공급업체 상한: 300개 ID까지 발견되지 않았으므로 알려진 바 없습니다.
부분 검증된 클라이언트는 검증된 클라이언트가 아닙니다. 버전 번호는 검증 상태에 대한 주장이므로
0.2.0입니다.1.0.0이 아니며, 의도적으로1.0.0-anything도 아닙니다.
이 저장소 자체의 동작은 API와 독립적으로 검증되었습니다: 엔드포인트 허용 목록, 호스트 고정, 경로 정규화, 페이지네이션 경계, 봉투 처리, 그리고 세 가지 상태(부재/존재하지만 비어 있음/알 수 없음) 규율이 모두 포함됩니다. 이 모든 것은 주입된 가짜 fetch에 대해 테스트되었으며, 키도 네트워크도 필요 없습니다. 현재 156개의 테스트, 0개의 실패입니다.
설계 기록: docs/adr/ADR-002-endpoint-allow-list.md
(상태: 제안됨). 아래의 모든 섹션 참조(§1, §4.3, §14.3 …)는 이 문서를 가리킵니다.
Related MCP server: neoforge-kb-mcp
기능 및 의도적으로 수행하지 않는 기능
일곱 가지 도구, 모두 읽기 전용:
도구 | 답변 |
| "이 검색어와 일치하는 ASA 모드는 무엇인가요?" |
| "프로젝트 777001은 무엇인가요?" |
| "이 모드가 게시한 파일은 무엇인가요?" |
| "이 특정 파일은 무엇인가요?" |
| "현재 실행 중인 파일보다 최신 파일이 이 모드에 있나요?" |
| "이 모드가 필요로 하는 것은 무엇인가요?" (일괄 처리, 트리 레벨당 한 번의 요청) |
| "문제가 나인가요, 키인가요, 아니면 CurseForge인가요?" — 그리고 "이 빌드는 얼마나 정직한가요?" |
수행할 수 없는 기능:
아무것도 다운로드하거나 설치할 수 없습니다.
GET /v1/mods/{modId}/files/{fileId}/download-url은 문서화된 읽기이며, 고정된 호스트에 있지만 거부됩니다 — 엔드포인트 허용 목록에 없기 때문입니다(DEC-002 §11.3). Nitrado가 자체적으로 모드를 설치합니다.어디에도 쓸 수 없습니다. 어떤 허용 목록 항목도 변경을 유발하는 엔드포인트를 지명하지 않습니다. CurseForge는 다른 호스트(§14.2)에서 변경을 유발하는 업로드 API를 운영하지만, 호스트 고정이 독립적인 이유로 이를 다시 거부합니다.
모드를 게시하거나 제작할 수 없습니다. 완전히 거부됩니다(DEC-002 판결 2). 약속이 아닌 부트 어설션에 의해 시행됩니다: 티어 1 이외의 것을 선언하는 도구를 등록하면 프로세스가 시작을 거부합니다.
Nitrado를 건드릴 수 없습니다. 이 저장소의 구성 표면에는
NITRADO_*변수가 존재하지 않으며, 그 부재 자체가 통제 수단입니다. 이 서버는 Nitrado 토큰을 보유하지 않으며 Nitrado 구성을 읽지 않습니다.타이머에 의해 깨어나 서버를 업데이트할 수 없습니다. 스케줄러, 폴링 루프, 지속된 "마지막으로 본 버전" 상태가 없습니다(§10). 감시는 모델이 새 버전을 관찰할 수 있음을 의미합니다. 행동을 취할 수는 없습니다.
핵심 병목: 메서드 확인이 아닌 엔드포인트 허용 목록
코드를 건드리기 전에 읽어볼 가치가 있는 유일한 설계 결정입니다.
CurseForge는 읽기에 POST를 사용합니다. POST /v1/mods와 POST /v1/mods/files는 대량 검색이며, 이것이 resolve_mod_dependencies가 노드당 한 번이 아닌 종속성 레벨당 한 번의 요청 비용이 들게 하는 이유입니다. 따라서 자매 저장소의 method !== "GET" → 거부는 여기서 가장 비용이 많이 드는 방식으로 실패할 것입니다: 작동하는 척 할 것입니다. 요청을 거부하고, 자체 테스트를 통과하며, 조용히 서버를 제 기능을 못하게 만들 것입니다.
그리고 명백한 수정은 버그보다 더 나쁩니다:
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} 쌍 목록의 명시적 항목과 일치해야 합니다. src/allowlist.ts에 있는 일곱 개의 항목:
# | 메서드 | 경로 | 제공 대상 |
E1 |
|
| 게임 ID 확인, |
E2 |
|
|
|
E3 |
|
|
|
E4 |
|
|
|
E5 |
|
|
|
E6 |
|
|
|
E7 |
|
|
|
메커니즘적으로:
{method, path}를 공동으로 일치시킵니다. E3는DELETE /v1/mods/123을 승인하지 않습니다. E6는POST /v1/mods/123을 승인하지 않습니다.호스트는
https://api.curseforge.com으로 고정되며, 고정은 다른 명명된 출처를 거부하는 것이 아니라 하나의 출처를 허용하는 것입니다.ID 세그먼트는
[^/]+가 아닌[0-9]+에 바인딩됩니다. 이는 중요한 의미를 갖습니다: 관대한{modId}는 E3가/v1/mods/search를 삼키게 만듭니다. 숫자 바인딩은 이러한 모호성을 일치 순서에 의존하지 않고 구조적으로 불가능하게 만듭니다. 그리고 전체 목록을 뒤집어 순서가 이를 구제하지 않음을 증명하는 테스트가 있습니다.확인 전에 한 번 정규화되며, URL은 그 출력에서 빌드됩니다. 퍼센트 디코딩을 한 번 수행하고, 살아남은
%는 거부하며, 백슬래시를 접고,.,..및 빈 세그먼트를 거부합니다.E6/E7만 본문을 전송할 수 있으며, 전송 전에 형태가 확인됩니다. GET 항목의 본문은 삭제되지 않고 거부됩니다.
resolve_mod_dependencies만 POST 항목에 도달할 수 있으며(§8), 전송 계층에서 시행됩니다.
실패 모드는 "일치하지 않는 요청은 거부됨"이며, "인식되지 않은 요청이 전송됨"이 아닙니다. 그리고 기능 추가는 검토 가능한 한 줄짜리 diff이며, 그 검토 질문 — "이 엔드포인트는 읽기인가?" — 은 사람이 실제로 답할 수 있는 질문입니다.
허용 목록임을 증명하는 테스트
GET /v1/mods/{modId}/files/{fileId}/download-url은 거부됩니다. 이는 문서화된 읽기이며, GET이고, 고정된 호스트에 있으며, 형식이 올바른 숫자 ID를 가지고 있습니다. 목록에 없기 때문에 순전히 거부됩니다. 해당 테스트가 다른 이유(호스트 고정 거부, 경로 거부)로 통과한다면, 해당 속성은 구현되지 않은 것이므로 테스트는 단순히 무언가가 발생했다는 것뿐만 아니라 거부의 코드와 세부 사항을 단언합니다.
모든 거부 테스트는 또한 가짜 fetch의 호출 횟수를 단언합니다. "요청이 빌드되기 전에 거부됨"이 실제 조항이며, 전송 후에 발생한 오류는 더 약한 단언을 만족시킬 것이기 때문입니다. 그리고 거부 스위트는 일곱 항목 모두가 전송됨을 증명하는 사전 이미지 테스트가 선행됩니다. 아무것도 보낼 수 없는 클라이언트에 대한 거부 스위트는 완벽하게 통과하지만 아무것도 증명하지 않습니다.
실시간 API에 대해 검증 완료 — 2026-08-18
샘플: 748개의 고유 ASA 모드, 1899개의 파일 레코드, 깊은 검색 페이지(인덱스 1000-6000)와 문서화된 모든 sortField 1-12, 그리고 100개 모드의 전체 파일 목록에서 가져왔습니다. 의도적으로 날짜와 크기를 명시했습니다: 샘플 크기 없이 "검증됨"은 주장이지 기분이 아닙니다.
# | 주장 | 결과 |
U1 | ASA |
|
U2 | ASA가 키에 표시되는가? | 예. 38개의 게임이 표시되며, ASA도 그중 하나입니다. v1 차단이 아닙니다. |
U3 |
| 모두 정확함. |
U4 |
| 모두 정확함. |
U8 |
| 페이지가 매겨진 엔드포인트(게임, 검색, 파일)에는 존재하고, 단일 레코드 및 대량 읽기에는 없음 — 이는 이 클라이언트가 예상하도록 빌드된 분할과 정확히 일치합니다. |
U9 | ASA 모드가 선택적 필드를 채우는가? |
|
U11 | 속도 제한 헤더 | CurseForge는 아무것도 보내지 않습니다. 실시간 GET 및 POST에 대한 전체 헤더 열거 결과 전송/CDN 헤더만 발견되었습니다. 따라서 |
U12 | 인덱스 0 이후의 페이지네이션 | 작동합니다. |
U13 | 기본 URL | 정확합니다. 호스트 고정은 건전합니다. |
수정이 필요한 필드 경로는 없습니다. 이는 자랑이 아니라 결과로 기록된 것입니다. 형제 리포지토리의 커밋 5481c04는 라이브 API를 처음 호출한 날 세 개의 잘못된 경로를 수정했으며, 그 선례가 여기서 각 경로를 신뢰하지 않고 하나씩 확인한 이유입니다.
아직 검증되지 않음
줄어들었을 뿐 사라지지 않았습니다. 다음은 라이브 API와의 접촉에서 살아남은 행들입니다.
# | 주장 | 상태 | 아직 열려 있는 이유 |
U5 |
| 관찰되지 않음 | 잘못된 것으로 드러나지 않음 — 전혀 본 적 없음. 샘플의 ASA 파일 중 의존성을 선언한 파일이 없어서 에지 객체가 검사된 적이 없습니다. 형태는 문서에서 파생되었으며 테스트 픽스처가 유일한 존재 장소입니다. |
U6 |
| 미공개 및 여기서 관찰 불가능 |
|
U7 |
| 값은 보았으나 의미는 알 수 없음 | 관찰됨: |
U10 | 벤더의 대량 읽기 ID 배열 상한선 | 300까지 상한선 없음 발견 | 200개의 고유 ID가 200개의 레코드를 반환했고, 300개가 300개를 반환했습니다. 따라서 상한선이 있다면 300 이상입니다. 이 클라이언트의 200개 ID 상한선은 유지됩니다: 이는 문서화되지 않은 속도 제한에 대해 의도적으로 보수적으로 설정된 우리의 상한선이며, 상한선을 찾지 못한 프로브가 상한선을 찾은 것은 아닙니다. |
도구 출력에서 볼 수 있는 두 가지 결과
relationType과 releaseType은 원시 정수로 표시되며 절대 매핑되지 않습니다. required/optional로도, release/beta/alpha로도 매핑되지 않습니다. CurseForge는 둘 중 어느 것에 대해서도 값 테이블을 게시하지 않으며, 잘못된 레이블은 아무도 확인하지 않을 방식으로 잘못된 의존성 목록 또는 업데이트 권장 사항을 생성할 것입니다. 따라서 resolve_mod_dependencies는 모든 에지를 따르며 그렇게 명시합니다: 과도하게 수집하며, 그 출력은 이를 명백히 밝힙니다. 넓은 그물은 적어도 눈에 띄게 넓습니다.
특히 ASA의 경우, 라이브 카탈로그는 도구를 사용하기 전에 알아둘 가치가 있는 방식으로 이를 무의미하게 만듭니다: 샘플링된 ASA 모드 중 어느 것도 의존성을 전혀 선언하지 않습니다. 단일 노드 트리는 예상된 결과이며, 깨진 순회의 증상이 아닙니다. 도구의 출력은 그것이 어떤 것인지 명시합니다.
get_latest_file은 "최신"이 무엇을 의미하는지 명시하도록 요구합니다. fileDate 기준 최신, 게임 버전 일치 최신, 특정 releaseType을 가진 최신은 서로 다른 답변을 제공하며, 잘못된 기준으로 내린 모드 업데이트 결정은 이 리포지토리가 방지하고자 하는 확신에 찬 잘못된 답변 클래스에 정확히 해당합니다. selection에는 기본값이 없습니다:
| 또한 필요함 | 의미 |
| — | 모든 후보 파일 중 |
|
| 해당 게임 버전을 선언하는 최신 파일 |
|
| 해당 릴리스 유형 정수를 가진 최신 파일 |
명명된 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 onenpm 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" }
}
}
}서버는 키 없이 시작을 거부하며, 검색한 두 위치, 정확한 변수, 키가 셀프 서비스가 아니라는 사실을 명시합니다. 깔끔하게 시작한 후 일곱 도구 모두에서 오류를 던지는 stdio MCP 서버는 디버깅하기 매우 불쾌합니다.
키에 관하여
API 키는 x-api-key 요청 헤더로 전송됩니다. Authorization: Bearer 토큰이 아닙니다 — 이는 형제 Nitrado 서버의 방식이며, 이 리포지토리는 의도적으로 둘 다 지원하지 않습니다. 둘 다 지원하면 이 코드가 CurseForge가 문서화하지 않은 형식으로 자격 증명을 전송할 수 있기 때문입니다.
키는 애플리케이션에서 Overwolf에 부여되며 양도할 수 없습니다. 실제 결과이자 이 문단이 존재하는 유일한 이유: 유출은 취소 및 재신청을 의미하며, 재신청은 대기열이지 셀프 서비스 재설정이 아닙니다. 커피 한 잔 마시는 동안 재생성할 수 없고 다른 사람의 것을 빌릴 수도 없습니다. 그에 따라 취급하십시오 — .env는 gitignored, .env.example은 변수 이름과 빈 값을 가지며, 커밋된 파일에는 키 값이 나타나지 않습니다.
이 리포지토리에는 범위 매트릭스가 없으며, 이는 간과가 아닙니다: CurseForge는 읽기 전용 범위나 범위 선택을 게시하지 않으므로 매트릭스할 것이 없습니다. 이 서버의 읽기 전용 속성은 자체 엔드포인트 허용 목록에서 비롯되며, 더 좁은 자격 증명에서 비롯되지 않습니다. 또한 토큰 유출 대응 절차도 없습니다 — 유출된 키는 공개 카탈로그에 대한 읽기 액세스와 할당량 소비를 부여하며, 이는 실제 문제이지만 형제 리포지토리의 Nitrado 토큰(게임 서버에 대한 완전한 제어와 동등한 것으로 문서화됨)과 같은 범주는 아닙니다. 이러한 적절한 크기 조정은 ADR-002 §12에서 논의되며, 반증될 수 있도록 거기에 명시된 하나의 주장에 의존합니다: CurseForge 카탈로그 데이터는 구성상 공개입니다.
수정, 전부
한 가지 규칙: API 키를 절대 에코하지 마십시오. 하나의 함수 src/scrub.ts가 오류 메시지와 업스트림 본문 조각에 적용됩니다. 요청 헤더는 오류에 절대 나타나지 않습니다 — 키, 수정된 키, 헤더 이름 목록도 아닙니다. get_api_diagnostics는 키가 구성되었는지 여부를 보고하며 그 값, 접두사, 길이를 절대 보고하지 않습니다.
출력을 읽기 전에 알아둘 가치가 있는 동작
빈 것은 알 수 없음이 아닙니다.
data: []는 CurseForge가 "없음"이라고 답했음을 의미합니다 — 실제 답변이며, 무엇이 아무것도 반환하지 않았는지 확인할 수 있도록 쿼리가 함께 에코됩니다. 필드가 없으면null이며, 절대0,""또는[]가 아닙니다. 완료되지 않은 요청이나 형태가 잘못된 응답은 오류입니다 — 값이 아닙니다.data키가 없으면 빈 결과가 아니라 오류입니다. 이를[]로 강제 변환하면 깨진 통합이 "결과 없음"으로 바뀝니다.페이지 매김 엔드포인트에서
pagination이 없으면 역시 오류입니다. 한 페이지라고 가정하는 것은 도구가 900개 모드 중 50개를 마치 전부인 것처럼 보고하는 방법입니다(U8이 정확히 이 공개 질문입니다).pageSize > 50은 클램핑되지 않고 거부되며,index + pageSize > 10000도 마찬가지입니다 — 해당 인덱스에서 가능한 가장 큰 페이지 크기가 메시지에 명시됩니다. 200을 요청하고 조용히 50을 받은 모델은 페이지를 마치 집합인 것처럼 추론할 것입니다.totalCount가 10000을 초과하면 도구 출력은 나머지 부분이 도달 불가능하다고 명시하며, 필터를 좁히라고 조언합니다.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 enumeratorsrc/buildinfo.ts는 생성되며 gitignored되고, 모든 tsc 실행 전에 커밋과 dirty 플래그가 찍히며, get_api_diagnostics에 의해 표시됩니다. dist/는 gitignored이며 서버는 장기 실행 프로세스로 실행되므로, "어떤 코드가 그 답변을 생성했는가?"는 런타임에 git에서 답할 수 없습니다 — 아티팩트와 함께 이동해야 합니다.
형제 리포지토리와의 차이점, 의도적으로 명시됨
ADR-002의 공개 질문 7과 8은 이러한 차이점이 발생하는 곳에서 명명하도록 요구합니다:
동일한 기준선, 의도적으로. Node ≥20, TypeScript 5.9.3,
@modelcontextprotocol/sdk1.30.0,zod4.4.3, 동일한scripts/run-tests.mjs열거자를 통한node:test. 동일한 검토자, 동일한 관용구, 둘 다 읽는 비용 절감.@cfworker/json-schema는 여기서 의존성이 아닙니다. 이는 형제의 cron 표현식 검증을 뒷받침하며, 여기에는 검증할 쓰기 경로가 없습니다.registry.ts는 구조가 이식되었고tier를 유지하지만, 모드/활성화 목록 메커니즘은 제거되었습니다 — 모든 도구가 티어 1이고 모든 엔드포인트가 읽기이므로 필터링할 것이 없습니다. 뒤에 아무것도 없는 모드 변수는 존재하지 않는 제어를 광고합니다. 하나의 다섯 줄 부트 어설션이 하위 시스템을 대체합니다.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가 포팅하는 형태, 정규화 규칙의 출처, 부트 체크 추론, 그리고 시작 거부 추론입니다.
두 서버는 독립적으로 유지됩니다. nitrado-ark-mcp는 *"이 프로젝트 ID는 active-mods에 있습니다"*라고 답하고; 이 저장소는 *"프로젝트 X의 최신 파일은 v2.1입니다"*라고 답합니다. 모델은 둘 다 보유합니다. 어느 서버도 다른 서버를 호출하지 않으며, 어느 서버도 다른 서버의 자격 증명을 보유하지 않습니다.
Available Tools
8 toolsget_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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mod_id | Yes | CurseForge numeric mod (project) id. | |
| selection | No | Which 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_version | No | Required 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_type | No | Required 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mod_id | Yes | CurseForge numeric mod (project) id. Digits only — the allow-list will not match anything else. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mod_id | Yes | CurseForge numeric mod (project) id. Digits only — the allow-list will not match anything else. | |
| file_id | Yes | CurseForge numeric file id. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| class_id | No | Restrict to categories under this class id. Discoverable from a classes_only call. | |
| classes_only | No | When true, return only top-level classes for the game, not every nested category. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Zero-based offset. index + page_size <= 10000. | |
| mod_id | Yes | CurseForge numeric mod (project) id. Digits only — the allow-list will not match anything else. | |
| page_size | No | At most 50. Over that is refused, not clamped. | |
| game_version | No | Filter to files supporting this game version string. UNVERIFIED (§14.3 U9). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mod_ids | No | Seed mod ids. At least one of mod_ids or file_ids is required. At most 200. | |
| file_ids | No | Seed 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_depth | No | How many levels to walk. Default and maximum 4. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Exact mod slug, when you already know it. | |
| index | No | Zero-based result offset. index + page_size must not exceed 10000. | |
| class_id | No | Include: CurseForge section/class id. Discover via list_categories (is_class true). | |
| page_size | No | Results per page, at most 50. Over that is refused, not clamped. | |
| sort_field | No | CurseForge sort field, an integer 1-12 (documented range; the per-value meanings are not). | |
| sort_order | No | Sort direction. | |
| category_id | No | Include: a single category id. Do not also pass category_ids. | |
| category_ids | No | Include: up to 10 category ids. Overrides category_id at the vendor; this server refuses both at once rather than letting one silently win. | |
| game_version | No | Filter to files supporting this game version string. UNVERIFIED: whether ASA mods populate game version fields at all is ADR-002 §14.3 U9. | |
| search_filter | No | Free-text search term, matched by CurseForge against mod names. | |
| exclude_category_ids | No | LOCAL 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
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.
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.
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.
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.
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.
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.
8 tool updates
v0.2.0- First observed
get_api_diagnostics - First observed
get_latest_file - First observed
get_mod - First observed
get_mod_file - First observed
list_categories - First observed
list_mod_files - First observed
resolve_mod_dependencies - First observed
search_mods
TDQS
Scored across 8 tools
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.
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.
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.
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
Related MCP Connectors
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
MCP server for developer documentation, generated by doc2mcp.
MCP server for dev documentation, generated by doc2mcp.
A MCP server built for developers enabling Git based project management with project and personal…
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceAn 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 npm14-
- AlicenseNot gradedqualityDmaintenanceMCP server that provides RAG-based access to Neoforge Mod API documentation, enabling LLMs to query the latest Neoforge modding knowledge.2MIT
- AlicenseNot gradedqualityCmaintenanceA local MCP server for Nexus Mods mod discovery and research, backed by the v2 GraphQL API, enabling search of games, mods, collections, and users.131 npm1ISC
- AlicenseBqualityBmaintenanceMCP server for Forge Minecraft modding documentation. Gives AI assistants direct access to Forge docs with structured search results.510 npm3AGPL 3.0