github Python analyzed 476a80f

3aKHP/prts-mcp

v2.6.2
github

MCP Server for Arknights PRTS Wiki and local game data

maintainer
3aKHP
license
MIT
first seen
2026-06-15
last seen
2026-08-12
releases · 30d
25
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 24 tools
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
skills & danger signals github-tarball
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

code evidence vts/v2.6.2 · github-tarball
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