You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
On a fresh clone, the google-ads MCP server connects but every tool call fails with "No credentials found", even after copying .env.example → .env and filling in all values. The documented auth flow does not actually wire credentials into the server.
This is separate from the entrypoint bug in #1 — both must be fixed for the server to work end-to-end.
Root cause
.mcp.json passes credentials via placeholder indirection:
Claude Code resolves ${VAR} in .mcp.json from the process environment that launched Claude Code — it does not auto-load the repo's .env file. So unless the user has already exported all six vars into the shell before starting Claude Code, every placeholder resolves empty.
Error calling tool 'list_accounts': No credentials found. Provide one of:
• GOOGLE_ADS_CREDENTIALS pointing to a google-ads.yaml
• GOOGLE_ADS_OAUTH_CONFIG_PATH pointing to an OAuth client JSON
But .env.example and the README both state the opposite:
.env.example: "Claude Code resolves ${VAR_NAME} placeholders in .mcp.json at server launch time."
README → Authentication: "Copy .env.example to .env and fill in..."
That instruction does not produce a working connection.
Reproduce
git clone the repo, claude --plugin-dir .
cp .env.example .env, fill in valid Google Ads credentials
gads-mcp already supports GOOGLE_ADS_CREDENTIALS pointing to a standard google-ads.yaml. Honor the existing ${VAR}-only convention from CONTRIBUTING.md by using a var that's always in the process env:
This works without the user sourcing anything, survives restarts, and aligns with the canonical Google Ads client-library location.
Doc changes needed alongside:
.env.example — remove the "Claude Code resolves .env" claim; document the ~/.google-ads.yaml path (or instruct users to export the vars / use a shell .env loader if the placeholder route is kept).
README → Authentication — same correction.
Happy to send a PR if the maintainer prefers the GOOGLE_ADS_CREDENTIALS yaml approach vs. keeping the six-var placeholder route with corrected docs.
Summary
On a fresh clone, the
google-adsMCP server connects but every tool call fails with "No credentials found", even after copying.env.example→.envand filling in all values. The documented auth flow does not actually wire credentials into the server.This is separate from the entrypoint bug in #1 — both must be fixed for the server to work end-to-end.
Root cause
.mcp.jsonpasses credentials via placeholder indirection:Claude Code resolves
${VAR}in.mcp.jsonfrom the process environment that launched Claude Code — it does not auto-load the repo's.envfile. So unless the user has alreadyexported all six vars into the shell before starting Claude Code, every placeholder resolves empty.claude mcp listconfirms it:The server then reports:
But
.env.exampleand the README both state the opposite:That instruction does not produce a working connection.
Reproduce
git clonethe repo,claude --plugin-dir .cp .env.example .env, fill in valid Google Ads credentials/reload-plugins, then ask Buddy to list accountsProposed fix
gads-mcpalready supportsGOOGLE_ADS_CREDENTIALSpointing to a standardgoogle-ads.yaml. Honor the existing${VAR}-only convention from CONTRIBUTING.md by using a var that's always in the process env:This works without the user sourcing anything, survives restarts, and aligns with the canonical Google Ads client-library location.
Doc changes needed alongside:
.env.example— remove the "Claude Code resolves.env" claim; document the~/.google-ads.yamlpath (or instruct users toexportthe vars / use a shell.envloader if the placeholder route is kept).Happy to send a PR if the maintainer prefers the
GOOGLE_ADS_CREDENTIALSyaml approach vs. keeping the six-var placeholder route with corrected docs.Environment
googleadsagent-mcpgads-mcp (FastMCP 3.4.2)