feat(mcp): get_analytics_timeslots tool for best-time-to-post analysis #83

Merged
kreativmonkey merged 1 commit from feat/mcp-analytics-timeslots into main 2026-06-14 09:37:44 +02:00

Closes #82

Fügt einen MCP-Endpoint hinzu, mit dem ein AI-Agent die beste Zeit für einen Post ermitteln kann.

Was

get_analytics_timeslots rankt Wochentag/Stunden-Slots nach historischem Engagement bereits veröffentlichter Posts.

Output pro Slot: Wochentag, Stunde, Anzahl Posts (Sample-Größe), Total- und Durchschnitts-Engagement sowie ein geglätteter Score total/(posts+1) — damit ein einzelner Glückstreffer einen ansonsten leeren Slot nicht an die Spitze setzt.

Parameter: team_id (required), timezone (IANA, z.B. Europe/Berlin, default UTC), provider (optional), days (default 90, max 366), limit (default 5, max 50).

Wie

  • domain.AggregateTimeslots bucketiert in reinem Go nach Wochentag/Stunde in der gewünschten Zeitzone (DST-korrekt) — gut testbar, identisch für beide Store-Backends.
  • store.ListTeamPostEngagement liefert pro Post das Engagement-Total innerhalb des Zeitfensters, optional nach Provider gefiltert (sqlite + postgres, je mit Test).
  • Zeitzonen-Fehler werden als Fehler zurückgegeben (kein stiller Fallback).

Tests

  • domain: Ranking nach geglättetem Schnitt, Zeitzonen-Verschiebung (inkl. Wochentag-Rollover), Limit, leere Eingabe
  • store/sqlite + store/postgres: Provider-Filter, Engagement-Summen, scheduled_at-Parsing
  • mcp: Handler-Roundtrip inkl. Berlin-Zeitzone und Fehler bei ungültiger TZ

go build ./..., go vet ./..., go test ./... und make test-postgres grün.

🤖 Generated with Claude Code

Closes #82 Fügt einen MCP-Endpoint hinzu, mit dem ein AI-Agent die **beste Zeit für einen Post** ermitteln kann. ## Was `get_analytics_timeslots` rankt Wochentag/Stunden-Slots nach historischem Engagement bereits veröffentlichter Posts. **Output pro Slot:** Wochentag, Stunde, Anzahl Posts (Sample-Größe), Total- und Durchschnitts-Engagement sowie ein geglätteter Score `total/(posts+1)` — damit ein einzelner Glückstreffer einen ansonsten leeren Slot nicht an die Spitze setzt. **Parameter:** `team_id` (required), `timezone` (IANA, z.B. `Europe/Berlin`, default UTC), `provider` (optional), `days` (default 90, max 366), `limit` (default 5, max 50). ## Wie - `domain.AggregateTimeslots` bucketiert in reinem Go nach Wochentag/Stunde in der gewünschten Zeitzone (DST-korrekt) — gut testbar, identisch für beide Store-Backends. - `store.ListTeamPostEngagement` liefert pro Post das Engagement-Total innerhalb des Zeitfensters, optional nach Provider gefiltert (sqlite + postgres, je mit Test). - Zeitzonen-Fehler werden als Fehler zurückgegeben (kein stiller Fallback). ## Tests - `domain`: Ranking nach geglättetem Schnitt, Zeitzonen-Verschiebung (inkl. Wochentag-Rollover), Limit, leere Eingabe - `store/sqlite` + `store/postgres`: Provider-Filter, Engagement-Summen, scheduled_at-Parsing - `mcp`: Handler-Roundtrip inkl. Berlin-Zeitzone und Fehler bei ungültiger TZ `go build ./...`, `go vet ./...`, `go test ./...` und `make test-postgres` grün. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(mcp): get_analytics_timeslots tool for best-time-to-post analysis
All checks were successful
CI/CD Workflow / Test Backend (Go) (pull_request) Successful in 3m8s
CI/CD Workflow / Test Frontend (Node.js) (pull_request) Successful in 1m22s
CI/CD Workflow / Test Postgres Store (pull_request) Successful in 1m25s
CI/CD Workflow / E2E (Playwright + Go) (pull_request) Successful in 7m9s
CI/CD Workflow / Build and Publish Docker Image (pull_request) Has been skipped
CI/CD Workflow / Trigger Dockhand Deployment (pull_request) Has been skipped
468d792bf4
Adds an MCP tool that ranks weekday/hour slots by historical engagement
of published posts, so AI agents can recommend the best time to schedule.

- domain.AggregateTimeslots buckets posts by weekday/hour in a chosen IANA
  timezone (DST-correct) and ranks by smoothed average engagement
- store.ListTeamPostEngagement returns per-post engagement totals for a
  team within a time window, optionally filtered by provider (sqlite +
  postgres, with tests)
- get_analytics_timeslots exposes timezone, provider, days and limit

Closes #82

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
kreativmonkey/goloom!83
No description provided.