Skip to main content
Glama
sudoriaa

Game Asset Finder MCP

by sudoriaa

Game Asset Finder MCP

CI License: MIT

Un servicio MCP orientado a la búsqueda para el desarrollo de juegos. Consulta simultáneamente múltiples fuentes de activos públicas y una biblioteca local opcional, unifica los resultados de diferentes sitios en un mismo conjunto de campos, y realiza expansión de palabras clave en chino, normalización de licencias, clasificación por relevancia, deduplicación entre fuentes, equilibrio de fuentes, almacenamiento en caché y paginación con cursor.

El proyecto se basa en el SDK actual de MCP TypeScript v2, se ejecuta mediante stdio y es compatible con Codex, ChatGPT de escritorio y otros clientes que admitan MCP local.

Diseño y optimización

El proyecto utiliza un registro de proveedores y un modelo de resultados unificado, con un enfoque optimizado en la capa de búsqueda entre fuentes:

  • El fallo de una fuente individual no derrumba la búsqueda global; la respuesta marca claramente el estado de cada fuente.

  • La ponderación de palabras clave y la expansión de términos de juegos en chino e inglés mejoran la tasa de recuperación de consultas en chino.

  • Se incorpora caché TTL/LRU, fusión de solicitudes concurrentes idénticas, tiempo límite total por proveedor, reintentos limitados y Retry-After.

  • Se añade filtrado unificado de licencias, deduplicación de URL normalizadas, fusión de fuentes espejo, ordenamiento estable y diversificación de fuentes.

  • Paginación con limit + nextCursor para evitar saturar el contexto del modelo con grandes cantidades de resultados.

  • El índice local utiliza escaneo incremental, SHA-256, escritura atómica, restricción de directorio raíz y omisión de enlaces simbólicos.

  • La superficie de herramientas se reduce a 4, disminuyendo la probabilidad de que el agente seleccione la herramienta equivocada.

Related MCP server: @codesift/mcp

Fuentes de datos

id

Contenido

Credenciales

Características de licencia

kenney

Paquetes de activos 2D, 3D, UI, audio, fuentes

Ninguna

CC0

opengameart

2D, 3D, música, efectos de sonido

Ninguna

Varía por elemento

itch

Listados de activos de juegos gratuitos

Ninguna

Varía por autor/página

openverse

Referencias de imágenes, texturas, iconos

Ninguna

CC / Dominio público

ambientcg

Materiales PBR, HDRI, 3D

Ninguna

CC0

polyhaven

Texturas, HDRI, 3D

Ninguna

CC0

freesound

Efectos de sonido, grabaciones

FREESOUND_API_KEY

Varía por elemento

local

Activos locales en el directorio configurado

Directorio local

Descrito por sidecar

Cualquier fuente remota puede experimentar timeouts o límites de tasa temporales. El campo sourceStatuses en el valor de retorno indica ok / partial / disabled / timeout / rate_limited / error por fuente; las fuentes exitosas aún devuelven resultados.

Instalación

Requiere Node.js 20.18.1 o superior.

git clone https://github.com/sudoriaa/game-asset-finder-mcp.git
cd game-asset-finder-mcp
npm ci
npm run build
npm test

También se puede ejecutar:

.\install.ps1

Iniciar directamente:

node .\dist\index.js

La salida estándar de stdio es el canal MCP JSON-RPC; los registros del servicio solo se escriben en el error estándar.

Integración con Codex

Agregue en ~/.codex/config.toml o en .codex/config.toml de un proyecto de confianza:

