Atlas / MCP servers / mehfuzh / anacraft

anacraftCAUTION

mcp/mehfuzh/anacraft

Google Analytics, mined block by block — Minecraft-themed TUI dashboard for GA4

Verdict
CAUTION
Grade
B
Trust score
88 /100
Exposed tools
10 9r · 1w · 0d
Transport
streamable-http
License
Apache-2.0
Stars
1
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

⛏ craft

Ask GA4 in plain English.

Connects your assistant to Google Analytics 4 through an MCP server, so you can ask how your site is doing and get the answer from your own numbers. Its dashboard at app.anacraft.dev creates the property and hands you the tag; the CLI audits what it is measuring so you can fix what is wrong, and reads it back as a terminal dashboard.

anacraft.dev · Releases ·

craft dash --demo · osaka-jade · 132×52

Install

macOS / Linux

curl -fsSL https://anacraft.dev/install.sh | bash

Installs to /usr/local/bin when that is writable, otherwise ~/.local/bin — never with sudo. Set INSTALL_DIR to choose somewhere else:

curl -fsSL https://anacraft.dev/install.sh | INSTALL_DIR=~/bin bash

From source

cargo install --git https://github.com/mehfuzh/anacraft

Manual — grab a binary from Releases, extract it, and put anacraft on your PATH.

Quick start

anacraft with no command ope

Read from source at commit 681c37fb61ffOBSERVED · 2026-10-11
02

Exposed tools (10)

9 read · 1 write · 0 destructive.

ToolRiskDescription
configure_sitewriteSet up GA4 for a domain the account does not measure yet: creates the \ property and its web data stream and returns the gtag.js snippet to paste \ into the site
list_countriesreadCountries the period
list_eventsreadEvents over the period, ranked by count, with the per-day total for this \ period and the one before it so a rise or fall is visible.
list_pagesreadMost-visited pages over the period, ranked by page views.
list_propertiesreadEvery GA4 property the signed-in account can read, and which one is the \ saved default. Read-only: this cannot change the default.
list_referrersreadThe URLs that sent traffic, ranked by sessions. Use this for \
list_traffic_sourcesreadWhere traffic arrives from, as GA4
live_visitorsreadWho is on the site right now — active users in the last 30 minutes, broken \ down by country. Realtime, so it ignores the
search_eventsreadEvents whose name contains a substring, ranked by count — \ \
search_pagesreadPages whose path contains a substring, ranked by page views — \ \
03

Trust audit

CAUTIONgrade B · trust 88/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (8 observation(s))
Network
declared (11 observation(s))
Shell
none-observed
Dependencies
pinned
Secrets in source
none-found

Findings (21)

MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
src/achievements.rs:54
title: "Beacon Lit",
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
src/achievements.rs:164
assert!(!found.iter().any(|a| a.title == "Beacon Lit"));
LOWInventory / provenance · inv.hidden_file · CWE-1104
docs/.nojekyll
.nojekyll
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/serve/views.rs:43
const STYLE: &str = include_str!("../../assets/serve.css");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/serve/views.rs:1952
("layout.html", include_str!("../../templates/layout.html")),
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/serve/views.rs:1953
("start.html", include_str!("../../templates/start.html")),
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/serve/views.rs:1954
("signin.html", include_str!("../../templates/signin.html")),
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/serve/views.rs:1955
("waiting.html", include_str!("../../templates/waiting.html")),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.claude/skills/anacraft/references/mcp.md:76
Then point the client at `http://127.0.0.1:7777/v1/mcp`:
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.claude/skills/anacraft/references/mcp.md:79
claude mcp add --transport http anacraft http://127.0.0.1:7777/v1/mcp \
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/mcp.html:441
<pre class="code">http://127.0.0.1:7777/v1/mcp?token=&lt;token&gt;</pre>
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/mcp.html:444
'http://127.0.0.1:7777/v1/mcp?token=&lt;token&gt;'</code> — and a client with somewhere to put a
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/serve.html:377
<span class="d">  anacraft serving on http://127.0.0.1:52413</span>
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/alerts.html:372
<p>The webhook Slack hands back is a credential: anyone holding it can post to that channel. So it
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/serve.html:490
<p>The server owns the flow, because it owns the credentials. <code>POST /v1/session</code> opens the
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/burn.html:414
read with your own credentials and published as one integer, against an id that names nothing.
Why it matters. asks the agent to read credentials
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
.claude/skills/anacraft/SKILL.md:40
curl -fsSL https://anacraft.dev/install.sh | bash
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
.claude/skills/anacraft/references/troubleshooting.md:23
| `found nowhere writable to install to` | Installer could not write to `/usr/local/bin` or `~/.local/bin` | `INSTALL_DIR=~/bin curl ... \| bash` |
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
.claude/skills/anacraft/references/troubleshooting.md:24
| `could not work out the latest release` | GitHub API unreachable or rate-limited | `VERSION=v0.6.0 curl ... \| bash` to pin one |
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
README.md:35
curl -fsSL https://anacraft.dev/install.sh | bash
INFOSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
docs/_of.html:399
<span class="c">curl -fsSL https://anacraft.dev/install.sh | bash</span>

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 681c37fb61fffull audit observations/trust-audit/mcp-server/mehfuzh__anacraft.json · Report an issue / request a re-scan
04

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11681c37fb61ffCAUTIONB88first audit
05

Questions

What is the anacraft MCP server?

Google Analytics, mined block by block — Minecraft-themed TUI dashboard for GA4

What tools does anacraft expose?

10 in total: 9 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is anacraft safe to connect to an agent?

With care. The audit graded it B (88/100) and found 21 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does anacraft need?

It reads GITHUB_TOKEN, STRIPE_SECRET_KEY and SUPABASE_SERVICE_ROLE_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does anacraft run?

It speaks streamable-http, so it runs as a service you connect to over the network.

How current is this page?

The grade is for one exact copy of the source (681c37fb61ff), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement