Borrowing it
Nothing to install: this file belongs to DeepBlueCoding/mcp-replay-dota2. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/DeepBlueCoding/mcp-replay-dota2/master/.claude/skills/add-replay-collector-service/SKILL.mdgit clone --depth 1 https://github.com/DeepBlueCoding/mcp-replay-dota2Wrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/deepbluecoding/mcp-replay-dota2/add-replay-collector-service)<a href="https://agentmods.dev/skills/deepbluecoding/mcp-replay-dota2/add-replay-collector-service"><img src="https://agentmods.dev/badge/skills/deepbluecoding/mcp-replay-dota2/add-replay-collector-service/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/deepbluecoding/mcp-replay-dota2/add-replay-collector-service"><img src="https://agentmods.dev/badge/skills/deepbluecoding/mcp-replay-dota2/add-replay-collector-service.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00147 | $0.01344 |
| Opus 5 | $0.00073 | $0.00672 |
| Sonnet 5 | $0.00029 | $0.00269 |
| Haiku 4.5 | $0.00015 | $0.00134 |
Grade A, and why
add-replay-collector-service scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 90 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Add a replay collector service to mcp-replay-dota2
Read CLAUDE.md (repo root) first for python-manta attribute/enum rules, lane naming, and the
tests+docs policy. This skill covers the service-layer architecture those rules sit inside.
A "collector" is a service: business logic that takes a parsed replay and returns models. Tools
live one layer up. To then expose the service as a tool, use the add-mcp-tool skill.
Layer order (never bypass)
external (tools/CLI/web) -> services -> python-manta. Tools must hold no extraction logic;
services must hold no MCP code. Adding a service is purely a services-layer change until step 7.
The input contract
Every public service method takes a ParsedReplayData (from
src.services.models.replay_data). It is produced ONCE by
await ReplayService.get_parsed_data(match_id) and cached on disk. Services never call
python-manta Parser and never re-parse — they read everything from the single passed-in
ParsedReplayData. ReplayService does the one-and-only single-pass parser.parse(...) with the
combat-log types and entity interval_ticks requested together.
Workflow
- Create the package:
src/services/<domain>/__init__.pyandsrc/services/<domain>/<domain>_service.py. The__init__.pyexports the class. - Class shape: a
class <Domain>Service:whose public methods takeParsedReplayData(plus optional filters / aGameContext) and return Pydantic models. - Constructor injection for cross-service dependencies — match the existing pattern:
# src/services/rotation/rotation_service.py def __init__(self, combat_service=None, fight_service=None): self._combat = combat_service or CombatService() self._fight = fight_service or FightService()FightService(combat_service=...)andRotationService(combat_service=..., fight_service=...)are the live examples. The entry point wires the real singletons; theor Default()fallback keeps the service usable standalone (e.g. in tests). - NO MCP imports. Add
NO MCP DEPENDENCIES.to the module docstring (every existing service does). Importingfastmcphere breaks the CLI/web reusability the whole layer exists for. - Service-layer model: add
src/services/models/<domain>_data.pywith the Pydantic return types. These are SEPARATE from the MCP response models insrc/models/— keep them distinct. Existing ones:combat_data,farming_data,jungle_data,lane_data,rotation_data,seek_data,replay_data. - GameContext when you need map geometry / team mapping: build it once via
GameContext.from_parsed_data(data)(src/models/game_context.py) and pass it in. Services that consume it import it underTYPE_CHECKINGto avoid hard coupling. - Wire the singleton in
dota_match_mcp_server.py: instantiate_<domain>_service = ...alongside the others (~line 86) and add"<domain>_service": _<domain>_serviceto theservicesdict (~line 97) so tools can reach it. - Optional export from
src/services/__init__.py__all__. Note it currently lists replay/cache/combat/fight/analyzers/jungle/lane/seek but NOT farming/rotation — exporting is optional, dict-wiring in the entry point is what actually matters. - Real-values tests under
tests/services/<domain>/using conftest fixtures only — see therun-ci-and-test-replaysskill. Never instantiateParser/get_parsed_datain a test. - CI gate (also in
CLAUDE.md):uv run ruff check src/ tests/ dota_match_mcp_server.py uv run mypy src/ dota_match_mcp_server.py --ignore-missing-imports uv run pytest
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 11d ago First seen · 90 lines · 147 tokens per session scan A 923744c8b0fb
add-replay-collector-service is a skill published in the GitHub repository DeepBlueCoding/mcp-replay-dota2 (2 stars, last pushed 3mo ago), licensed MIT. It adds 147 tokens to every session and 1,344 once invoked, about $0.0007 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
gameobject-component-destroy
Destroy one or more Components from a target GameObject. Missing (null) components are skipped — they cannot be destroyed. Use 'gameobject-find' and 'gameobject-component-get' to identify the components first.
unity-version-split
Split a C# file into Unity 6.5+ and pre-Unity 6.5 variants. Use when a file needs different implementations for different Unity versions due to API changes (e.g., EntityId vs int, GetEntityId vs GetInstanceID).
godot-signals-groups
Build event-driven, decoupled Godot 4.7 gameplay with signals and node groups: declare and emit custom signals, connect with Callables (incl. bind/one-shot), and broadcast to many nodes via groups and callgroup. Use when wiring node communication in a Godot project, replacing tight references with signals…
motion
How an agent turns a character mesh into a usable animated FBX — and how to judge whether the result is shippable.
unity-addressables
Manage Addressables groups, entries, profiles and content builds (com.unity.addressables, reflection-based).
threejs-exposure-color-grading
Build a measured exposure and grading path in Three.js. Use for a 64x36 encoded luminance meter, asynchronous readback, weighted log-average exposure, asymmetric adaptation, single tone-map ownership, and a generated 32-cube post-tone-map LUT.