MCP Server for Arknights PRTS Wiki and local game data
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http · http counts 24 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
find_character_appearances
-
find_speakers_in
-
get_enemy_appearances
-
get_enemy_info
-
get_item_info
-
get_operator_archives
-
get_operator_basic_info
-
get_operator_memoirs
-
get_operator_voicelines
-
get_stage_enemies
-
get_stage_info
-
get_story_summary
-
list_enemies
-
list_items
-
list_stages
-
list_stories
-
list_story_events
-
operator_artwork
-
prts_page
-
read_activity
-
read_story
-
search
-
search_prts
-
search_stories
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 476a80f · analyzer v32 · 2h ago
skills & prompt files 2
- agent-rules 3aKHP-prts-mcp-476a80f/AGENTS.md
- agent-rules 3aKHP-prts-mcp-476a80f/CLAUDE.md
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 143
filesystem 35
- fs (weak) 3aKHP-prts-mcp-476a80f/python/scripts/check_package_data.py :6
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/scripts/fetch_gamedata.py :21
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/scripts/package_operator_data.py :8
import shutil - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/config.py :11
from pathlib import Path - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/datasets.py :5
from pathlib import Path - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/images_sync.py :19
import shutil - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/stores.py :5
from pathlib import Path - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/story_character.py :16
from pathlib import Path - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/story_memoir.py :10
from pathlib import Path - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/story_reader.py :13
from pathlib import Path - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/story_search.py :13
from pathlib import Path - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/story_summary.py :8
from pathlib import Path - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/sync.py :13
import shutil - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/startup_sync.py :11
from pathlib import Path - fs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_artwork.py :10
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/conftest.py :5
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/fixtures.py :5
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_check_package_data.py :6
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_e2e.py :21
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_e2e_http.py :21
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_enemy.py :6
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_images_sync.py :10
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_item.py :6
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_operator_data.py :6
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_search.py :6
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_stage.py :6
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_stage_enemy.py :5
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_stores.py :5
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_story.py :5
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_story_character.py :19
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_story_output_channel.py :7
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_story_reader_store.py :5
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_sync_release.py :13
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_template_renderer.py :7
from pathlib import Path - fs (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_tool_surface.py :5
from pathlib import Path
shell / exec 4
- shell (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_check_package_data.py :4
import subprocess - shell (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_e2e.py :17
import subprocess - shell (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_e2e_http.py :18
import subprocess - shell (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_sync_release.py :7
import subprocess
network 7
- net 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/api/prts_wiki.py :9
import httpx - net 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/images_sync.py :24
import httpx - net 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/sync.py :24
import httpx - net 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_artwork.py :174
except Exception as exc: # noqa: BLE001 — ValueError (boundary) or httpx.HTTPError (network) - net (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_artwork_mediawiki.py :120
import httpx - net (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_e2e_http.py :17
import socket - net (weak) 3aKHP-prts-mcp-476a80f/python/tests/test_sync_release.py :90
with patch("httpx.get", return_value=_mock_release_response(tag, "zh_CN.zip", url)):
secrets 2
- secrets 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/data/sync.py :52
token = os.environ.get("GITHUB_TOKEN") - secrets 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/server.py :107
token = os.environ.get("PRTS_DEBUG_TOKEN")
tool registrations 24
- operator_artwork 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_artwork.py :365
- get_operator_archives 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :54
- get_operator_voicelines 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :66
- get_operator_basic_info 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :78
- list_enemies 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :97
- get_enemy_info 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :115
- get_stage_enemies 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :139
- get_enemy_appearances 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :161
- list_stages 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :177
- get_stage_info 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :199
- list_items 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :218
- get_item_info 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :234
- search 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_gamedata.py :252
- search_prts 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_prts.py :72
- prts_page 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_prts.py :97
- list_story_events 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_story.py :36
- list_stories 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_story.py :58
- get_story_summary 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_story.py :85
- read_story 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_story.py :108
- read_activity 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_story.py :145
- search_stories 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_story.py :212
- get_operator_memoirs 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_story.py :249
- find_character_appearances 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_story.py :277
- find_speakers_in 3aKHP-prts-mcp-476a80f/python/src/prts_mcp/tools_story.py :308
declared dependencies 5
- mcp@==2.0.0
- httpx@*
- pydantic@*
- starlette@>=0.27
- uvicorn@>=0.31