loading…
Search for a command to run...
loading…
Automates mobile game dailies on BlueStacks via ADB using a dual-LLM architecture with vision and action models, configurable through a web dashboard.
Automates mobile game dailies on BlueStacks via ADB using a dual-LLM architecture with vision and action models, configurable through a web dashboard.
Don't have time to play your gacha games? Here's a solution, a Python MCP server that automates mobile game dailies on BlueStacks via ADB. Uses a dual-LLM architecture: one vision model reads the screen, a rule engine decides what to do, and an action model executes through ADB. Game-agnostic — works with any game by configuring task steps through a web dashboard.
All configuration lives in SQLite. No .env files.
The system runs a loop for each task:
execute action. It receives the goal, the current scene, and access to tools (tap, swipe, wait, etc.). Executes minimum actions, then yields control back.Tasks are defined as ordered lists of steps. Each step has a vision prompt, conditions, and configurable match/fail behaviors (advance, retry, goto, abort, etc.). This means you can build complex automation flows without writing code.
git clone https://github.com/friedice5467/gacha-daily-mcp.git
cd gacha-daily-mcp
docker compose up --build
Open http://localhost:8420. The database is created automatically.
The container connects to BlueStacks on the host via host.docker.internal:5555. You can change the ADB host/port through the API (PUT /api/config/adb).
git clone https://github.com/friedice5467/gacha-daily-mcp.git
cd gacha-daily-mcp
uv sync --dev
uv run python -m src.server.main
http://localhost:8420Screenshot -> Vision LLM -> Scene JSON -> Rule Engine -> Action LLM -> ADB
|
(conditions)
match: next / execute / goto / loop / complete
fail: retry / skip / abort / execute / complete
{
"name": "Arknights auto-farm",
"game_package": "com.YoStarEN.Arknights",
"steps": [
{
"name": "Wait for main menu",
"vision_prompt": "Is this the main menu? Look for the Terminal button.",
"conditions": [{"field": "screen", "op": "eq", "value": "main_menu"}],
"on_match": "next",
"on_fail": "retry",
"max_retries": 10,
"timeout_seconds": 60
},
{
"name": "Check stamina",
"vision_prompt": "Read the current stamina value.",
"conditions": [{"field": "state.stamina_current", "op": "gte", "value": 30}],
"on_match": "next",
"on_fail": "complete"
},
{
"name": "Start quest",
"vision_prompt": "Is there a quest ready to start?",
"conditions": [{"field": "state.quest_available", "op": "eq", "value": true}],
"on_match": {"action": "execute", "goal": "Start the highest available quest with auto-battle"},
"on_fail": "complete"
}
]
}
Conditions support: eq, neq, gt, gte, lt, lte, contains, exists. Dot-path field access (state.stamina_current). AND by default, wrap in {"any": [...]} for OR.
src/
server/ # MCP server, database, entrypoint
adb/ # ADB client, coordinate normalization, device discovery
llm/ # LLM adapters (Claude, OpenAI-compatible), tool parser, factory
tools/ # MCP tool definitions (tap, swipe, screenshot, memory, etc.)
engine/ # Vision pipeline, rule evaluator, action executor, task loop, scheduler
safety/ # Rate limiter, guards, emergency stop
dashboard/ # FastAPI routes + vanilla HTML/JS dashboard
tests/ # 92 tests
Python 3.12, asyncio, MCP SDK, adbutils, Pillow, anthropic, openai, httpx, aiosqlite, FastAPI, APScheduler, structlog, pydantic.
uv run pytest
MIT
Run in your terminal:
claude mcp add gacha-daily-mcp -- npx Security
Low riskAutomated heuristic from public metadata — not a security guarantee.