stronghold-mcp@0.1.0
VERIFIEDPublisher claims: "Enables AI agents to play Arknights: Stronghold Protocol like a player over MCP by observing game state, querying game data, sending protocol actions, and running the game's client-side battle simulation. It bridges agents to a compatible game server through a read-only plugin and supports both direct MCP and Python SDK usage." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Server started and answered tools/list.- Tested
- MCP initialize and tools/list · every tool description, for hidden instructions · every file read, file written and host contacted by what ran
- Not tested
- what the tools do when called with real credentials
Before you give it your token
- It will ask for
MCP_HTTP_PASSWORDSP_AUTH_PASSWORDSP_AUTH_USERSTRONGHOLD_AUTH_COOKIESTRONGHOLD_AUTH_PASSWORDSTRONGHOLD_AUTH_USERConfiguration, not credentials: DRIVER_HOST, DRIVER_LOG, DRIVER_MCP, DRIVER_PORT, DRIVER_TIMEOUT, MCP_HTTP_HOST, MCP_HTTP_IDLE_SECONDS, MCP_HTTP_PORT, MCP_HTTP_USER, MCP_TRANSPORT, STRONGHOLD_BATTLE_MODE, STRONGHOLD_DATA_DIR, STRONGHOLD_FIELD_REGION, STRONGHOLD_HTTP_URL, STRONGHOLD_LOCAL_BATTLE, STRONGHOLD_MCP_TOOLS, STRONGHOLD_NAME, STRONGHOLD_RECORD_DIR, STRONGHOLD_SIM_AUTODISCOVER, STRONGHOLD_SIM_CACHE, STRONGHOLD_SIM_ROOT, STRONGHOLD_SIM_SPEC, STRONGHOLD_WS_URL- Where it talks to
- no vendor host named in the code
- What the honeypot saw
- no credential files read · no network
- What we could not test
- what the tools do when called with real credentials
Connect it with a scoped credential, under the guard. It asks for MCP_HTTP_PASSWORD, SP_AUTH_PASSWORD, SP_AUTH_USER, STRONGHOLD_AUTH_COOKIE, STRONGHOLD_AUTH_PASSWORD, STRONGHOLD_AUTH_USER and talks to its vendor. Give the credential to the guard, not the server: the value never enters the server's environment and only travels to the host you bind.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios) on 2026-11-12 and scored it 86/100 (Verified). It did what it claims and nothing else we could detect: no undeclared network egress, no credential reads, no persistent instruction writes. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 23 s · 2 scenarios · 0 deviationsStatic findings
it('loads .env without overriding the environment', () => {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* The repository's `.env` is loaded first (variables already in the environment win). Everything theFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.throws(() => diskRelFor('/sim/../../../etc/passwd'), /escapes the root/);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.const file = join(mkdtempSync(join(tmpdir(), 'stronghold-env-')), '.env');Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* Environment (the repository's `.env` is loaded first; variables already set win)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.// the environment and `.env` both override them.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.it('reads DRIVER_TIMEOUT in seconds, as .env.example and the Python SDK do', () => {Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.equal(loadDotEnv(join(tmpdir(), 'no-such-dir', '.env')), null, 'a missing .env is not an error');Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* one value in `.env` means the same thing on both sides of the socket.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* DRIVER_TIMEOUT is in **seconds**, the same unit the Python SDK, the README and `.env.example` use, soFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* Load the repository's `.env`, so the documented `cp .env.example .env` actually configures theFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.assert.equal(call('/x/stronghold-agent/file', '?path=/etc/passwd').ok, false);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# repository's .env). If they are not already there, one of these can supply them WITHOUT ever writingFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.export const DEFAULT_ENV_FILE = resolve(dirname(fileURLToPath(import.meta.url)), '..', '.env');Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.