Wingolf Ai Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Wingolf Ai Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
MCP server for wingolf.vn — integrates Google Search Console, Google Analytics 4, and GitHub into a single MCP endpoint for AI clients (Claude, ChatGPT, Cursor, Codex).
cd wingolf-ai-mcp
cp .env.example .env
npm installEdit .env and fill in your credentials (see sections below).
# stdio mode (for Claude Desktop / Cursor / Codex)
npm run start:stdio
# HTTP mode (for remote clients or testing)
npm run start:http
# Dev with auto-reload
npm run devmcp-server)secrets/google-service-account.jsonNever commit this file! The.env.examplepath is/app/secrets/google-service-account.jsonwhich is mounted read-only via Docker.
https://wingolf.vn/)[email protected])123456789)GA4_PROPERTY_ID=123456789 in your .envwingolf-ai-mcpSet in .env:
GITHUB_TOKEN=github_pat_xxx
GITHUB_OWNER=your-org-or-user
GITHUB_REPO=your-repo# Build
docker compose build
# Run
docker compose up -d
# View logs
docker compose logs -f~/wingolf-ai-mcp/
├── docker-compose.yml
├── .env
└── secrets/
└── google-service-account.json # ro-mountedFor production, put the container behind Nginx or Cloudflare Tunnel with HTTPS:
location /mcp {
proxy_pass http://127.0.0.1:8787;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}https://tours.ct14a1.fun/mcpThis server uses anonymous/no-auth for dev mode. For production OAuth 2.1, see OpenAI MCP Auth docs.
Add to claude_desktop_config.json:
{
"mcpServers": {
"wingolf-ai-mcp": {
"command": "node",
"args": ["path/to/wingolf-ai-mcp/dist/index.js"],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "/path/to/secrets/google-service-account.json",
"GSC_SITE_URL": "https://wingolf.vn/",
"GA4_PROPERTY_ID": "123456789"
}
}
}
}Transport: Streamable HTTP
URL: https://tours.ct14a1.fun/mcp# Health (no auth needed)
curl https://mcp.example.com/health
# Ready (needs auth)
curl -H "Authorization: Bearer your-token" https://mcp.example.com/ready
# MCP endpoint
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-token" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
https://mcp.example.com/mcp| Tool | Description |
|---|---|
gsc_search_analytics | Full GSC search analytics query with dimensions, filters, pagination |
gsc_top_queries | Top search queries by clicks/impressions |
gsc_top_pages | Top landing pages by clicks/impressions |
ga4_run_report | Flexible GA4 report with custom dimensions and metrics |
ga4_traffic_summary | Traffic summary by channel group |
ga4_top_pages | Top pages by page views |
github_search_code | Search code in repository |
github_get_file | Fetch file contents with decoded text |
github_list_recent_commits | List recent commits |
github_list_pull_requests | List pull requests by state |
health_check | Server health and configuration status |
| Variable | Required | Default | Description |
|---|---|---|---|
PORT | No | 8787 | HTTP server port |
MCP_BEARER_TOKEN | Yes | — | Bearer token for HTTP transport auth |
GOOGLE_APPLICATION_CREDENTIALS | For GSC/GA4 | — | Path to service account JSON key file |
GSC_SITE_URL | For GSC | — | Search Console property URL |
GA4_PROPERTY_ID | For GA4 | — | GA4 property numeric ID |
GITHUB_TOKEN | For GitHub | — | GitHub fine-grained PAT |
GITHUB_OWNER | For GitHub | — | GitHub org or username |
GITHUB_REPO | For GitHub | — | GitHub repository name |
ENABLE_GITHUB_WRITE_TOOLS | No | false | Enable GitHub write tools (future) |
MCP_TRANSPORT | No | stdio | Transport mode (stdio or http) |
.env and secrets/ are excluded from gitreadOnlyHint: trueENABLE_GITHUB_WRITE_TOOLS=false)wingolf-ai-mcp/
├── package.json
├── tsconfig.json
├── Dockerfile
├── docker-compose.yml
├── .env.example
├── README.md
└── src/
├── index.ts # Entry point
├── server.ts # McpServer factory
├── transports/
│ ├── stdio.ts # Stdio transport
│ └── http.ts # HTTP transport with Bearer auth
├── config/
│ └── env.ts # Environment config & validation
├── auth/
│ └── bearer.ts # Bearer token extraction & validation
├── clients/
│ ├── gsc.ts # Google Search Console API client
│ ├── ga4.ts # Google Analytics 4 API client
│ └── github.ts # GitHub API client (Octokit)
├── tools/
│ ├── gsc.tools.ts # GSC tool registrations
│ ├── ga4.tools.ts # GA4 tool registrations
│ ├── github.tools.ts # GitHub tool registrations
│ └── index.ts # Tool registration aggregator + health_check
└── utils/
├── dates.ts # Date parsing & validation
└── errors.ts # Error normalization| Script | Description |
|---|---|
npm run dev | Watch mode with tsx |
npm run build | Compile TypeScript to dist/ |
npm run start | Run compiled server (default: stdio) |
npm run start:stdio | Force stdio transport |
npm run start:http | Force HTTP transport |
MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.