[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"

Si se habilita Freesound, se recomienda reenviar la clave desde el entorno local en lugar de escribir el valor en la configuración:

[mcp_servers.game_assets]
env_vars = ["FREESOUND_API_KEY"]

También se puede agregar el servidor stdio con la CLI de Codex:

codex mcp add game-assets -- node "C:\path\to\game-asset-finder-mcp\dist\index.js"
codex mcp list

Después de guardar la configuración, reinicie el cliente y use /mcp para ver el estado de la conexión. El archivo mcp-config.example.toml en el repositorio se puede copiar y modificar directamente.

Herramientas MCP

search_game_assets

Búsqueda entre fuentes. Parámetros principales:

{
  "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 puede tomar:

  • any: muestra todos los resultados y marca explícitamente las licencias desconocidas.

  • commercial: solo mantiene licencias conocidas como comercializables; se puede usar include_unknown_license para incluir elementos desconocidos.

  • cc0: solo mantiene CC0 / Public Domain Mark.

  • no-attribution: solo mantiene elementos conocidos como comercializables que no requieren atribución.

Para la página siguiente, coloque el nextCursor devuelto exactamente en cursor, manteniendo los demás parámetros de consulta sin cambios. Continuar usando un cursor antiguo después de modificar las condiciones de consulta devuelve CURSOR_QUERY_MISMATCH.

hasMore indica que la instantánea actual del caché candidato tiene una página siguiente; no representa que todos los resultados históricos del sitio remoto hayan sido obtenidos. Si se necesitan resultados más profundos, es mejor reducir el alcance de palabras clave, tipo o fuente y volver a buscar.

get_game_asset

Lee el registro completo recién buscado:

{ "asset_id": "kenney:roguelike-characters" }

Devuelve fuente, autor, licencia, vista previa, variantes de archivo, fuentes espejo, motivo de coincidencia y texto de atribución que se puede incluir directamente en los créditos. Los elementos remotos se buscan primero y luego se leen; los elementos locales también se pueden leer directamente desde el índice.

list_asset_sources

Lista todos los proveedores, estado de habilitación, tipos de activos admitidos, requisitos de credenciales, configuración de caché y estado del índice local.

index_local_assets

Escanea GAME_ASSET_LOCAL_ROOTS:

{ "mode": "incremental", "max_files": 20000 }

incremental reutiliza SHA-256 para archivos cuyo tamaño y hora de modificación no hayan cambiado; rebuild recalcula todo. El índice se escribe en GAME_ASSET_DATA_DIR/local-assets.json y no modifica los archivos de activos.

Sidecar de activos locales

Coloque hero.png.asset.json o hero.asset.json junto a hero.png:

{
  "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"
}

Los archivos locales sin sidecar aún se pueden buscar, pero la licencia se muestra como desconocida.

Variables de entorno

Variable

Valor predeterminado

Descripción

GAME_ASSET_LOCAL_ROOTS

Vacío

Directorios raíz de activos locales; separados por ; en Windows, por : en macOS/Linux

GAME_ASSET_DATA_DIR

data en el proyecto

Directorio del índice local

GAME_ASSET_CACHE_TTL_SECONDS

600

Segundos de caché de consulta

GAME_ASSET_CACHE_MAX_ENTRIES

200

Número máximo de entradas en la caché de consulta

GAME_ASSET_PROVIDER_TIMEOUT_MS

15000

Tiempo límite por proveedor

GAME_ASSET_MAX_RESPONSE_BYTES

16777216

Límite de respuesta remota única

GAME_ASSET_MAX_RETRIES

2

Número de reintentos para errores 429/temporales

GAME_ASSET_MAX_LOCAL_FILES

20000

Límite predeterminado de archivos en el índice local

GAME_ASSET_DISABLED_SOURCES

Vacío

IDs de proveedor separados por comas

FREESOUND_API_KEY

Vacío

Clave API opcional de Freesound

Desarrollo y validación

npm run check
npm test
npm run test:unit
npm run test:mcp

Las pruebas cubren expansión de consultas en chino, identificación de tipos, políticas de licencia, normalización de URL, deduplicación, fusión de fallos de caché, fallos de proveedores parciales, paginación y cursores, indexación local incremental, y tools/list/tools/call reales con clientes MCP stdio.

Consejos de uso de resultados

MCP devuelve metadatos de descubrimiento y licencias de activos, no reemplaza los términos finales de las páginas fuente. Las licencias desconocidas se mantienen explícitamente como id: null; antes de publicar, se puede reducir el alcance con commercial, cc0 o no-attribution, y guardar la fuente y la atribución en get_game_asset.

Available Tools

4 tools
get_game_assetGet game asset detailsA
Read-onlyIdempotent

Read the full normalized record for an asset returned by search_game_assets, including files, license guidance, alternates, and attribution text.

ParametersJSON Schema
NameRequiredDescriptionDefault
asset_idYesassetId returned by search_game_assets.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 assetsA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoincremental
max_filesNoOptional cap for this scan.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 sourcesA
Read-onlyIdempotent

List provider ids, supported asset kinds, enablement state, local index state, and active limits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 assetsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoOptional style or content tags.
limitNoResults per page.
queryYesWhat to find. Chinese and English game-development terms are accepted.
typesNoOptional normalized asset kinds.
cursorNoOpaque nextCursor returned by the previous page. Keep all other query arguments unchanged.
formatsNoOptional file extensions such as png, glb, wav, or zip.
refreshNoBypass the query cache for the first page.
sourcesNoProvider ids from list_asset_sources. Empty means every enabled source.
license_policyNoany, commercially usable, CC0/public domain, or no-attribution only.any
include_unknown_licenseNoWhen a restrictive license policy is selected, retain results whose license is unknown.

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

  1. 4 tool updatesv1.0.0
    • First observedget_game_asset
    • First observedindex_local_assets
    • First observedlist_asset_sources
    • First observedsearch_game_assets

TDQS

A4.2/5.0

Scored across 4 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • 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.
    138 npm
    1
    ISC
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that aggregates web search results from multiple engines and optionally renders pages to Markdown, providing a unified search interface.
    17 npm
    3
    ISC