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 "Deploy 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
Available Tools
1 toolhealth_checkHealth CheckARead-onlyIdempotent
Check the health and configuration status of the MCP server.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate safe, idempotent, non-destructive behavior. The description adds value by specifying 'configuration status' alongside health, providing context beyond what annotations cover. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that is front-loaded with the core purpose. No wasted words, earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema, clear annotations), the description is complete. It fully explains what the tool does without needing additional detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and schema coverage is 100%, so baseline is 3. The description is not required to explain parameters, and it does not add unnecessary information, making it appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Check the health and configuration status of the MCP server.' It uses a specific verb ('Check') and resource ('health and configuration status'), and there are no sibling tools to distinguish from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (health check) but does not provide explicit guidance on when to use it versus alternatives. Since there are no sibling tools, the lack of exclusion is acceptable but still minimal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.0.0- First observed
health_check
TDQS
Scored across 1 tool
Only one tool exists, so there is no possibility of confusion between tools.
With a single tool, naming consistency is trivially maintained.
A single health check tool is an extreme mismatch for a server; it suggests the server's scope is too narrow or trivial.
The tool surface is severely incomplete for any meaningful domain, offering only a health check with no functional capabilities.
Maintenance
Related MCP Connectors
An MCP server that gives your AI access to the source code and docs of all public github repos
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
- FlicenseBqualityDmaintenanceAn MCP server that integrates Google Search Console and Google Analytics 4 to provide unified SEO and web traffic analysis. It allows users to fetch search performance data, merge page metrics, and generate automated trend reports or actionable insights through tool calls.16-
- AlicenseBqualityDmaintenanceAn MCP server integrating Google Analytics 4, Search Console, and Indexing API, enabling AI agents to run reports, inspect URLs, manage properties, and request indexing.16138 npmMIT
- FlicenseAqualityDmaintenanceAn MCP server that provides Google Analytics and Search Console data as tools for AI assistants, enabling natural language queries for web analytics, SEO performance, and site insights.13-
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server that gives AI clients access to Google Search Console data, enabling natural language queries about traffic, rankings, and SEO opportunities.91 npmMIT