CycleCalcs · Arazzo Workflow

Build a sun and moon calendar for a location

Version 1.0.0

One ranged request for the solar day, one for daily moon state, one for the quarter instants — a month of calendar in three calls, not ninety.

1 workflow 1 source API 1 provider
View Spec View on GitHub AstronomySpaceScienceEphemerisSunMoonPlanetsEclipsesTimeCalendarGeolocationMCPAgent-nativeArazzoWorkflows

Provider

cyclecalcs

Workflows

sunAndMoonCalendar
A per-day sun/moon table plus the lunar quarter instants.
3 steps inputs: end, lat, lon, start, tz outputs: moonDays, quarters, solarDays
1
solarDays
getSun
Sunrise, sunset, solar noon, day length and the three twilights, one row a day. lat and lon are required on this operation.
2
moonDays
getMoon
Daily phase, illumination, distance and rise/set.
3
quarters
getPhases
The exact quarter instants in the window, with supermoon status under both competing rules and any attached eclipse.

Source API Descriptions

Arazzo Workflow Specification

Raw ↑
arazzo: 1.0.1
info:
  title: Build a sun and moon calendar for a location
  version: 1.0.0
  summary: >-
    One ranged request for the solar day, one for daily moon state, one for the
    quarter instants — a month of calendar in three calls, not ninety.
sourceDescriptions:
  - name: cyclecalcs
    url: ../openapi/cyclecalcs-astronomy-openapi-original.json
    type: openapi
workflows:
  - workflowId: sunAndMoonCalendar
    summary: A per-day sun/moon table plus the lunar quarter instants.
    inputs:
      type: object
      required: [lat, lon, start, end]
      properties:
        lat: {type: number}
        lon: {type: number}
        tz: {type: string}
        start: {type: string, description: ISO date, inclusive.}
        end: {type: string, description: ISO date, inclusive.}
    steps:
      - stepId: solarDays
        description: >-
          Sunrise, sunset, solar noon, day length and the three twilights, one
          row a day. lat and lon are required on this operation.
        operationId: getSun
        parameters:
          - name: lat
            in: query
            value: $inputs.lat
          - name: lon
            in: query
            value: $inputs.lon
          - name: tz
            in: query
            value: $inputs.tz
          - name: start
            in: query
            value: $inputs.start
          - name: end
            in: query
            value: $inputs.end
          - name: step
            in: query
            value: 1d
        successCriteria:
          - condition: $statusCode == 200
        outputs:
          days: $response.body#/data
      - stepId: moonDays
        description: Daily phase, illumination, distance and rise/set.
        operationId: getMoon
        parameters:
          - name: lat
            in: query
            value: $inputs.lat
          - name: lon
            in: query
            value: $inputs.lon
          - name: tz
            in: query
            value: $inputs.tz
          - name: start
            in: query
            value: $inputs.start
          - name: end
            in: query
            value: $inputs.end
          - name: step
            in: query
            value: 1d
        successCriteria:
          - condition: $statusCode == 200
        outputs:
          days: $response.body#/data
      - stepId: quarters
        description: >-
          The exact quarter instants in the window, with supermoon status under
          both competing rules and any attached eclipse.
        operationId: getPhases
        parameters:
          - name: start
            in: query
            value: $inputs.start
          - name: end
            in: query
            value: $inputs.end
          - name: tz
            in: query
            value: $inputs.tz
        successCriteria:
          - condition: $statusCode == 200
        outputs:
          phases: $response.body#/data
    outputs:
      solarDays: $steps.solarDays.outputs.days
      moonDays: $steps.moonDays.outputs.days
      quarters: $steps.quarters.outputs.phases
x-generated: '2026-08-09'
x-method: generated
x-note: >-
  Free-tier cap is 366 daily rows for one body; a longer span returns 400
  RANGE_TOO_LARGE with a `cap` extension rather than a truncated 200.