# get_public_activity

Get the frozen calendar or streak fields explicitly granted to public MCP for a profile.

Endpoint: https://seorak-public-directory.glendonchin.workers.dev/mcp/public over Streamable HTTP. Read-only, and no key.

## Input

- `profileSlug` (string, required) Public profile slug. 1 to 63 characters, matching `^[a-z0-9]+(?:-[a-z0-9]+)*$`.

## Structured content

- `apiVersion` (string) Always v1 on this surface.
- `publicationVersion` (integer) Monotonic version of the publication behind this projection.
- `publishedAt` (string) When the publication first became public.
- `updatedAt` (string) When the current projection was written.
- `revokedAt` (string | null) Always null on a public read; a revoked item is not served.
- `surface` (string) Which grant produced this projection. Each surface is a separate decision. One of: web, api, mcp.
- `profileSlug` (string) The public profile slug.
- `timeZone` (string) IANA zone the calendar days are bucketed in.
- `period` (object) Window the calendar covers.
  - `from` (string) First day in range, as a calendar date.
  - `through` (string) Last day in range, inclusive.
- `fields` (object) Only the frozen activity this surface's allowlist selected.
  - `calendar` (object, optional) Frozen day-by-day record. Readers never recompute it.
    - `days` (object[]) One entry per day in the period.
      - `date` (string) The calendar day, in the profile's time zone.
      - `distinctSessionCount` (integer | null) Null unless the day can be claimed. Zero is valid only with complete coverage.
      - `active` (boolean | null) False is valid only for a complete day with a measured zero.
      - `coverage` (string) How much of the day the record can account for. One of: complete, partial, unavailable.
      - `availability` (object) Why a day could not be claimed, when it could not.
        - `state` (string) Whether the source could support the claim at all. One of: available, partial, unavailable.
        - `reason` (string | null) Null when fully available; otherwise a stable capability gap. Never treat a gap as a zero. One of: not-captured, not-retained, not-yet-computed, outside-credential-restriction, temporarily-unavailable, result-limit.
    - `generatedAt` (string) When the calendar was frozen.
    - `freshness` (object) Age of the frozen calendar.
      - `state` (string) Freshness travels with the frozen claim rather than being inferred by the reader. One of: fresh, stale, revalidating.
      - `generatedAt` (string) When this projection was derived.
      - `dataThrough` (string | null) Latest source observation included, or null for an honest-empty result.
      - `staleAt` (string) Boundary after which a caller must describe the projection as stale.
  - `streak` (object, optional) Frozen streak state, including its honest-unknown form.
    - `status` (string) Unknown means the walk backward hit a day it could not account for. One of: known, unknown.
    - `days` (integer | null) Streak length, or null when status is unknown.
    - `start` (string | null) First day of the streak, when it is known.
    - `through` (string) Last day considered.
    - `blockedAt` (string | null) First partial or unavailable day reached while walking backward.
    - `completeActiveDaysSinceBoundary` (integer) Honest lower bound. Never present this as the streak length.

## Example

```json
{
  "name": "get_public_activity",
  "arguments": {
    "profileSlug": "ada"
  }
}
```

```json
{
  "apiVersion": "v1",
  "publicationVersion": 7,
  "publishedAt": "2026-06-14T09:00:00.000Z",
  "updatedAt": "2026-07-30T16:20:00.000Z",
  "revokedAt": null,
  "surface": "api",
  "profileSlug": "ada",
  "timeZone": "Europe/Oslo",
  "period": {
    "from": "2026-07-29",
    "through": "2026-07-31"
  },
  "fields": {
    "calendar": {
      "days": [
        {
          "date": "2026-07-29",
          "distinctSessionCount": 3,
          "active": true,
          "coverage": "complete",
          "availability": {
            "state": "available",
            "reason": null
          }
        },
        {
          "date": "2026-07-30",
          "distinctSessionCount": null,
          "active": null,
          "coverage": "unavailable",
          "availability": {
            "state": "unavailable",
            "reason": "not-captured"
          }
        }
      ],
      "generatedAt": "2026-08-01T06:00:00.000Z",
      "freshness": {
        "state": "fresh",
        "generatedAt": "2026-08-01T06:00:00.000Z",
        "dataThrough": "2026-07-31T23:59:59.000Z",
        "staleAt": "2026-08-08T06:00:00.000Z"
      }
    },
    "streak": {
      "status": "known",
      "days": 6,
      "start": "2026-07-24",
      "through": "2026-07-31",
      "blockedAt": null,
      "completeActiveDaysSinceBoundary": 6
    }
  }
}
```

## More

- Surface overview: https://seorak.app/docs/mcp.md
- Whole reference in one document: https://seorak.app/llms-full.txt
- Machine-readable HTTP schema: https://seorak.app/openapi.json

---

Source: https://seorak.app/docs/mcp/get_public_activity
This document: https://seorak.app/docs/mcp/get_public_activity.md
