mcp-gee-sweet@0.9.6
CAUTION· not startedPublisher claims: "MCP server for Google Workspace — Sheets, Drive, Docs (HTML or Markdown), Calendar, and Gmail." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
AUTH_METHODCREDENTIALS_CONFIGCREDENTIALS_PATHGOOGLE_APPLICATION_CREDENTIALSGOOGLE_OAUTH_CLIENT_IDGOOGLE_OAUTH_CLIENT_SECRETGOOGLE_OAUTH_REFRESH_TOKENMCP_SERVER_TOKENOAUTH_CONSENT_TIMEOUT_SECONDSTOKEN_PATHor--from-refresh-token/--sender-token/--qa-tokenConfiguration, not credentials: ACCESS_LOG_FILE, CACHE_TTL, DEBUG_LEVEL, DRIVE_FOLDER_ID, ENABLED_TOOLS, FASTMCP_HOST, FASTMCP_PORT, GMAIL_SEND, GMAIL_SEND_WARN_RECIPIENTS, HTTP_TIMEOUT_SECONDS, LIST_ALL_EVENTS_MAX_CONCURRENCY, LOG_FILE, MAX_TOOL_RESPONSE_CHARS, SERVICE_ACCOUNT_PATH- Where it talks to
- no vendor host named in the codeAlso gstatic.com, google.com — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- server startup · the tool list · tool behavior
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names gstatic.com, google.com as well as its own vendor. The guard injects AUTH_METHOD, CREDENTIALS_CONFIG, CREDENTIALS_PATH, GOOGLE_APPLICATION_CREDENTIALS, GOOGLE_OAUTH_CLIENT_ID, GOOGLE_OAUTH_CLIENT_SECRET, GOOGLE_OAUTH_REFRESH_TOKEN, MCP_SERVER_TOKEN, OAUTH_CONSENT_TIMEOUT_SECONDS, TOKEN_PATH only into requests to the host you bind (and its subdomains) and refuses the rest.
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; not started: dependency install failed; the server itself was not observed) on 2026-11-14 and scored it 79/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Access to sensitive file paths; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
--env-file PATH .env to read TEST_GMAIL_* from and write IDs toFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.dotenv.load_dotenv(Path(__file__).parent.parent / "src" / "mcp_gee_sweet" / ".env")Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.(default: <repo root>/.env)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.the script is idempotent. Fixture IDs are written to the `.env` file only,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…-response-size-cap-reevaluation-519.md` `__init__.py` loads `src/mcp_gee_sweet/.env` via `python-dotenv` before importing `server`, so env vars from that file are …Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# .env handlingFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Bootstrap package env so CREDENTIALS_PATH / TOKEN_PATH are resolved from .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.src/mcp_gee_sweet/.env, and a deny-list that misses a new one would ship it;Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# - .env, src/mcp_gee_sweet/.env, .claude/settings.local.json: copied only whenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…here stderr is dropped by the host). Runtime config lives in `src/mcp_gee_sweet/.env` (gitignored); template at `src/mcp_gee_sweet/.env.template`. **Tool registrat…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# missing. A slot may hold deliberate local edits; .env propagation is #679.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.src/mcp_gee_sweet/.env), and sets the connection's identity flag by --identity:Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.import mcp_gee_sweet # noqa: F401 (loads src/mcp_gee_sweet/.env)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.uv run python scripts/qa_gmail_fixtures.py seed # inserted fixtures + label + .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.chmod 700 "$STATE_DIR"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.chmod 700 "$PROFILE"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.# passes MCP_SERVER_TOKEN through as "" when its own .env doesn't set it.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Why `install` exists: N `npx -y` processes starting together on a cold cacheFix: Pin versions and sources; vendor anything fetched at install time.str(Path(__file__).parent / ".env"),Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.dev-logs: ## Tail MCP server log file (requires LOG_FILE set in src/mcp_gee_sweet/.env).Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.kill "$pid"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.set CACHE_TTL in the environment/.env for the startup default.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.load_dotenv(Path(__file__).parent / ".env") # env var > src/mcp_gee_sweet/.env > defaultFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.proc = subprocess.run(cmd, cwd=cwd, capture_output=True, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.RUN curl -LsSf https://astral.sh/uv/install.sh | shFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""The server's own files, as configured: credentials, `.env`, ADC key files,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Playwright servers at the same moment: concurrent `npx -y` runs on a coldFix: Pin versions and sources; vendor anything fetched at install time.tail -f $$(grep -E '^ACCESS_LOG_FILE=' src/mcp_gee_sweet/.env | cut -d= -f2)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.SEED_ONLY_FILES=(.env src/mcp_gee_sweet/.env .claude/settings.local.json)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.RUN curl -LsSf https://astral.sh/uv/install.sh | shFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.install) npx -y "$PLAYWRIGHT_MCP_PACKAGE" --version ;;Fix: Pin versions and sources; vendor anything fetched at install time.access-logs: ## Tail HTTP access log (requires ACCESS_LOG_FILE set in src/mcp_gee_sweet/.env).Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.return subprocess.run(["git", *args], cwd=ROOT, check=True, capture_output=True).stdoutFix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# A blank token counts as unset (http_auth), so let .env supply one: docker-composeFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.tail -f $$(grep -E '^LOG_FILE=' src/mcp_gee_sweet/.env | cut -d= -f2)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.echo "Installing $playwright_mcp into the npx cache"Fix: Pin versions and sources; vendor anything fetched at install time.before chmod because it can clear bits that chmod then sets.Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."""chmod `path` if it's a regular file owned by this user and looser than `mode`;Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts."""chmod the DB and its WAL sidecars to 0600: a file created before this rule,Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.``MCP_SERVER_TOKEN`` set, every ``http`` request (whatever its path) and everyFix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.as supplementary context (#352), e.g. "notes.txt: upload_ok, 40231 bytesFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.anyone else can only pick a group they belong to. When the full chown isFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.refused, the group alone is still tried (PR #1001 QA round 1). chown runsFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.# Loopback by default: any other address needs MCP_SERVER_TOKEN (http_auth.check_startup).Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.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
Not checked against OSV yet; the weekly check has not reached this version.
What would make this Verified
1 point to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim khuisman: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- File permission modification command≈ +2 on the totalRequest the narrowest permission that works; replace wildcards with the exact paths or hosts.
- npx invocation of non-well-known package≈ +2 on the totalPin versions and sources; vendor anything fetched at install time.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.
- Process kill command≈ +2 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.