gantry: Skill for Claude Code

.claude/skills/add-compound-tool/SKILL.md

add-compound-tool is a skill for Claude Code from geleynse/gantry. It costs 54 tokens per session (3,417 once invoked), scanned A, original, MIT.

A set of instructions for adding compound tools to the Gantry proxy. A compound tool combines several game-server calls, such as mining, travelling, or fleeing, into one agent request.

In plain words
What is it for?
Use it when turning a multi-step game sequence into one proxy-side tool or adding another such sequence.
Why use it?
It hides repeated calls, waiting, retries, and result checks behind a single operation.

Skill for Claude Code

Written for Claude Code: installed under .claude/.

This is geleynse/gantry's own configuration. It tells Claude Code how to work on gantry itself, so it is not a mod to install elsewhere. Copy it as a starting point and replace the rules that are about this project. Everything gantry configures →

Needs its repository: it reads a path above its own folder, which exists only inside the repository. The line is import { createDatabase, closeDb } from "../../services/database.js";.

Reuse

Borrowing it

Nothing to install: this file belongs to geleynse/gantry. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.

Copy the file
curl -O https://raw.githubusercontent.com/geleynse/gantry/main/.claude/skills/add-compound-tool/SKILL.md
Clone the repo
git clone --depth 1 https://github.com/geleynse/gantry

Made for: Claude Code.

Wrote 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.

agentmods badge for add-compound-tool

README.md
[![agentmods](https://agentmods.dev/badge/skills/geleynse/gantry/add-compound-tool/github.svg)](https://agentmods.dev/skills/geleynse/gantry/add-compound-tool)
Your own site
<a href="https://agentmods.dev/skills/geleynse/gantry/add-compound-tool"><img src="https://agentmods.dev/badge/skills/geleynse/gantry/add-compound-tool/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.

agentmods 80×15 button for add-compound-tool

Your own site · 80×15
<a href="https://agentmods.dev/skills/geleynse/gantry/add-compound-tool"><img src="https://agentmods.dev/badge/skills/geleynse/gantry/add-compound-tool.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 54 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 3,417 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce invoked
Fable 5.1 $0.00054 $0.03417
Opus 5 $0.00027 $0.01708
Sonnet 5 $0.00011 $0.00683
Haiku 4.5 $0.00005 $0.00342

Measured 9d ago against content hash a471021e4868, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-09, from the pricing page.

Security

Grade A, and why

add-compound-tool 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 9d 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.

.claude/skills/add-compound-tool/SKILL.md · 249 lines

How it starts

The opening of the file, as written. The whole thing — 249 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Adding a Compound Tool — Gantry Proxy

Compound tools orchestrate several game-server calls (with tick waits, retries, verification) behind one MCP tool call. They never talk to the game server directly — they call client.execute(...) the same way handlePassthrough does, just in a loop.

Reality check on existing docs: CONTRIBUTING.md and docs/compound-tools.md both say the canonical implementation lives in compound-tools-impl.ts. That file is now a 34-line re-export shim for backward compatibility — the real code is one file per tool under server/src/proxy/compound-tools/. Use this skill, not those two docs, for the mechanics.

File layout

server/src/proxy/compound-tools/
├── types.ts            # CompoundToolDeps, CompoundResult, GameClientLike
├── utils.ts             # stripPendingFields, waitForNavCacheUpdate, findTargets, isAmmoItem, ...
├── descriptions.ts       # COMPOUND_TOOL_DESCRIPTIONS + COMPOUND_TOOL_NAMES (test-only; dashboard has its own copy, see step 5)
├── index.ts              # barrel — re-exports every tool + types + utils
├── batch-mine.ts          # simplest example — copy this for a straight loop-with-early-exit tool
├── flee.ts                # good example of branching / edge-case handling (phantom-battle detection)
└── <name>.ts              # your new tool

Create server/src/proxy/compound-tools/<name>.ts. One file per tool, named after the tool (snake_case tool name → kebab-case filename, e.g. scan_and_attackscan-and-attack.ts).

The *Deps pattern

Every compound tool takes CompoundToolDeps (defined in compound-tools/types.ts) as its first argument — never import shared state directly:

export interface CompoundToolDeps {
  client: GameClientLike;                    // execute/waitForTick/isV2/...
  agentName: string;
  statusCache: Map<string, { data: Record<string, unknown>; fetchedAt: number }>;
  battleCache: Map<string, BattleStateForCache | null>;
  sellLog: SellLog;
  galaxyGraph: GalaxyGraph;
  persistBattleState: (agentName: string, state: BattleStateForCache | null) => void;
  upsertNote: (agentName: string, type: string, content: string) => void;
  eventBuffers?: Map<string, { events?: Array<{ type: string }> }>;
}

Read the full file on GitHub · 249 lines

Changes

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.

  1. 9d ago First seen · 249 lines · 54 tokens per session scan A a471021e4868

Subscribe to this mod's changes

add-compound-tool is a skill published in the GitHub repository geleynse/gantry (3 stars, last pushed 4d ago), licensed MIT. It adds 54 tokens to every session and 3,417 once invoked, about $0.0003 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.