Weekly Planner Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Weekly Planner 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.
An intelligent MCP server that turns your Google Calendar into actionable weekly insights through natural conversation.
Ask Claude natural questions about your schedule and get intelligent analysis:
graph LR
A[You ask Claude] --> B[Weekly Planner MCP]
B --> C[Google Calendar MCP]
C --> D[Your Google Calendar]
D --> C
C --> B
B --> AThis server demonstrates MCP chaining - it acts as both a server (to Claude) and a client (to Google Calendar MCP), providing domain-specific intelligence on top of raw calendar data.
# Clone the repository
git clone https://github.com/yourusername/weekly-planner-mcp.git
cd weekly-planner-mcp
# Install uv (Python package manager)
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
# Install dependencies
uv sync# Copy example configuration
cp config.example.json config.json
# Edit with your preferences
nano config.jsonExample config.json:
{
"calendar_ids": ["primary"],
"office_keywords": ["office", "HQ"],
"work_hours": {
"start": "09:00",
"end": "18:00"
},
"preferred_workout_times": ["morning", "lunch"],
"min_workout_duration": 60
}#### A. Create Google Cloud Project
#### B. Enable Calendar API
#### C. Configure OAuth Consent Screen
#### D. Create OAuth Credentials
#### E. Save and Authenticate
# Save credentials
mkdir -p ~/.config/google-calendar-mcp
mv ~/Downloads/client_secret_*.json ~/.config/google-calendar-mcp/gcp-oauth.keys.json
# Authenticate
export GOOGLE_OAUTH_CREDENTIALS="$HOME/.config/google-calendar-mcp/gcp-oauth.keys.json"
npx -y @cocal/google-calendar-mcp authYour browser will open - sign in and grant calendar permissions.
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"weekly-planner": {
"command": "/Users/yourusername/.local/bin/uv",
"args": [
"--directory",
"/absolute/path/to/weekly-planner-mcp",
"run",
"python",
"-m",
"weekly_planner",
"--stdio"
],
"env": {
"GOOGLE_OAUTH_CREDENTIALS": "/Users/yourusername/.config/google-calendar-mcp/gcp-oauth.keys.json"
}
}
}
}Replace:
/Users/yourusername/ with your actual home directory (run echo $HOME)/absolute/path/to/weekly-planner-mcp with full path to this projectQuit Claude Desktop (⌘+Q) and reopen. Test with:
"What does my week look like?"Edit config.json to customize behavior:
{
"calendar_ids": ["primary"], // Which calendars to analyze
"office_keywords": ["office", "HQ"], // Keywords for office detection
"work_hours": {
"start": "09:00",
"end": "18:00"
},
"preferred_workout_times": ["morning", "lunch", "evening"],
"min_workout_duration": 60 // Minutes
}To include work calendars or imported calendars, first list your available calendars, then add their IDs to config.json.
See the full command in the Development section below for listing calendars.
weekly-planner-mcp/
├── src/weekly_planner/
│ ├── server.py # FastMCP server with 4 tools
│ ├── gcal_client.py # Google Calendar MCP client
│ ├── analysis.py # Core scheduling analysis logic
│ ├── models.py # Pydantic models for structured output
│ └── config.py # Configuration management
├── config.json # Your configuration
├── config.example.json # Example configuration
└── pyproject.toml # DependenciesAll tools return structured Pydantic models for type-safe, validated responses.
Week Overview:
You: What does my week look like?
Claude: Here's your week breakdown:
Monday (4.5h meetings)
• Office day detected
• Free slots: 9:00-10:00, 14:00-16:00
• 3-hour back-to-back block in morning
Tuesday (2h meetings)
• Lightest day this week
• Large gap: 11:00-17:00Workout Planning:
You: When should I book a 60-minute workout this week?
Claude: Best times ranked by quality:
1. Tuesday 11:00-12:00 (Score: 8.5/10)
• Long gap available
• Lunch time slot
• Not near office days
2. Friday 18:30-19:30 (Score: 7.8/10)
• Evening slot
• After work hoursOffice Days:
You: Which days am I going to the office?
Claude: You have 2 office days this week:
• Monday: Office all day (earliest: 9:30am)
⚠️ Early start - avoid morning gym
• Thursday: Afternoon in office (earliest: 2:00pm)
✓ Morning free for workoutcd /path/to/weekly-planner-mcp
export GOOGLE_OAUTH_CREDENTIALS="$HOME/.config/google-calendar-mcp/gcp-oauth.keys.json"
uv run python -c "
import asyncio, os
os.environ['GOOGLE_OAUTH_CREDENTIALS'] = os.path.expanduser('~/.config/google-calendar-mcp/gcp-oauth.keys.json')
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def list_cals():
params = StdioServerParameters('npx', ['-y', '@cocal/google-calendar-mcp', 'start'], env=os.environ.copy())
async with stdio_client(params) as (r, w):
async with ClientSession(r, w) as s:
await s.initialize()
result = await s.call_tool('list-calendars', {})
import json
for cal in json.loads(result.content[0].text)['calendars']:
print(f'{cal[\"summary\"]}: {cal[\"id\"]}')
asyncio.run(list_cals())
"Add calendar IDs to config.json under calendar_ids.
# Claude Desktop logs
tail -f ~/Library/Logs/Claude/mcp-server-weekly-planner.log
# Re-authenticate if needed
npx -y @cocal/google-calendar-mcp authls -la ~/.config/google-calendar-mcp/gcp-oauth.keys.jsonGOOGLE_OAUTH_CREDENTIALS is set in Claude Desktop confignpx -y @cocal/google-calendar-mcp authconfig.jsontail -f ~/Library/Logs/Claude/mcp-server-weekly-planner.logexport GOOGLE_OAUTH_CREDENTIALS="$HOME/.config/google-calendar-mcp/gcp-oauth.keys.json"
npx -y @cocal/google-calendar-mcp authThis project showcases key MCP concepts:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.