wingolf-ai-mcp
Provides tools for code search, file contents, recent commits, and pull requests in a repository.
Provides tools for flexible reports, traffic summary, and top pages via Google Analytics 4.
Provides tools for search analytics, top queries, and top pages.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@wingolf-ai-mcpshow top search queries for last month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
wingolf-ai-mcp
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).
Features
Google Search Console — search analytics, top queries, top pages
Google Analytics 4 — flexible reports, traffic summary, top pages
GitHub — code search, file contents, recent commits, pull requests
Dual transport: stdio (local) and Streamable HTTP (deploy)
Bearer token auth on HTTP transport
Read-only by design — no data deletion or modification
Related MCP server: ga4-mcp
Quick Start (local)
1. Prerequisites
Node.js 20+
A Google Cloud project with Search Console API and Analytics Data API enabled
A GitHub fine-grained personal access token
2. Clone and install
cd wingolf-ai-mcp
cp .env.example .env
npm install3. Configure environment
Edit .env and fill in your credentials (see sections below).
4. Run
# 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 devGoogle Setup
Create a Google Cloud Project
Go to Google Cloud Console
Create a new project (or select existing)
Note the Project ID
Enable APIs
Go to APIs & Services → Library
Search for and enable:
Google Search Console API
Google Analytics Data API
Create a Service Account
Go to IAM & Admin → Service Accounts
Click Create Service Account
Give it a name (e.g.,
mcp-server)Assign role: Viewer (or create a custom role with minimal permissions)
Click Done
Click the service account → Keys → Add Key → Create New Key → JSON
Save the downloaded JSON file to
secrets/google-service-account.json
Never commit this file! The
.env.examplepath is/app/secrets/google-service-account.jsonwhich is mounted read-only via Docker.
Add Service Account to Search Console
Go to Google Search Console
Select your property (e.g.,
https://wingolf.vn/)Go to Settings → Users and permissions
Click Add user
Enter the service account email (found in the JSON key file, looks like
name@project.iam.gserviceaccount.com)Set permission to Restricted (or Full — Restricted is enough for read-only)
Click Add
Add Service Account to GA4
Go to Google Analytics
Select your GA4 property
Go to Admin → Property Access Management
Click + → Add users
Enter the service account email
Select role: Viewer (or Analyst)
Click Add
Find your GA4 Property ID
In GA4 Admin, under Property Settings → Property Details
Copy the numeric Property ID (e.g.,
123456789)Set
GA4_PROPERTY_ID=123456789in your.env
GitHub Setup
Create Fine-Grained PAT
Go to GitHub Settings → Developer settings → Personal access tokens → Fine-grained tokens
Click Generate new token
Set:
Token name:
wingolf-ai-mcpExpiration: as needed
Resource owner: your org or user
Repository access: Only select repositories → choose your repo
Under Permissions → Repository permissions, set:
Contents: Read-only
Metadata: Read-only (auto-selected)
Pull requests: Read-only
Click Generate token and copy it
Set in .env:
GITHUB_TOKEN=github_pat_xxx
GITHUB_OWNER=your-org-or-user
GITHUB_REPO=your-repoDocker Deployment
Build and run
# Build
docker compose build
# Run
docker compose up -d
# View logs
docker compose logs -fDirectory structure on VPS
~/wingolf-ai-mcp/
├── docker-compose.yml
├── .env
└── secrets/
└── google-service-account.json # ro-mountedBehind Nginx / Cloudflare
For 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;
}Connecting AI Clients
ChatGPT Connector
Open ChatGPT → Settings → Connectors → Create
Enter Connector URL:
https://tours.ct14a1.fun/mcpIf connected successfully, the tools list will appear automatically
This server uses anonymous/no-auth for dev mode. For production OAuth 2.1, see OpenAI MCP Auth docs.
Claude Desktop (local stdio)
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"
}
}
}
}Cursor / Windsurf / Other MCP Clients
Transport: Streamable HTTP
URL: https://tours.ct14a1.fun/mcpTesting with curl
# 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/mcpAvailable Tools
Tool | Description |
| Full GSC search analytics query with dimensions, filters, pagination |
| Top search queries by clicks/impressions |
| Top landing pages by clicks/impressions |
| Flexible GA4 report with custom dimensions and metrics |
| Traffic summary by channel group |
| Top pages by page views |
| Search code in repository |
| Fetch file contents with decoded text |
| List recent commits |
| List pull requests by state |
| Server health and configuration status |
Environment Variables
Variable | Required | Default | Description |
| No |
| HTTP server port |
| Yes | — | Bearer token for HTTP transport auth |
| For GSC/GA4 | — | Path to service account JSON key file |
| For GSC | — | Search Console property URL |
| For GA4 | — | GA4 property numeric ID |
| For GitHub | — | GitHub fine-grained PAT |
| For GitHub | — | GitHub org or username |
| For GitHub | — | GitHub repository name |
| No |
| Enable GitHub write tools (future) |
| No |
| Transport mode ( |
Security Notes
Rotate tokens regularly — use unique bearer tokens per environment
Never commit secrets —
.envandsecrets/are excluded from gitRead-only by design — all tools are annotated
readOnlyHint: trueUse HTTPS — put behind Cloudflare, Nginx, or Caddy in production
IP allowlist — restrict access to known IPs if possible
GitHub write tools are disabled by default (
ENABLE_GITHUB_WRITE_TOOLS=false)No shell commands are executed by any tool
No arbitrary file reading — only the configured service account JSON is read
Project Structure
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 normalizationScripts
Script | Description |
| Watch mode with tsx |
| Compile TypeScript to dist/ |
| Run compiled server (default: stdio) |
| Force stdio transport |
| Force HTTP transport |
License
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sonzin/wingolf-ai-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server