Game Asset Finder MCP
Game Asset Finder MCP
게임 개발을 위한 '검색 우선' MCP 서비스입니다. 여러 공개 에셋 소스와 선택적 로컬 에셋 라이브러리를 동시에 쿼리하여, 각 사이트의 결과를 동일한 필드로 통합하고, 중국어 키워드 확장, 라이선스 정규화, 관련성 정렬, 소스 간 중복 제거, 소스 다양화, 캐싱 및 커서 기반 페이지네이션을 수행합니다.
이 프로젝트는 현재 MCP TypeScript SDK v2를 기반으로 하며, stdio를 사용하여 실행되며, Codex, ChatGPT 데스크톱 및 기타 로컬 MCP를 지원하는 클라이언트에 적합합니다.
설계 및 최적화
프로젝트는 provider 레지스트리와 통합 결과 모델을 채택하고, 소스 간 검색 레이어에 중점을 두고 최적화했습니다:
단일 소스의 실패가 전체 검색을 중단시키지 않으며, 응답에 각 소스의 상태가 명확히 표시됩니다.
키워드 가중치와 중/영 게임 용어 확장으로 중국어 쿼리의 재현율을 향상시켰습니다.
TTL/LRU 캐시, 동일 동시 요청 병합, provider 전체 시간 제한, 제한된 재시도 및
Retry-After를 도입했습니다.통합 라이선스 필터링, 정규화된 URL 중복 제거, 미러 소스 병합, 안정적인 정렬 및 소스 다양화를 추가했습니다.
limit + nextCursor페이지네이션을 사용하여 대량의 결과가 한 번에 모델 컨텍스트에 포함되는 것을 방지합니다.로컬 인덱스는 증분 스캔, SHA-256, 원자적 쓰기, 루트 디렉터리 제한 및 심볼릭 링크 건너뛰기를 사용합니다.
도구는 4개로 압축되어 에이전트가 잘못된 도구를 선택할 확률을 낮춥니다.
Related MCP server: @codesift/mcp
데이터 소스
id | 내용 | 자격 증명 | 라이선스 특징 |
| 2D, 3D, UI, 오디오, 폰트 에셋 팩 | 없음 | CC0 |
| 2D, 3D, 음악, 음향 효과 | 없음 | 항목마다 다름 |
| 무료 게임 에셋 목록 | 없음 | 작성자/페이지마다 다름 |
| 이미지, 텍스처, 아이콘 참조 | 없음 | CC / 퍼블릭 도메인 |
| PBR 재질, HDRI, 3D | 없음 | CC0 |
| 텍스처, HDRI, 3D | 없음 | CC0 |
| 음향 효과, 녹음 |
| 항목마다 다름 |
| 설정 디렉터리의 로컬 에셋 | 로컬 디렉터리 | sidecar가 설명 |
모든 원격 소스는 일시적으로 타임아웃되거나 속도 제한이 걸릴 수 있습니다. 반환 값의 sourceStatuses는 각 소스별로 ok / partial / disabled / timeout / rate_limited / error를 제공하며, 다른 성공한 소스는 계속 결과를 반환합니다.
설치
Node.js 20.18.1 이상이 필요합니다.
git clone https://github.com/sudoriaa/game-asset-finder-mcp.git
cd game-asset-finder-mcp
npm ci
npm run build
npm test다음 명령어로 실행할 수도 있습니다:
.\install.ps1직접 시작:
node .\dist\index.jsstdio의 표준 출력은 MCP JSON-RPC 채널이며, 서비스 로그는 표준 오류에만 기록됩니다.
Codex에 연결
~/.codex/config.toml 또는 신뢰할 수 있는 프로젝트의 .codex/config.toml에 다음을 추가합니다:
[mcp_servers.game_assets]
command = "node"
args = ["C:\\path\\to\\game-asset-finder-mcp\\dist\\index.js"]
cwd = "C:\\path\\to\\game-asset-finder-mcp"
startup_timeout_sec = 30
tool_timeout_sec = 90
enabled = true
[mcp_servers.game_assets.env]
GAME_ASSET_LOCAL_ROOTS = "D:\\GameAssets;E:\\SharedAssets"
GAME_ASSET_CACHE_TTL_SECONDS = "600"Freesound를 활성화하는 경우, 값을 설정 파일에 직접 쓰지 않고 호스트 환경에서 키를 전달하는 것이 좋습니다:
[mcp_servers.game_assets]
env_vars = ["FREESOUND_API_KEY"]Codex CLI를 사용하여 stdio 서버를 추가할 수도 있습니다:
codex mcp add game-assets -- node "C:\path\to\game-asset-finder-mcp\dist\index.js"
codex mcp list설정을 저장한 후 클라이언트를 다시 시작하고 /mcp로 연결 상태를 확인합니다. 저장소의 mcp-config.example.toml을 복사하여 수정할 수 있습니다.
MCP 도구
search_game_assets
소스 간 검색. 주요 매개변수:
{
"query": "像素风地牢角色",
"types": ["sprite", "tileset"],
"sources": ["kenney", "opengameart", "itch"],
"formats": ["png"],
"tags": ["retro"],
"license_policy": "commercial",
"include_unknown_license": false,
"limit": 12,
"refresh": false
}license_policy는 다음 값을 가질 수 있습니다:
any: 모든 결과를 표시하고, 알 수 없는 라이선스를 명확히 표시합니다.commercial: 상업적으로 사용 가능한 것으로 알려진 라이선스만 유지합니다.include_unknown_license를 사용하여 알 수 없는 항목을 다시 포함시킬 수 있습니다.cc0: CC0 / Public Domain Mark만 유지합니다.no-attribution: 상업적으로 사용 가능하고 저작자 표시가 필요 없는 것으로 알려진 항목만 유지합니다.
다음 페이지로 이동하려면 반환된 nextCursor를 그대로 cursor에 넣고, 다른 쿼리 매개변수는 변경하지 않습니다. 쿼리 조건을 변경한 후 이전 커서를 계속 사용하면 CURSOR_QUERY_MISMATCH가 반환됩니다.
hasMore는 현재 캐시된 후보 스냅샷에 다음 페이지가 있음을 나타내며, 원격 사이트의 전체 기록 결과가 모두 가져와졌음을 의미하지는 않습니다. 더 깊은 결과가 필요한 경우 키워드, 유형 또는 소스 범위를 좁히고 다시 검색하는 것이 좋습니다.
get_game_asset
방금 검색한 전체 레코드를 읽습니다:
{ "asset_id": "kenney:roguelike-characters" }소스, 작성자, 라이선스, 미리보기, 파일 변형, 미러 소스, 일치 이유 및 크레딧에 직접 추가할 수 있는 저작자 표시 텍스트를 반환합니다. 원격 항목은 검색 후 읽고, 로컬 항목은 인덱스에서 직접 읽을 수도 있습니다.
list_asset_sources
모든 provider, 활성화 상태, 지원되는 에셋 유형, 자격 증명 요구 사항, 캐시 구성 및 로컬 인덱스 상태를 나열합니다.
index_local_assets
GAME_ASSET_LOCAL_ROOTS를 스캔합니다:
{ "mode": "incremental", "max_files": 20000 }incremental은 크기와 수정 시간이 변경되지 않은 파일의 SHA-256을 재사용하고, rebuild는 모두 다시 계산합니다. 인덱스는 GAME_ASSET_DATA_DIR/local-assets.json에 기록되며, 에셋 파일을 수정하지 않습니다.
로컬 에셋 sidecar
hero.png 옆에 hero.png.asset.json 또는 hero.asset.json을 배치합니다:
{
"title": "Azure Knight",
"description": "32x32 pixel hero with idle and run frames",
"type": "sprite",
"tags": ["player", "knight", "pixel-art"],
"author": "Studio Name",
"author_url": "https://example.com",
"license": "CC-BY-4.0",
"license_url": "https://creativecommons.org/licenses/by/4.0/",
"source_url": "https://example.com/azure-knight"
}sidecar가 없는 로컬 파일도 검색할 수 있지만, 라이선스는 알 수 없음으로 표시됩니다.
환경 변수
변수 | 기본값 | 설명 |
| 비어 있음 | 로컬 에셋 루트 디렉터리; Windows는 |
| 프로젝트 아래 | 로컬 인덱스 디렉터리 |
|
| 쿼리 캐시 시간(초) |
|
| 쿼리 캐시 최대 항목 수 |
|
| 단일 provider 시간 제한 |
|
| 단일 원격 응답 최대 크기 |
|
| 429/일시적 오류에 대한 재시도 횟수 |
|
| 로컬 인덱스 기본 파일 상한 |
| 비어 있음 | 쉼표로 구분된 provider id |
| 비어 있음 | 선택적 Freesound API key |
개발 및 검증
npm run check
npm test
npm run test:unit
npm run test:mcp테스트는 중국어 쿼리 확장, 유형 식별, 라이선스 정책, URL 정규화, 중복 제거, 캐시 스탬피드 병합, 부분 provider 실패, 페이지네이션 및 커서, 로컬 증분 인덱스, 그리고 실제 stdio MCP 클라이언트의 tools/list / tools/call을 다룹니다.
결과 사용 팁
MCP는 에셋 발견 및 라이선스 메타데이터를 반환하며, 소스 페이지의 최종 약관을 대체하지 않습니다. 알 수 없는 라이선스는 명확히 id: null로 유지됩니다. 배포 전에 commercial, cc0 또는 no-attribution으로 범위를 좁히고, get_game_asset에서 소스 및 저작자 표시 정보를 저장할 수 있습니다.
Available Tools
4 toolsget_game_assetGet game asset detailsARead-onlyIdempotent
Read the full normalized record for an asset returned by search_game_assets, including files, license guidance, alternates, and attribution text.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_id | Yes | assetId returned by search_game_assets. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the agent knows it's safe. The description adds value by revealing what fields the full record includes (files, license guidance, alternates, attribution text) beyond what the simple asset_id schema implies. This behavioral context about the richness of the return data is helpful and not redundant with annotations.
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?
Single sentence front-loading the purpose and result content. Every word earns its place – 'full normalized record', 'including files, license guidance, alternates, and attribution text' adds concrete value without fluff. Could not be shorter without losing meaning.
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 1 parameter, 100% schema coverage, no output schema, and clear annotations, the description is mostly complete. It doesn't explain what 'alternates' or 'attribution text' means in detail, but the agent can infer from context. It also doesn't mention pagination or error cases, but for a simple read-retrieval tool this is acceptable.
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 input schema already has 100% coverage with a well-described 'asset_id' parameter. The description adds context by stating the parameter is the assetId from search_game_assets, clarifying the origin domain and that it's not just any ID. The schema says it well, but the description reinforces the provenance.
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 clearly states the verb 'Read', specifies the resource 'full normalized record for an asset', and distinguishes this tool from siblings by noting it operates on results from search_game_assets. It lists what's included (files, license guidance, alternates, attribution text) and contrasts with search_game_assets which returns abbreviated results.
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 explicitly states 'returned by search_game_assets', telling the agent to call this tool after using its sibling. It implies this is for retrieving full details of a specific asset rather than listing or searching, but doesn't explicitly say when not to use it or what use case would require a different tool. Some guidance is provided by the sibling list context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_local_assetsIndex local game assetsAIdempotent
Incrementally scan GAME_ASSET_LOCAL_ROOTS, hash changed files, read optional .asset.json metadata, and atomically refresh the local search index. Symbolic links are skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | incremental | |
| max_files | No | Optional cap for this scan. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false, destructiveHint=false, idempotentHint=true. The description adds concrete behavioral details: files are hashed, optional .asset.json metadata is read, symlinks are skipped, and index refresh is atomic. No contradiction with annotations.
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?
Two sentences, front-loaded with the primary action. Every word adds value—no redundancy, no fluff.
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?
The description covers the core process but omits several details: no mention of return value (no output schema), no prerequisites (e.g., configured roots), no explanation of the 'rebuild' mode, and no indication of performance or idempotency. Adequate but incomplete for a tool with no output schema.
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 50% (only max_files has a description). The tool description does not add any meaning to the parameters—it doesn't explain the mode enum or clarify max_files beyond what the schema already provides. This leaves the agent without guidance on choosing mode or setting the cap.
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 clearly states the tool's purpose: incrementally scan local asset roots, hash changed files, read metadata, and atomically refresh the search index. It uses specific verbs and resources, and is distinct from sibling tools like get_game_asset or search_game_assets.
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 implies the tool is used for updating the local search index but does not explicitly state when to use it versus alternatives (e.g., rebuild vs. incremental, or when to use search_game_assets). No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_asset_sourcesList game asset sourcesARead-onlyIdempotent
List provider ids, supported asset kinds, enablement state, local index state, and active limits.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds value by specifying the returned fields (e.g., enablement state, local index state), which helps the agent anticipate output. It does not cover potential edge cases like pagination or consistency guarantees, but for a zero-parameter listing, these are minor gaps.
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?
A single sentence that front-loads the action ('List') and enumerates the key output fields. Every word is informative; there is no redundancy or 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?
Given the simplicity (zero params, no output schema, strong annotations), the description covers the purpose and return values well. It could explicitly state that it returns all available sources, but the lack of filtering parameters strongly implies this. Overall, it is nearly complete for the tool's complexity.
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 input schema has no parameters (100% schema coverage). The description does not need to add param info. By the rubric, baseline 3 is appropriate. No additional meaning is provided beyond the schema, but none is required.
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 the verb 'List' and specifies the exact fields returned (provider ids, supported asset kinds, enablement state, etc.), clearly differentiating from siblings like get_game_asset (single item retrieval) and search_game_assets (filtered search).
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 implies usage for retrieving asset source metadata, but does not explicitly state when to choose this over siblings, nor does it mention prerequisites or exclusions. The context signals and sibling names provide implicit guidance, but direct usage context is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_game_assetsSearch game assetsARead-onlyIdempotent
Search enabled remote and local game-asset sources concurrently. Results are normalized, license-filtered, relevance-ranked, de-duplicated, source-diversified, cached, and cursor-paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional style or content tags. | |
| limit | No | Results per page. | |
| query | Yes | What to find. Chinese and English game-development terms are accepted. | |
| types | No | Optional normalized asset kinds. | |
| cursor | No | Opaque nextCursor returned by the previous page. Keep all other query arguments unchanged. | |
| formats | No | Optional file extensions such as png, glb, wav, or zip. | |
| refresh | No | Bypass the query cache for the first page. | |
| sources | No | Provider ids from list_asset_sources. Empty means every enabled source. | |
| license_policy | No | any, commercially usable, CC0/public domain, or no-attribution only. | any |
| include_unknown_license | No | When a restrictive license policy is selected, retain results whose license is unknown. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare safe and idempotent behavior (readOnlyHint, openWorldHint, idempotentHint, destructiveHint=false). The description adds significant behavioral details beyond these annotations: concurrent search, normalization, license filtering, relevance ranking, de-duplication, source diversification, caching, and cursor pagination. There is no contradiction with annotations.
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 a single concise sentence that front-loads the main action ('Search enabled remote and local game-asset sources concurrently') and follows with a list of processing steps. Every word earns its place. However, the sentence is somewhat dense; breaking it into two sentences could improve readability without losing 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 complexity (10 parameters, no output schema), the description explains the processing pipeline well but does not describe the structure of the returned results. Since there is no output schema, the agent would benefit from knowing what fields each asset result contains (e.g., id, name, source, url, license). The mention of cursor pagination helps, but details on the response envelope are missing.
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 input schema has 100% description coverage (all 10 parameters have descriptions). The tool description itself does not add any extra parameter-level meaning beyond what the schema already provides. Therefore, the baseline score of 3 is appropriate as the description adds no additional semantic value for parameters.
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 clearly states it searches remote and local game-asset sources concurrently, which directly contrasts with sibling tools: get_game_asset (single asset retrieval), list_asset_sources (listing providers), and index_local_assets (local indexing). The verb 'Search' and resource 'game-asset sources' are specific and unambiguous.
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?
No explicit guidance is provided on when to use this tool versus alternatives. There are no when-to-use, when-not-to-use, or prerequisite instructions. For example, it doesn't mention that the user should first use list_asset_sources to obtain provider IDs for the sources parameter, or that index_local_assets must be run beforehand to make local assets searchable.
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.
4 tool updates
v1.0.0- First observed
get_game_asset - First observed
index_local_assets - First observed
list_asset_sources - First observed
search_game_assets
TDQS
Scored across 4 tools
Each tool has a distinct purpose: search, get details, list sources, and index. There is no overlap in functionality, making it easy for an agent to select the right tool.
All tool names follow a consistent verb_noun pattern in snake_case (get_game_asset, list_asset_sources, search_game_assets, index_local_assets). This predictable structure aids agent understanding.
Four tools cover the essential operations for a game asset finder: search, get detail, list sources, and index local assets. The count is well-scoped for the server's stated purpose.
The tools provide a complete workflow: index local assets, search across sources, retrieve detailed records, and list source info. No obvious gaps exist for the domain of finding and retrieving game assets.
Maintenance
Related MCP Connectors
An MCP server that provides asset auto generator
Capability registry for the agentic economy. Semantic search over verified MCP server listings.
Publish and discover MCP servers via the official MCP Registry. Powered by HAPI MCP server.
Related MCP Servers
- 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.138 npm1ISC
- AlicenseNot gradedqualityDmaintenanceMCP server for local-first lexical code search, providing tools for searching code, finding symbols, and reading chunks from indexed repositories.MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that aggregates web search results from multiple engines and optionally renders pages to Markdown, providing a unified search interface.17 npm3ISC
- AlicenseNot gradedqualityDmaintenanceA Python MCP server for searching, downloading, extracting, inspecting, and previewing game assets from multiple public sources.3MIT