Planet Fitness Capabilities

Naftiko 0.5 capability definitions for Planet Fitness - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Reconciles annual revenue by pulling membership dues from ABC Financial, retail sales from Square, personal training revenue from MINDBODY, and generating the consolidated report in NetSuite.

naftiko: "0.5"
info:
  label: "Annual Revenue Reconciliation Orchestrator"
  description: "Reconciles annual revenue by pulling membership dues from ABC Financial, retail sales from Square, personal training revenue from MINDBODY, and generating the consolidated report in NetSuite."
  tags:
    - finance
    - reconciliation
    - abc-financial
    - square
    - mindbody
    - netsuite
capability:
  exposes:
    - type: mcp
      namespace: finance-reconciliation
      port: 8080
      tools:
        - name: reconcile-annual-revenue
          description: "Given a club ID and fiscal year, pull revenue from all channels and create a consolidated report in NetSuite."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year (e.g., 2025)."
          steps:
            - name: get-membership-revenue
              type: call
              call: "abc-financial.get-annual-revenue"
              with:
                club_id: "{{club_id}}"
                year: "{{fiscal_year}}"
            - name: get-retail-revenue
              type: call
              call: "square.get-annual-sales"
              with:
                location_id: "{{club_id}}"
                year: "{{fiscal_year}}"
            - name: get-pt-revenue
              type: call
              call: "mindbody.get-annual-revenue"
              with:
                location_id: "{{club_id}}"
                year: "{{fiscal_year}}"
            - name: create-report
              type: call
              call: "netsuite.create-revenue-report"
              with:
                club_id: "{{club_id}}"
                year: "{{fiscal_year}}"
                membership_revenue: "{{get-membership-revenue.total}}"
                retail_revenue: "{{get-retail-revenue.total}}"
                pt_revenue: "{{get-pt-revenue.total}}"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: revenue
          path: "/clubs/{{club_id}}/annual-revenue"
          inputParameters:
            - name: club_id
              in: path
            - name: year
              in: query
          operations:
            - name: get-annual-revenue
              method: GET
    - type: http
      namespace: square
      baseUri: "https://connect.squareup.com/v2"
      authentication:
        type: bearer
        token: "$secrets.square_access_token"
      resources:
        - name: sales
          path: "/locations/{{location_id}}/transactions/summary"
          inputParameters:
            - name: location_id
              in: path
            - name: year
              in: query
          operations:
            - name: get-annual-sales
              method: GET
    - type: http
      namespace: mindbody
      baseUri: "https://api.mindbodyonline.com/public/v6"
      authentication:
        type: bearer
        token: "$secrets.mindbody_token"
      resources:
        - name: revenue
          path: "/site/revenue"
          inputParameters:
            - name: location_id
              in: query
            - name: year
              in: query
          operations:
            - name: get-annual-revenue
              method: GET
    - type: http
      namespace: netsuite
      baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
      authentication:
        type: bearer
        token: "$secrets.netsuite_token"
      resources:
        - name: reports
          path: "/customrecord_revenue_reconciliation"
          operations:
            - name: create-revenue-report
              method: POST

Retrieves black card spa amenity lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Black Card Spa Amenity Lookup"
  description: "Retrieves black card spa amenity lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - black
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: black
      port: 8080
      tools:
        - name: black-card-spa-amenity-lookup
          description: "Retrieves black card spa amenity lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.black-card-spa-amenity-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/black/card/spa/amenity/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: black-card-spa-amenity-lookup
              method: GET

Fetches the group fitness class schedule for a given club from the MINDBODY scheduling platform, returning class names, times, instructors, and available spots.

naftiko: "0.5"
info:
  label: "Class Schedule Retrieval"
  description: "Fetches the group fitness class schedule for a given club from the MINDBODY scheduling platform, returning class names, times, instructors, and available spots."
  tags:
    - scheduling
    - fitness
    - mindbody
capability:
  exposes:
    - type: mcp
      namespace: scheduling
      port: 8080
      tools:
        - name: get-class-schedule
          description: "Retrieve the fitness class schedule for a specific club and date range from MINDBODY."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The Planet Fitness club location identifier."
            - name: date
              in: body
              type: string
              description: "The schedule date in YYYY-MM-DD format."
          call: "mindbody.get-classes"
          with:
            location_id: "{{club_id}}"
            start_date: "{{date}}"
          outputParameters:
            - name: classes
              type: string
              mapping: "$.Classes"
  consumes:
    - type: http
      namespace: mindbody
      baseUri: "https://api.mindbodyonline.com/public/v6"
      authentication:
        type: bearer
        token: "$secrets.mindbody_token"
      inputParameters:
        - name: Api-Key
          in: header
          value: "$secrets.mindbody_api_key"
        - name: SiteId
          in: header
          value: "$secrets.mindbody_site_id"
      resources:
        - name: classes
          path: "/class/classes"
          inputParameters:
            - name: location_id
              in: query
            - name: start_date
              in: query
          operations:
            - name: get-classes
              method: GET

Retrieves club access log lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Club Access Log Lookup"
  description: "Retrieves club access log lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - club
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-access-log-lookup
          description: "Retrieves club access log lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.club-access-log-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/club/access/log/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: club-access-log-lookup
              method: GET

Orchestrates club capacity management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Capacity Management Pipeline"
  description: "Orchestrates club capacity management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - planet-fitness
    - servicenow
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-capacity-management-pipeline
          description: "Orchestrates club capacity management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "planet-fitness.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "servicenow.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "salesforce.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: planet-fitness-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Generates and distributes the daily cleaning schedule by pulling staff assignments from ADP, creating tasks in ServiceChannel, and posting the schedule to the club's Slack channel.

naftiko: "0.5"
info:
  label: "Club Cleaning Schedule Orchestrator"
  description: "Generates and distributes the daily cleaning schedule by pulling staff assignments from ADP, creating tasks in ServiceChannel, and posting the schedule to the club's Slack channel."
  tags:
    - operations
    - cleaning
    - adp
    - servicechannel
    - slack
capability:
  exposes:
    - type: mcp
      namespace: club-cleaning
      port: 8080
      tools:
        - name: generate-cleaning-schedule
          description: "Given a club ID and date, pull staff, create cleaning tasks, and post schedule to Slack."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: date
              in: body
              type: string
              description: "Schedule date in YYYY-MM-DD format."
          steps:
            - name: get-staff
              type: call
              call: "adp.get-scheduled-staff"
              with:
                location: "{{club_id}}"
                date: "{{date}}"
            - name: create-tasks
              type: call
              call: "servicechannel.create-cleaning-tasks"
              with:
                location_id: "{{club_id}}"
                date: "{{date}}"
                staff_count: "{{get-staff.count}}"
            - name: post-schedule
              type: call
              call: "slack.post-message"
              with:
                channel: "#club-{{club_id}}-ops"
                text: "Cleaning schedule for {{date}}: {{get-staff.count}} staff assigned. Tasks created: {{create-tasks.task_count}}."
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/time/v2"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: schedules
          path: "/locations/{{location}}/schedules"
          inputParameters:
            - name: location
              in: path
            - name: date
              in: query
          operations:
            - name: get-scheduled-staff
              method: GET
    - type: http
      namespace: servicechannel
      baseUri: "https://api.servicechannel.com/v3"
      authentication:
        type: bearer
        token: "$secrets.servicechannel_token"
      resources:
        - name: cleaning
          path: "/cleaning-tasks"
          operations:
            - name: create-cleaning-tasks
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves club cleanliness score lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Club Cleanliness Score Lookup"
  description: "Retrieves club cleanliness score lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - club
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-cleanliness-score-lookup
          description: "Retrieves club cleanliness score lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.club-cleanliness-score-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/club/cleanliness/score/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: club-cleanliness-score-lookup
              method: GET

Orchestrates club emergency drill coordinator across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Emergency Drill Coordinator"
  description: "Orchestrates club emergency drill coordinator across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - servicenow
    - salesforce
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-emergency-drill-coordinator
          description: "Orchestrates club emergency drill coordinator across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "servicenow.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "salesforce.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "snowflake.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Orchestrates club energy management optimizer across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Energy Management Optimizer"
  description: "Orchestrates club energy management optimizer across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - sendgrid
    - workday
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-energy-management-optimizer
          description: "Orchestrates club energy management optimizer across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "sendgrid.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "workday.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "datadog.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: sendgrid-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/pf/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: datadog-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Creates a maintenance work order in ServiceChannel for a specific piece of gym equipment, including equipment tag, issue description, and club location.

naftiko: "0.5"
info:
  label: "Club Equipment Maintenance Ticket"
  description: "Creates a maintenance work order in ServiceChannel for a specific piece of gym equipment, including equipment tag, issue description, and club location."
  tags:
    - facilities
    - maintenance
    - servicechannel
capability:
  exposes:
    - type: mcp
      namespace: facilities
      port: 8080
      tools:
        - name: create-equipment-ticket
          description: "Submit a maintenance work order for gym equipment to ServiceChannel."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: equipment_tag
              in: body
              type: string
              description: "The asset tag of the equipment needing repair."
            - name: issue_description
              in: body
              type: string
              description: "Description of the equipment issue."
          call: "servicechannel.create-work-order"
          with:
            location_id: "{{club_id}}"
            asset_tag: "{{equipment_tag}}"
            description: "{{issue_description}}"
          outputParameters:
            - name: work_order_id
              type: string
              mapping: "$.data.work_order_id"
            - name: status
              type: string
              mapping: "$.data.status"
  consumes:
    - type: http
      namespace: servicechannel
      baseUri: "https://api.servicechannel.com/v3"
      authentication:
        type: bearer
        token: "$secrets.servicechannel_token"
      resources:
        - name: work-orders
          path: "/workorders"
          operations:
            - name: create-work-order
              method: POST

Checks the status of an HVAC maintenance work order in ServiceChannel, returning current status, assigned vendor, and estimated completion date.

naftiko: "0.5"
info:
  label: "Club HVAC Work Order Status"
  description: "Checks the status of an HVAC maintenance work order in ServiceChannel, returning current status, assigned vendor, and estimated completion date."
  tags:
    - facilities
    - maintenance
    - servicechannel
capability:
  exposes:
    - type: mcp
      namespace: facilities
      port: 8080
      tools:
        - name: get-work-order-status
          description: "Retrieve the current status of a facilities work order from ServiceChannel."
          inputParameters:
            - name: work_order_id
              in: body
              type: string
              description: "The ServiceChannel work order ID."
          call: "servicechannel.get-work-order"
          with:
            work_order_id: "{{work_order_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.status"
            - name: vendor
              type: string
              mapping: "$.data.assigned_vendor"
            - name: eta
              type: string
              mapping: "$.data.estimated_completion"
  consumes:
    - type: http
      namespace: servicechannel
      baseUri: "https://api.servicechannel.com/v3"
      authentication:
        type: bearer
        token: "$secrets.servicechannel_token"
      resources:
        - name: work-orders
          path: "/workorders/{{work_order_id}}"
          inputParameters:
            - name: work_order_id
              in: path
          operations:
            - name: get-work-order
              method: GET

Orchestrates club insurance renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Insurance Renewal Pipeline"
  description: "Orchestrates club insurance renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - sendgrid
    - workday
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-insurance-renewal-pipeline
          description: "Orchestrates club insurance renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "sendgrid.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "workday.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "datadog.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: sendgrid-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/pf/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: datadog-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Retrieves lease document details for a franchise location from the document management system in Box, returning document name, lease expiration date, and download link.

naftiko: "0.5"
info:
  label: "Club Lease Document Lookup"
  description: "Retrieves lease document details for a franchise location from the document management system in Box, returning document name, lease expiration date, and download link."
  tags:
    - franchise
    - legal
    - box
capability:
  exposes:
    - type: mcp
      namespace: legal-docs
      port: 8080
      tools:
        - name: get-lease-document
          description: "Retrieve lease document metadata for a franchise club from Box."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The franchise club identifier."
          call: "box.search-files"
          with:
            query: "lease_{{club_id}}"
            type: "file"
          outputParameters:
            - name: file_name
              type: string
              mapping: "$.entries[0].name"
            - name: download_url
              type: string
              mapping: "$.entries[0].shared_link.download_url"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: search
          path: "/search"
          inputParameters:
            - name: query
              in: query
            - name: type
              in: query
          operations:
            - name: search-files
              method: GET

Orchestrates club lost and found management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Lost And Found Management Pipeline"
  description: "Orchestrates club lost and found management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - datadog
    - planet-fitness
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-lost-and-found-management-pipeline
          description: "Orchestrates club lost and found management pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "datadog.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "planet-fitness.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "servicenow.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: datadog-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: planet-fitness-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Orchestrates club maintenance preventive scheduler across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Maintenance Preventive Scheduler"
  description: "Orchestrates club maintenance preventive scheduler across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - salesforce
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-maintenance-preventive-scheduler
          description: "Orchestrates club maintenance preventive scheduler across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "salesforce.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "snowflake.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "slack.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Queries the real-time occupancy count for a specific Planet Fitness club from the crowd monitoring system, returning current headcount and percentage capacity.

naftiko: "0.5"
info:
  label: "Club Occupancy Check"
  description: "Queries the real-time occupancy count for a specific Planet Fitness club from the crowd monitoring system, returning current headcount and percentage capacity."
  tags:
    - operations
    - occupancy
    - crowd-monitoring
capability:
  exposes:
    - type: mcp
      namespace: club-operations
      port: 8080
      tools:
        - name: get-club-occupancy
          description: "Retrieve real-time occupancy data for a Planet Fitness club location."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
          call: "crowd-monitor.get-occupancy"
          with:
            location_id: "{{club_id}}"
          outputParameters:
            - name: current_count
              type: string
              mapping: "$.data.current_occupancy"
            - name: max_capacity
              type: string
              mapping: "$.data.max_capacity"
            - name: percent_full
              type: string
              mapping: "$.data.occupancy_percentage"
  consumes:
    - type: http
      namespace: crowd-monitor
      baseUri: "https://api.planetfitness.com/internal/crowd/v1"
      authentication:
        type: bearer
        token: "$secrets.crowd_api_token"
      resources:
        - name: occupancy
          path: "/locations/{{location_id}}/occupancy"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: get-occupancy
              method: GET

When a new franchise club nears opening, creates a project in Asana with all pre-opening tasks, sends franchise welcome kit details from NetSuite, and creates the club profile in Club OS.

naftiko: "0.5"
info:
  label: "Club Opening Checklist Orchestrator"
  description: "When a new franchise club nears opening, creates a project in Asana with all pre-opening tasks, sends franchise welcome kit details from NetSuite, and creates the club profile in Club OS."
  tags:
    - franchise
    - operations
    - asana
    - netsuite
    - club-os
capability:
  exposes:
    - type: mcp
      namespace: franchise-ops
      port: 8080
      tools:
        - name: initialize-club-opening
          description: "Given a new club ID and opening date, create project plan in Asana, dispatch welcome kit from NetSuite, and set up CRM profile in Club OS."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The new franchise club identifier."
            - name: club_name
              in: body
              type: string
              description: "The new club display name."
            - name: opening_date
              in: body
              type: string
              description: "Planned opening date in YYYY-MM-DD format."
          steps:
            - name: create-project
              type: call
              call: "asana.create-project"
              with:
                name: "Club Opening: {{club_name}} ({{club_id}})"
                due_date: "{{opening_date}}"
                template: "club_opening_template"
            - name: dispatch-kit
              type: call
              call: "netsuite.create-sales-order"
              with:
                item: "franchise_welcome_kit"
                ship_to: "{{club_id}}"
                required_date: "{{opening_date}}"
            - name: setup-crm
              type: call
              call: "club-os.create-location"
              with:
                club_id: "{{club_id}}"
                name: "{{club_name}}"
  consumes:
    - type: http
      namespace: asana
      baseUri: "https://app.asana.com/api/1.0"
      authentication:
        type: bearer
        token: "$secrets.asana_token"
      resources:
        - name: projects
          path: "/projects"
          operations:
            - name: create-project
              method: POST
    - type: http
      namespace: netsuite
      baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
      authentication:
        type: bearer
        token: "$secrets.netsuite_token"
      resources:
        - name: sales-orders
          path: "/salesOrder"
          operations:
            - name: create-sales-order
              method: POST
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: locations
          path: "/locations"
          operations:
            - name: create-location
              method: POST

Orchestrates club opening marketing campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Opening Marketing Campaign Pipeline"
  description: "Orchestrates club opening marketing campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - jira
    - teams
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-opening-marketing-campaign-pipeline
          description: "Orchestrates club opening marketing campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "jira.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "teams.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "sendgrid.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.teams_token"
      resources:
        - name: teams-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: sendgrid-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Orchestrates club parking lot maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Parking Lot Maintenance Pipeline"
  description: "Orchestrates club parking lot maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - salesforce
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-parking-lot-maintenance-pipeline
          description: "Orchestrates club parking lot maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "salesforce.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "snowflake.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "slack.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Aggregates key performance metrics for a club by pulling membership count from ABC Financial, revenue from NetSuite, NPS score from SurveyMonkey, and posts the daily summary to Slack.

naftiko: "0.5"
info:
  label: "Club Performance Dashboard Data Orchestrator"
  description: "Aggregates key performance metrics for a club by pulling membership count from ABC Financial, revenue from NetSuite, NPS score from SurveyMonkey, and posts the daily summary to Slack."
  tags:
    - operations
    - analytics
    - abc-financial
    - netsuite
    - surveymonkey
    - slack
capability:
  exposes:
    - type: mcp
      namespace: club-dashboard
      port: 8080
      tools:
        - name: generate-daily-dashboard
          description: "Given a club ID and date, aggregate KPIs from billing, finance, and feedback systems, then post a summary to Slack."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: date
              in: body
              type: string
              description: "The reporting date in YYYY-MM-DD format."
          steps:
            - name: get-member-count
              type: call
              call: "abc-financial.get-member-count"
              with:
                club_id: "{{club_id}}"
            - name: get-daily-revenue
              type: call
              call: "netsuite.get-daily-revenue"
              with:
                club_id: "{{club_id}}"
                date: "{{date}}"
            - name: get-nps
              type: call
              call: "surveymonkey.get-nps-score"
              with:
                club_id: "{{club_id}}"
            - name: post-dashboard
              type: call
              call: "slack.post-message"
              with:
                channel: "#club-{{club_id}}-ops"
                text: "Daily Dashboard ({{date}}):\nMembers: {{get-member-count.active_count}}\nRevenue: ${{get-daily-revenue.amount}}\nNPS: {{get-nps.score}}"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: member-count
          path: "/clubs/{{club_id}}/members/count"
          inputParameters:
            - name: club_id
              in: path
          operations:
            - name: get-member-count
              method: GET
    - type: http
      namespace: netsuite
      baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
      authentication:
        type: bearer
        token: "$secrets.netsuite_token"
      resources:
        - name: revenue
          path: "/customrecord_daily_revenue"
          inputParameters:
            - name: club_id
              in: query
            - name: date
              in: query
          operations:
            - name: get-daily-revenue
              method: GET
    - type: http
      namespace: surveymonkey
      baseUri: "https://api.surveymonkey.com/v3"
      authentication:
        type: bearer
        token: "$secrets.surveymonkey_token"
      resources:
        - name: nps
          path: "/surveys/nps/responses"
          inputParameters:
            - name: club_id
              in: query
          operations:
            - name: get-nps-score
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Orchestrates club pest control scheduling pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Pest Control Scheduling Pipeline"
  description: "Orchestrates club pest control scheduling pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - workday
    - datadog
    - planet-fitness
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-pest-control-scheduling-pipeline
          description: "Orchestrates club pest control scheduling pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "workday.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "datadog.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "planet-fitness.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/pf/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: datadog-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: planet-fitness-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Retrieves club revenue per member lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Club Revenue Per Member Lookup"
  description: "Retrieves club revenue per member lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - club
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-revenue-per-member-lookup
          description: "Retrieves club revenue per member lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.club-revenue-per-member-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/club/revenue/per/member/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: club-revenue-per-member-lookup
              method: GET

Retrieves club security camera status data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Club Security Camera Status"
  description: "Retrieves club security camera status data from the Planet Fitness fitness franchise systems."
  tags:
    - club
    - planet-fitness
    - status
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-security-camera-status
          description: "Retrieves club security camera status data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.club-security-camera-status"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/club/security/camera/status/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: club-security-camera-status
              method: GET

Orchestrates club signage update pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Signage Update Pipeline"
  description: "Orchestrates club signage update pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - slack
    - jira
    - teams
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-signage-update-pipeline
          description: "Orchestrates club signage update pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "slack.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "jira.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "teams.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.teams_token"
      resources:
        - name: teams-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Retrieves club staffing level check data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Club Staffing Level Check"
  description: "Retrieves club staffing level check data from the Planet Fitness fitness franchise systems."
  tags:
    - club
    - planet-fitness
    - check
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-staffing-level-check
          description: "Retrieves club staffing level check data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.club-staffing-level-check"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/club/staffing/level/check/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: club-staffing-level-check
              method: GET

Orchestrates club water fountain maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Club Water Fountain Maintenance Pipeline"
  description: "Orchestrates club water fountain maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - club
    - planet-fitness
    - slack
    - jira
    - teams
capability:
  exposes:
    - type: mcp
      namespace: club
      port: 8080
      tools:
        - name: club-water-fountain-maintenance-pipeline
          description: "Orchestrates club water fountain maintenance pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "slack.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "jira.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "teams.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/club"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/club"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.teams_token"
      resources:
        - name: teams-resource
          path: "/api/club"
          operations:
            - name: execute-3
              method: POST

Pulls Wi-Fi usage analytics for a club from the network management platform, returning unique device connections, peak usage hours, and bandwidth consumption.

naftiko: "0.5"
info:
  label: "Club Wi-Fi Usage Report"
  description: "Pulls Wi-Fi usage analytics for a club from the network management platform, returning unique device connections, peak usage hours, and bandwidth consumption."
  tags:
    - operations
    - it-support
    - network
capability:
  exposes:
    - type: mcp
      namespace: network-analytics
      port: 8080
      tools:
        - name: get-wifi-usage
          description: "Retrieve Wi-Fi usage analytics for a Planet Fitness club."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: date
              in: body
              type: string
              description: "Report date in YYYY-MM-DD format."
          call: "network-mgmt.get-wifi-stats"
          with:
            site_id: "{{club_id}}"
            date: "{{date}}"
          outputParameters:
            - name: unique_devices
              type: string
              mapping: "$.data.uniqueDevices"
            - name: peak_hour
              type: string
              mapping: "$.data.peakUsageHour"
            - name: bandwidth_gb
              type: string
              mapping: "$.data.bandwidthConsumedGB"
  consumes:
    - type: http
      namespace: network-mgmt
      baseUri: "https://api.planetfitness.com/internal/network/v1"
      authentication:
        type: bearer
        token: "$secrets.network_mgmt_token"
      resources:
        - name: wifi-stats
          path: "/sites/{{site_id}}/wifi-stats"
          inputParameters:
            - name: site_id
              in: path
            - name: date
              in: query
          operations:
            - name: get-wifi-stats
              method: GET

Enrolls a corporate partnership member by creating their account in ABC Financial with the corporate discount, setting up their Club OS profile, and notifying the corporate account manager in Salesforce.

naftiko: "0.5"
info:
  label: "Corporate Membership Enrollment Orchestrator"
  description: "Enrolls a corporate partnership member by creating their account in ABC Financial with the corporate discount, setting up their Club OS profile, and notifying the corporate account manager in Salesforce."
  tags:
    - membership
    - corporate
    - abc-financial
    - club-os
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: corporate-membership
      port: 8080
      tools:
        - name: enroll-corporate-member
          description: "Given employee details and corporate account ID, create discounted membership, set up CRM profile, and update the corporate account in Salesforce."
          inputParameters:
            - name: first_name
              in: body
              type: string
              description: "Employee first name."
            - name: last_name
              in: body
              type: string
              description: "Employee last name."
            - name: email
              in: body
              type: string
              description: "Employee email address."
            - name: corporate_account_id
              in: body
              type: string
              description: "The Salesforce corporate account ID."
            - name: club_id
              in: body
              type: string
              description: "The home club location."
          steps:
            - name: create-membership
              type: call
              call: "abc-financial.create-corporate-member"
              with:
                first_name: "{{first_name}}"
                last_name: "{{last_name}}"
                email: "{{email}}"
                corporate_id: "{{corporate_account_id}}"
                club_id: "{{club_id}}"
            - name: create-crm-profile
              type: call
              call: "club-os.create-member"
              with:
                first_name: "{{first_name}}"
                last_name: "{{last_name}}"
                email: "{{email}}"
                club_id: "{{club_id}}"
                source: "corporate"
            - name: update-account
              type: call
              call: "salesforce.update-account"
              with:
                account_id: "{{corporate_account_id}}"
                member_count_increment: "1"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: corporate-members
          path: "/corporate/members"
          operations:
            - name: create-corporate-member
              method: POST
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: members
          path: "/members"
          operations:
            - name: create-member
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH

Identifies a past-due member in ABC Financial, sends a payment reminder via Mailchimp transactional email, creates a follow-up task in Club OS, and escalates to collections if overdue beyond threshold.

naftiko: "0.5"
info:
  label: "Delinquent Member Recovery Orchestrator"
  description: "Identifies a past-due member in ABC Financial, sends a payment reminder via Mailchimp transactional email, creates a follow-up task in Club OS, and escalates to collections if overdue beyond threshold."
  tags:
    - billing
    - collections
    - abc-financial
    - mailchimp
    - club-os
capability:
  exposes:
    - type: mcp
      namespace: collections
      port: 8080
      tools:
        - name: recover-delinquent-member
          description: "Given a past-due member ID, send payment reminder, create CRM follow-up, and escalate if needed."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The ABC Financial member ID."
            - name: days_overdue
              in: body
              type: string
              description: "Number of days the member is past due."
          steps:
            - name: get-billing-info
              type: call
              call: "abc-financial.get-payment-status"
              with:
                member_id: "{{member_id}}"
            - name: send-reminder
              type: call
              call: "mailchimp.send-transactional"
              with:
                template: "payment_reminder"
                email: "{{get-billing-info.email}}"
                merge_vars_amount: "{{get-billing-info.past_due_balance}}"
            - name: create-followup
              type: call
              call: "club-os.create-task"
              with:
                member_id: "{{member_id}}"
                task: "Follow up on past-due balance of ${{get-billing-info.past_due_balance}}. Days overdue: {{days_overdue}}."
            - name: escalate-collections
              type: call
              call: "abc-financial.escalate-to-collections"
              with:
                member_id: "{{member_id}}"
                balance: "{{get-billing-info.past_due_balance}}"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: payments
          path: "/members/{{member_id}}/payments"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-payment-status
              method: GET
        - name: collections
          path: "/members/{{member_id}}/collections"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: escalate-to-collections
              method: POST
    - type: http
      namespace: mailchimp
      baseUri: "https://mandrillapp.com/api/1.0"
      authentication:
        type: bearer
        token: "$secrets.mandrill_api_key"
      resources:
        - name: transactional
          path: "/messages/send-template"
          operations:
            - name: send-transactional
              method: POST
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: tasks
          path: "/members/{{member_id}}/tasks"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: create-task
              method: POST

Updates in-club digital signage content by uploading a new creative asset to the DAM, pushing the content playlist update to the signage platform, and logging the change in Asana.

naftiko: "0.5"
info:
  label: "Digital Signage Content Update Orchestrator"
  description: "Updates in-club digital signage content by uploading a new creative asset to the DAM, pushing the content playlist update to the signage platform, and logging the change in Asana."
  tags:
    - marketing
    - signage
    - dam
    - asana
capability:
  exposes:
    - type: mcp
      namespace: signage
      port: 8080
      tools:
        - name: update-signage-content
          description: "Given a creative asset URL, club ID, and playlist zone, upload asset to DAM, push to signage platform, and log the update in Asana."
          inputParameters:
            - name: asset_url
              in: body
              type: string
              description: "URL of the creative asset to upload."
            - name: club_id
              in: body
              type: string
              description: "Target club location."
            - name: zone
              in: body
              type: string
              description: "Signage display zone (lobby, cardio_floor, weight_room)."
          steps:
            - name: upload-asset
              type: call
              call: "dam.upload-asset"
              with:
                source_url: "{{asset_url}}"
                folder: "signage/{{club_id}}/{{zone}}"
            - name: push-playlist
              type: call
              call: "signage-platform.update-playlist"
              with:
                location_id: "{{club_id}}"
                zone: "{{zone}}"
                asset_id: "{{upload-asset.asset_id}}"
            - name: log-change
              type: call
              call: "asana.create-task"
              with:
                project: "signage_updates"
                name: "Signage updated: {{club_id}} / {{zone}}"
                notes: "Asset {{upload-asset.asset_id}} deployed to {{zone}} at club {{club_id}}."
  consumes:
    - type: http
      namespace: dam
      baseUri: "https://dam.planetfitness.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.dam_token"
      resources:
        - name: assets
          path: "/assets"
          operations:
            - name: upload-asset
              method: POST
    - type: http
      namespace: signage-platform
      baseUri: "https://api.signagelive.com/v1"
      authentication:
        type: bearer
        token: "$secrets.signage_token"
      resources:
        - name: playlists
          path: "/locations/{{location_id}}/playlists"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: update-playlist
              method: PUT
    - type: http
      namespace: asana
      baseUri: "https://app.asana.com/api/1.0"
      authentication:
        type: bearer
        token: "$secrets.asana_token"
      resources:
        - name: tasks
          path: "/tasks"
          operations:
            - name: create-task
              method: POST

Sets up an A/B test email campaign in Mailchimp for a membership promotion, tracks open rates via Mailchimp reports, and logs the winning variant results in HubSpot.

naftiko: "0.5"
info:
  label: "Email Campaign A/B Test Orchestrator"
  description: "Sets up an A/B test email campaign in Mailchimp for a membership promotion, tracks open rates via Mailchimp reports, and logs the winning variant results in HubSpot."
  tags:
    - marketing
    - email
    - mailchimp
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: email-marketing
      port: 8080
      tools:
        - name: run-ab-test-campaign
          description: "Given two subject lines and a target segment, create an A/B test campaign in Mailchimp, then log results in HubSpot."
          inputParameters:
            - name: subject_a
              in: body
              type: string
              description: "Subject line for variant A."
            - name: subject_b
              in: body
              type: string
              description: "Subject line for variant B."
            - name: segment_id
              in: body
              type: string
              description: "The Mailchimp segment to target."
            - name: campaign_id
              in: body
              type: string
              description: "HubSpot campaign ID for logging."
          steps:
            - name: create-ab-campaign
              type: call
              call: "mailchimp.create-ab-campaign"
              with:
                subject_a: "{{subject_a}}"
                subject_b: "{{subject_b}}"
                segment_id: "{{segment_id}}"
            - name: get-results
              type: call
              call: "mailchimp.get-campaign-report"
              with:
                campaign_id: "{{create-ab-campaign.campaign_id}}"
            - name: log-results
              type: call
              call: "hubspot.create-activity"
              with:
                campaign_id: "{{campaign_id}}"
                note: "A/B test winner: {{get-results.winning_variant}}. Open rate: {{get-results.open_rate}}%."
  consumes:
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: basic
        username: "anystring"
        password: "$secrets.mailchimp_api_key"
      resources:
        - name: campaigns
          path: "/campaigns"
          operations:
            - name: create-ab-campaign
              method: POST
        - name: reports
          path: "/reports/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-report
              method: GET
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: activities
          path: "/engagements/v1/engagements"
          operations:
            - name: create-activity
              method: POST

When a new hire is approved, creates the employee record in ADP Workforce Now, provisions their club access badge, and sends a welcome email via Mailchimp with onboarding instructions.

naftiko: "0.5"
info:
  label: "Employee Hiring Orchestrator"
  description: "When a new hire is approved, creates the employee record in ADP Workforce Now, provisions their club access badge, and sends a welcome email via Mailchimp with onboarding instructions."
  tags:
    - hr
    - hiring
    - adp
    - mailchimp
capability:
  exposes:
    - type: mcp
      namespace: hr-hiring
      port: 8080
      tools:
        - name: onboard-new-hire
          description: "Given new hire details, create ADP record, provision badge, and send welcome email."
          inputParameters:
            - name: first_name
              in: body
              type: string
              description: "New hire first name."
            - name: last_name
              in: body
              type: string
              description: "New hire last name."
            - name: email
              in: body
              type: string
              description: "New hire email address."
            - name: club_id
              in: body
              type: string
              description: "Assigned club location."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
          steps:
            - name: create-employee
              type: call
              call: "adp.create-worker"
              with:
                first_name: "{{first_name}}"
                last_name: "{{last_name}}"
                email: "{{email}}"
                location_code: "{{club_id}}"
                start_date: "{{start_date}}"
            - name: provision-badge
              type: call
              call: "access-control.create-badge"
              with:
                employee_id: "{{create-employee.associate_oid}}"
                club_id: "{{club_id}}"
                name: "{{first_name}} {{last_name}}"
            - name: send-welcome
              type: call
              call: "mailchimp.send-transactional"
              with:
                template: "employee_welcome"
                email: "{{email}}"
                merge_vars_name: "{{first_name}}"
                merge_vars_club: "{{club_id}}"
                merge_vars_start: "{{start_date}}"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/hr/v2"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: workers
          path: "/workers"
          operations:
            - name: create-worker
              method: POST
    - type: http
      namespace: access-control
      baseUri: "https://api.planetfitness.com/internal/access/v1"
      authentication:
        type: bearer
        token: "$secrets.access_control_token"
      resources:
        - name: badges
          path: "/badges"
          operations:
            - name: create-badge
              method: POST
    - type: http
      namespace: mailchimp
      baseUri: "https://mandrillapp.com/api/1.0"
      authentication:
        type: bearer
        token: "$secrets.mandrill_api_key"
      resources:
        - name: transactional
          path: "/messages/send-template"
          operations:
            - name: send-transactional
              method: POST

Retrieves a payroll summary for a given employee from ADP Workforce Now, returning gross pay, net pay, deductions, and pay period.

naftiko: "0.5"
info:
  label: "Employee Payroll Summary Lookup"
  description: "Retrieves a payroll summary for a given employee from ADP Workforce Now, returning gross pay, net pay, deductions, and pay period."
  tags:
    - hr
    - payroll
    - adp
capability:
  exposes:
    - type: mcp
      namespace: hr-payroll
      port: 8080
      tools:
        - name: get-payroll-summary
          description: "Look up the most recent payroll summary for a Planet Fitness employee from ADP."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The ADP associate OID."
          call: "adp.get-pay-statement"
          with:
            associate_oid: "{{employee_id}}"
          outputParameters:
            - name: gross_pay
              type: string
              mapping: "$.payStatements[0].grossPay.amount"
            - name: net_pay
              type: string
              mapping: "$.payStatements[0].netPay.amount"
            - name: pay_period
              type: string
              mapping: "$.payStatements[0].payPeriod"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/payroll/v1"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: pay-statements
          path: "/workers/{{associate_oid}}/pay-statements"
          inputParameters:
            - name: associate_oid
              in: path
          operations:
            - name: get-pay-statement
              method: GET

Retrieves the upcoming shift schedule for a club employee from ADP Workforce Now, returning shift dates, times, and assigned club location.

naftiko: "0.5"
info:
  label: "Employee Shift Schedule Lookup"
  description: "Retrieves the upcoming shift schedule for a club employee from ADP Workforce Now, returning shift dates, times, and assigned club location."
  tags:
    - hr
    - scheduling
    - adp
capability:
  exposes:
    - type: mcp
      namespace: hr-scheduling
      port: 8080
      tools:
        - name: get-employee-shifts
          description: "Look up upcoming shift schedule for a Planet Fitness employee from ADP Workforce Now."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The ADP associate OID."
            - name: week_start
              in: body
              type: string
              description: "Start of the week in YYYY-MM-DD format."
          call: "adp.get-schedule"
          with:
            associate_oid: "{{employee_id}}"
            start_date: "{{week_start}}"
          outputParameters:
            - name: shifts
              type: string
              mapping: "$.schedules"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/time/v2"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: schedules
          path: "/workers/{{associate_oid}}/time-off-requests"
          inputParameters:
            - name: associate_oid
              in: path
            - name: start_date
              in: query
          operations:
            - name: get-schedule
              method: GET

Orchestrates equipment lifecycle replacement pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Equipment Lifecycle Replacement Pipeline"
  description: "Orchestrates equipment lifecycle replacement pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - equipment
    - planet-fitness
    - snowflake
    - slack
    - jira
capability:
  exposes:
    - type: mcp
      namespace: equipment
      port: 8080
      tools:
        - name: equipment-lifecycle-replacement-pipeline
          description: "Orchestrates equipment lifecycle replacement pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "slack.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "jira.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/equipment"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/equipment"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/equipment"
          operations:
            - name: execute-3
              method: POST

Retrieves equipment warranty status check data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Equipment Warranty Status Check"
  description: "Retrieves equipment warranty status check data from the Planet Fitness fitness franchise systems."
  tags:
    - equipment
    - planet-fitness
    - check
capability:
  exposes:
    - type: mcp
      namespace: equipment
      port: 8080
      tools:
        - name: equipment-warranty-status-check
          description: "Retrieves equipment warranty status check data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.equipment-warranty-status-check"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/equipment/warranty/status/check/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: equipment-warranty-status-check
              method: GET

When a franchise agreement approaches renewal, pulls the current agreement from NetSuite, generates a renewal proposal, sends it via DocuSign for signature, and updates the franchise record in Salesforce.

naftiko: "0.5"
info:
  label: "Franchise Agreement Renewal Orchestrator"
  description: "When a franchise agreement approaches renewal, pulls the current agreement from NetSuite, generates a renewal proposal, sends it via DocuSign for signature, and updates the franchise record in Salesforce."
  tags:
    - franchise
    - legal
    - netsuite
    - docusign
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: franchise-renewals
      port: 8080
      tools:
        - name: process-franchise-renewal
          description: "Given a franchise club ID, pull agreement, generate renewal, send for signature, and update CRM."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The franchise club identifier."
            - name: renewal_term_years
              in: body
              type: string
              description: "Renewal term in years."
          steps:
            - name: get-agreement
              type: call
              call: "netsuite.get-franchise-agreement"
              with:
                club_id: "{{club_id}}"
            - name: generate-renewal
              type: call
              call: "netsuite.create-renewal-proposal"
              with:
                club_id: "{{club_id}}"
                current_agreement: "{{get-agreement.agreement_id}}"
                term_years: "{{renewal_term_years}}"
            - name: send-for-signature
              type: call
              call: "docusign.create-envelope"
              with:
                template_id: "franchise_renewal"
                signer_email: "{{get-agreement.franchisee_email}}"
                signer_name: "{{get-agreement.franchisee_name}}"
            - name: update-salesforce
              type: call
              call: "salesforce.update-opportunity"
              with:
                club_id: "{{club_id}}"
                stage: "Renewal Sent"
                docusign_envelope: "{{send-for-signature.envelope_id}}"
  consumes:
    - type: http
      namespace: netsuite
      baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
      authentication:
        type: bearer
        token: "$secrets.netsuite_token"
      resources:
        - name: agreements
          path: "/customrecord_franchise_agreement"
          inputParameters:
            - name: club_id
              in: query
          operations:
            - name: get-franchise-agreement
              method: GET
        - name: renewals
          path: "/customrecord_franchise_renewal"
          operations:
            - name: create-renewal-proposal
              method: POST
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/accounts/{{account_id}}/envelopes"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: create-envelope
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: update-opportunity
              method: PATCH

Orchestrates franchise audit preparation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Franchise Audit Preparation Pipeline"
  description: "Orchestrates franchise audit preparation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - franchise
    - planet-fitness
    - datadog
    - planet-fitness
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: franchise
      port: 8080
      tools:
        - name: franchise-audit-preparation-pipeline
          description: "Orchestrates franchise audit preparation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "datadog.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "planet-fitness.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "servicenow.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: datadog-resource
          path: "/api/franchise"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: planet-fitness-resource
          path: "/api/franchise"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/franchise"
          operations:
            - name: execute-3
              method: POST

Orchestrates franchise communication broadcast pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Franchise Communication Broadcast Pipeline"
  description: "Orchestrates franchise communication broadcast pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - franchise
    - planet-fitness
    - servicenow
    - salesforce
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: franchise
      port: 8080
      tools:
        - name: franchise-communication-broadcast-pipeline
          description: "Orchestrates franchise communication broadcast pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "servicenow.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "salesforce.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "snowflake.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/franchise"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/franchise"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/franchise"
          operations:
            - name: execute-3
              method: POST

Triggers a franchise compliance check by pulling the club inspection results from ServiceChannel, verifying brand standards from the franchise portal, and filing findings in Salesforce as a case.

naftiko: "0.5"
info:
  label: "Franchise Compliance Audit Orchestrator"
  description: "Triggers a franchise compliance check by pulling the club inspection results from ServiceChannel, verifying brand standards from the franchise portal, and filing findings in Salesforce as a case."
  tags:
    - franchise
    - compliance
    - servicechannel
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: franchise-compliance
      port: 8080
      tools:
        - name: run-compliance-audit
          description: "Given a franchise club ID, pull inspection data, verify brand standards, and log compliance findings in Salesforce."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The franchise club identifier."
            - name: audit_date
              in: body
              type: string
              description: "The audit date in YYYY-MM-DD format."
          steps:
            - name: get-inspections
              type: call
              call: "servicechannel.get-inspections"
              with:
                location_id: "{{club_id}}"
                date: "{{audit_date}}"
            - name: get-brand-standards
              type: call
              call: "franchise-portal.get-standards"
              with:
                club_id: "{{club_id}}"
            - name: file-findings
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Compliance audit for club {{club_id}} on {{audit_date}}"
                description: "Inspection score: {{get-inspections.overall_score}}. Brand standard compliance: {{get-brand-standards.compliance_status}}."
                type: "Franchise_Compliance"
  consumes:
    - type: http
      namespace: servicechannel
      baseUri: "https://api.servicechannel.com/v3"
      authentication:
        type: bearer
        token: "$secrets.servicechannel_token"
      resources:
        - name: inspections
          path: "/locations/{{location_id}}/inspections"
          inputParameters:
            - name: location_id
              in: path
            - name: date
              in: query
          operations:
            - name: get-inspections
              method: GET
    - type: http
      namespace: franchise-portal
      baseUri: "https://franchise.planetfitness.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.franchise_portal_token"
      resources:
        - name: standards
          path: "/clubs/{{club_id}}/brand-standards"
          inputParameters:
            - name: club_id
              in: path
          operations:
            - name: get-standards
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST

Orchestrates franchise expansion feasibility pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Franchise Expansion Feasibility Pipeline"
  description: "Orchestrates franchise expansion feasibility pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - franchise
    - planet-fitness
    - planet-fitness
    - servicenow
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: franchise
      port: 8080
      tools:
        - name: franchise-expansion-feasibility-pipeline
          description: "Orchestrates franchise expansion feasibility pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "planet-fitness.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "servicenow.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "salesforce.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: planet-fitness-resource
          path: "/api/franchise"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/franchise"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/franchise"
          operations:
            - name: execute-3
              method: POST

Retrieves franchise fee calculation lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Franchise Fee Calculation Lookup"
  description: "Retrieves franchise fee calculation lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - franchise
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: franchise
      port: 8080
      tools:
        - name: franchise-fee-calculation-lookup
          description: "Retrieves franchise fee calculation lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.franchise-fee-calculation-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/franchise/fee/calculation/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: franchise-fee-calculation-lookup
              method: GET

When a new franchise inquiry arrives in Salesforce, enriches the lead with ZoomInfo data, assigns it to a franchise development rep based on territory, and sends a Slack notification to the franchise team.

naftiko: "0.5"
info:
  label: "Franchise Lead Assignment Orchestrator"
  description: "When a new franchise inquiry arrives in Salesforce, enriches the lead with ZoomInfo data, assigns it to a franchise development rep based on territory, and sends a Slack notification to the franchise team."
  tags:
    - franchise
    - sales
    - salesforce
    - zoominfo
    - slack
capability:
  exposes:
    - type: mcp
      namespace: franchise-leads
      port: 8080
      tools:
        - name: assign-franchise-lead
          description: "Given a Salesforce lead ID, enrich it with ZoomInfo, assign to territory rep, and notify the franchise team in Slack."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead record ID."
            - name: territory_code
              in: body
              type: string
              description: "The franchise territory code for assignment."
          steps:
            - name: get-lead
              type: call
              call: "salesforce.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: enrich-lead
              type: call
              call: "zoominfo.enrich-contact"
              with:
                email: "{{get-lead.Email}}"
                company: "{{get-lead.Company}}"
            - name: assign-rep
              type: call
              call: "salesforce.update-lead"
              with:
                lead_id: "{{lead_id}}"
                owner_territory: "{{territory_code}}"
                company_revenue: "{{enrich-lead.revenue}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#franchise-development"
                text: "New franchise lead: {{get-lead.FirstName}} {{get-lead.LastName}} ({{get-lead.Company}}), revenue: {{enrich-lead.revenue}}, territory: {{territory_code}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
            - name: update-lead
              method: PATCH
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: contacts
          path: "/enrich/contact"
          operations:
            - name: enrich-contact
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Orchestrates franchise legal compliance checker across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Franchise Legal Compliance Checker"
  description: "Orchestrates franchise legal compliance checker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - franchise
    - planet-fitness
    - teams
    - sendgrid
    - workday
capability:
  exposes:
    - type: mcp
      namespace: franchise
      port: 8080
      tools:
        - name: franchise-legal-compliance-checker
          description: "Orchestrates franchise legal compliance checker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "teams.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "sendgrid.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "workday.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.teams_token"
      resources:
        - name: teams-resource
          path: "/api/franchise"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: sendgrid-resource
          path: "/api/franchise"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/pf/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/api/franchise"
          operations:
            - name: execute-3
              method: POST

Orchestrates franchise performance benchmarking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Franchise Performance Benchmarking Pipeline"
  description: "Orchestrates franchise performance benchmarking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - franchise
    - planet-fitness
    - planet-fitness
    - servicenow
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: franchise
      port: 8080
      tools:
        - name: franchise-performance-benchmarking-pipeline
          description: "Orchestrates franchise performance benchmarking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "planet-fitness.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "servicenow.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "salesforce.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: planet-fitness-resource
          path: "/api/franchise"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/franchise"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/franchise"
          operations:
            - name: execute-3
              method: POST

Retrieves a franchise location's gross revenue from ABC Financial and calculates the royalty fee based on the franchise agreement terms stored in NetSuite.

naftiko: "0.5"
info:
  label: "Franchise Royalty Fee Calculator"
  description: "Retrieves a franchise location's gross revenue from ABC Financial and calculates the royalty fee based on the franchise agreement terms stored in NetSuite."
  tags:
    - franchise
    - finance
    - abc-financial
    - netsuite
capability:
  exposes:
    - type: mcp
      namespace: franchise-finance
      port: 8080
      tools:
        - name: calculate-royalty-fee
          description: "Given a franchise club ID and billing period, retrieve revenue from ABC Financial and royalty rate from NetSuite, then compute the fee."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The franchise club identifier."
            - name: billing_period
              in: body
              type: string
              description: "The billing period in YYYY-MM format."
          steps:
            - name: get-revenue
              type: call
              call: "abc-financial.get-club-revenue"
              with:
                club_id: "{{club_id}}"
                period: "{{billing_period}}"
            - name: get-agreement
              type: call
              call: "netsuite.get-franchise-agreement"
              with:
                club_id: "{{club_id}}"
            - name: post-royalty
              type: call
              call: "netsuite.create-royalty-invoice"
              with:
                club_id: "{{club_id}}"
                gross_revenue: "{{get-revenue.total_revenue}}"
                royalty_rate: "{{get-agreement.royalty_percentage}}"
                period: "{{billing_period}}"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: club-revenue
          path: "/clubs/{{club_id}}/revenue"
          inputParameters:
            - name: club_id
              in: path
            - name: period
              in: query
          operations:
            - name: get-club-revenue
              method: GET
    - type: http
      namespace: netsuite
      baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
      authentication:
        type: bearer
        token: "$secrets.netsuite_token"
      resources:
        - name: franchise-agreements
          path: "/customrecord_franchise_agreement"
          inputParameters:
            - name: club_id
              in: query
          operations:
            - name: get-franchise-agreement
              method: GET
        - name: invoices
          path: "/invoice"
          operations:
            - name: create-royalty-invoice
              method: POST

Orchestrates franchise royalty reconciliation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Franchise Royalty Reconciliation Pipeline"
  description: "Orchestrates franchise royalty reconciliation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - franchise
    - planet-fitness
    - jira
    - teams
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: franchise
      port: 8080
      tools:
        - name: franchise-royalty-reconciliation-pipeline
          description: "Orchestrates franchise royalty reconciliation pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "jira.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "teams.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "sendgrid.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/franchise"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.teams_token"
      resources:
        - name: teams-resource
          path: "/api/franchise"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: sendgrid-resource
          path: "/api/franchise"
          operations:
            - name: execute-3
              method: POST

Pulls the franchise sales pipeline from Salesforce, returning all active franchise opportunities with their stage, expected close date, and territory.

naftiko: "0.5"
info:
  label: "Franchise Sales Pipeline Report"
  description: "Pulls the franchise sales pipeline from Salesforce, returning all active franchise opportunities with their stage, expected close date, and territory."
  tags:
    - franchise
    - sales
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: franchise-sales
      port: 8080
      tools:
        - name: get-franchise-pipeline
          description: "Retrieve all active franchise opportunities from Salesforce with stage, close date, and territory details."
          inputParameters:
            - name: stage_filter
              in: body
              type: string
              description: "Optional stage to filter by (e.g., Negotiation, Proposal)."
          call: "salesforce.query-opportunities"
          with:
            query: "SELECT Id, Name, StageName, CloseDate, Territory__c FROM Opportunity WHERE RecordType.Name = 'Franchise' AND IsClosed = false AND StageName LIKE '%{{stage_filter}}%'"
          outputParameters:
            - name: opportunities
              type: string
              mapping: "$.records"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: soql
          path: "/query"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: query-opportunities
              method: GET

Queries franchise territory demographics from the territory management system, returning population density, median income, competition proximity, and territory availability score.

naftiko: "0.5"
info:
  label: "Franchise Territory Analysis"
  description: "Queries franchise territory demographics from the territory management system, returning population density, median income, competition proximity, and territory availability score."
  tags:
    - franchise
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: franchise-territory
      port: 8080
      tools:
        - name: get-territory-analysis
          description: "Retrieve demographic and competitive analysis for a franchise territory."
          inputParameters:
            - name: zip_code
              in: body
              type: string
              description: "The center ZIP code for territory analysis."
            - name: radius_miles
              in: body
              type: string
              description: "Analysis radius in miles."
          call: "territory-system.get-analysis"
          with:
            zip: "{{zip_code}}"
            radius: "{{radius_miles}}"
          outputParameters:
            - name: population
              type: string
              mapping: "$.data.population"
            - name: median_income
              type: string
              mapping: "$.data.medianIncome"
            - name: competition_count
              type: string
              mapping: "$.data.competitorCount"
  consumes:
    - type: http
      namespace: territory-system
      baseUri: "https://api.planetfitness.com/internal/territory/v1"
      authentication:
        type: bearer
        token: "$secrets.territory_token"
      resources:
        - name: analysis
          path: "/territories/analyze"
          operations:
            - name: get-analysis
              method: POST

Retrieves franchise territory map lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Franchise Territory Map Lookup"
  description: "Retrieves franchise territory map lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - franchise
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: franchise
      port: 8080
      tools:
        - name: franchise-territory-map-lookup
          description: "Retrieves franchise territory map lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.franchise-territory-map-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/franchise/territory/map/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: franchise-territory-map-lookup
              method: GET

Orchestrates franchise training compliance tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Franchise Training Compliance Tracker"
  description: "Orchestrates franchise training compliance tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - franchise
    - planet-fitness
    - jira
    - teams
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: franchise
      port: 8080
      tools:
        - name: franchise-training-compliance-tracker
          description: "Orchestrates franchise training compliance tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "jira.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "teams.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "sendgrid.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/franchise"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.teams_token"
      resources:
        - name: teams-resource
          path: "/api/franchise"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: sendgrid-resource
          path: "/api/franchise"
          operations:
            - name: execute-3
              method: POST

Pulls website traffic data for a specific club landing page from Google Analytics, returning page views, unique visitors, bounce rate, and conversion rate.

naftiko: "0.5"
info:
  label: "Google Analytics Club Traffic Report"
  description: "Pulls website traffic data for a specific club landing page from Google Analytics, returning page views, unique visitors, bounce rate, and conversion rate."
  tags:
    - marketing
    - analytics
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: get-club-traffic
          description: "Retrieve Google Analytics traffic metrics for a specific club landing page."
          inputParameters:
            - name: club_slug
              in: body
              type: string
              description: "The URL slug for the club landing page."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          call: "google-analytics.get-report"
          with:
            page_path: "/clubs/{{club_slug}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: page_views
              type: string
              mapping: "$.rows[0].metricValues[0].value"
            - name: unique_visitors
              type: string
              mapping: "$.rows[0].metricValues[1].value"
            - name: bounce_rate
              type: string
              mapping: "$.rows[0].metricValues[2].value"
  consumes:
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: get-report
              method: POST

Creates a guest pass entry in the Club OS CRM for a prospective member, including the guest name, referring member, and visit date.

naftiko: "0.5"
info:
  label: "Guest Pass Issuance"
  description: "Creates a guest pass entry in the Club OS CRM for a prospective member, including the guest name, referring member, and visit date."
  tags:
    - membership
    - guest-pass
    - club-os
capability:
  exposes:
    - type: mcp
      namespace: membership
      port: 8080
      tools:
        - name: issue-guest-pass
          description: "Create a guest pass for a prospective member in Club OS."
          inputParameters:
            - name: guest_first_name
              in: body
              type: string
              description: "Guest first name."
            - name: guest_last_name
              in: body
              type: string
              description: "Guest last name."
            - name: guest_email
              in: body
              type: string
              description: "Guest email address."
            - name: referring_member_id
              in: body
              type: string
              description: "The referring member's ID."
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
          call: "club-os.create-guest"
          with:
            first_name: "{{guest_first_name}}"
            last_name: "{{guest_last_name}}"
            email: "{{guest_email}}"
            referred_by: "{{referring_member_id}}"
            location_id: "{{club_id}}"
          outputParameters:
            - name: guest_pass_id
              type: string
              mapping: "$.data.guest_id"
  consumes:
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: guests
          path: "/guests"
          operations:
            - name: create-guest
              method: POST

Records a HydroMassage session for a Black Card member in MINDBODY and verifies their Black Card status in Club OS before allowing the session.

naftiko: "0.5"
info:
  label: "Hydromassage Usage Tracking"
  description: "Records a HydroMassage session for a Black Card member in MINDBODY and verifies their Black Card status in Club OS before allowing the session."
  tags:
    - membership
    - amenities
    - mindbody
    - club-os
capability:
  exposes:
    - type: mcp
      namespace: amenities
      port: 8080
      tools:
        - name: log-hydromassage-session
          description: "Verify member tier and record a HydroMassage session."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The member ID."
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
          steps:
            - name: verify-tier
              type: call
              call: "club-os.get-member"
              with:
                member_id: "{{member_id}}"
            - name: log-session
              type: call
              call: "mindbody.add-client-visit"
              with:
                client_id: "{{member_id}}"
                service_id: "hydromassage"
                location_id: "{{club_id}}"
  consumes:
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: members
          path: "/members/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-member
              method: GET
    - type: http
      namespace: mindbody
      baseUri: "https://api.mindbodyonline.com/public/v6"
      authentication:
        type: bearer
        token: "$secrets.mindbody_token"
      resources:
        - name: visits
          path: "/client/addclientvisit"
          operations:
            - name: add-client-visit
              method: POST

Submits a safety or incident report to the risk management system in ServiceNow, including the club location, date, incident type, and description.

naftiko: "0.5"
info:
  label: "Incident Report Submission"
  description: "Submits a safety or incident report to the risk management system in ServiceNow, including the club location, date, incident type, and description."
  tags:
    - operations
    - safety
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: safety
      port: 8080
      tools:
        - name: submit-incident-report
          description: "File a safety incident report in ServiceNow for a club location."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: incident_type
              in: body
              type: string
              description: "Type of incident (injury, property_damage, policy_violation)."
            - name: description
              in: body
              type: string
              description: "Detailed description of the incident."
            - name: incident_date
              in: body
              type: string
              description: "Date of incident in YYYY-MM-DD format."
          call: "servicenow.create-incident"
          with:
            category: "safety_incident"
            subcategory: "{{incident_type}}"
            short_description: "Safety incident at club {{club_id}} on {{incident_date}}"
            description: "{{description}}"
            location: "{{club_id}}"
          outputParameters:
            - name: incident_number
              type: string
              mapping: "$.result.number"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Checks retail inventory levels in the POS system for a specific club, returning current stock counts for merchandise items and flagging items below reorder threshold.

naftiko: "0.5"
info:
  label: "Inventory Reorder Alert"
  description: "Checks retail inventory levels in the POS system for a specific club, returning current stock counts for merchandise items and flagging items below reorder threshold."
  tags:
    - retail
    - inventory
    - square
capability:
  exposes:
    - type: mcp
      namespace: retail-inventory
      port: 8080
      tools:
        - name: check-inventory-levels
          description: "Check retail merchandise inventory levels for a club from Square."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
          call: "square.get-inventory"
          with:
            location_id: "{{club_id}}"
          outputParameters:
            - name: items
              type: string
              mapping: "$.counts"
            - name: low_stock_items
              type: string
              mapping: "$.lowStockItems"
  consumes:
    - type: http
      namespace: square
      baseUri: "https://connect.squareup.com/v2"
      authentication:
        type: bearer
        token: "$secrets.square_access_token"
      resources:
        - name: inventory
          path: "/inventory/counts/batch-retrieve"
          operations:
            - name: get-inventory
              method: POST

Creates an IT support ticket in ServiceNow for club technology issues including POS terminals, Wi-Fi, and security cameras.

naftiko: "0.5"
info:
  label: "IT Support Ticket Creation"
  description: "Creates an IT support ticket in ServiceNow for club technology issues including POS terminals, Wi-Fi, and security cameras."
  tags:
    - it-support
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-support
      port: 8080
      tools:
        - name: create-it-ticket
          description: "Submit an IT support request to ServiceNow for a club technology issue."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: category
              in: body
              type: string
              description: "IT category (pos, wifi, security_cameras, software)."
            - name: description
              in: body
              type: string
              description: "Description of the IT issue."
            - name: priority
              in: body
              type: string
              description: "Priority level (low, medium, high, critical)."
          call: "servicenow.create-incident"
          with:
            category: "{{category}}"
            short_description: "IT issue at club {{club_id}}: {{category}}"
            description: "{{description}}"
            priority: "{{priority}}"
            location: "{{club_id}}"
          outputParameters:
            - name: ticket_number
              type: string
              mapping: "$.result.number"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Updates a club's local business listing across Google Business Profile and Yelp when club hours or details change, and logs the update in Asana for the marketing team.

naftiko: "0.5"
info:
  label: "Local SEO Listing Update Orchestrator"
  description: "Updates a club's local business listing across Google Business Profile and Yelp when club hours or details change, and logs the update in Asana for the marketing team."
  tags:
    - marketing
    - seo
    - google-business
    - yelp
    - asana
capability:
  exposes:
    - type: mcp
      namespace: local-seo
      port: 8080
      tools:
        - name: update-local-listings
          description: "Given updated club details, push changes to Google Business Profile and Yelp, then log in Asana."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: hours
              in: body
              type: string
              description: "Updated hours in JSON format."
            - name: phone
              in: body
              type: string
              description: "Updated phone number."
          steps:
            - name: update-google
              type: call
              call: "google-business.update-location"
              with:
                location_id: "{{club_id}}"
                hours: "{{hours}}"
                phone: "{{phone}}"
            - name: update-yelp
              type: call
              call: "yelp.update-business"
              with:
                business_id: "{{club_id}}"
                hours: "{{hours}}"
                phone: "{{phone}}"
            - name: log-update
              type: call
              call: "asana.create-task"
              with:
                project: "local_seo"
                name: "Listings updated for club {{club_id}}"
                notes: "Google and Yelp listings updated. Hours: {{hours}}, Phone: {{phone}}."
  consumes:
    - type: http
      namespace: google-business
      baseUri: "https://mybusinessbusinessinformation.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.google_business_token"
      resources:
        - name: locations
          path: "/locations/{{location_id}}"
          inputParameters:
            - name: location_id
              in: path
          operations:
            - name: update-location
              method: PATCH
    - type: http
      namespace: yelp
      baseUri: "https://api.yelp.com/v3"
      authentication:
        type: bearer
        token: "$secrets.yelp_api_key"
      resources:
        - name: businesses
          path: "/businesses/{{business_id}}"
          inputParameters:
            - name: business_id
              in: path
          operations:
            - name: update-business
              method: PUT
    - type: http
      namespace: asana
      baseUri: "https://app.asana.com/api/1.0"
      authentication:
        type: bearer
        token: "$secrets.asana_token"
      resources:
        - name: tasks
          path: "/tasks"
          operations:
            - name: create-task
              method: POST

Pulls campaign performance from Google Ads and Facebook Ads, combines the metrics, and posts a summary report to a Slack channel for the marketing team to review.

naftiko: "0.5"
info:
  label: "Marketing Campaign Performance Orchestrator"
  description: "Pulls campaign performance from Google Ads and Facebook Ads, combines the metrics, and posts a summary report to a Slack channel for the marketing team to review."
  tags:
    - marketing
    - google-ads
    - facebook-ads
    - slack
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: generate-campaign-report
          description: "Given a campaign name and date range, pull Google Ads and Facebook Ads metrics, then post a consolidated summary to Slack."
          inputParameters:
            - name: campaign_name
              in: body
              type: string
              description: "The campaign name to report on."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          steps:
            - name: get-google-metrics
              type: call
              call: "google-ads.get-campaign-stats"
              with:
                campaign_name: "{{campaign_name}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: get-facebook-metrics
              type: call
              call: "facebook-ads.get-campaign-stats"
              with:
                campaign_name: "{{campaign_name}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-report
              type: call
              call: "slack.post-message"
              with:
                channel: "#marketing-reports"
                text: "Campaign: {{campaign_name}} ({{start_date}} to {{end_date}})\nGoogle Ads — Impressions: {{get-google-metrics.impressions}}, Clicks: {{get-google-metrics.clicks}}, Spend: {{get-google-metrics.spend}}\nFacebook — Impressions: {{get-facebook-metrics.impressions}}, Clicks: {{get-facebook-metrics.clicks}}, Spend: {{get-facebook-metrics.spend}}"
  consumes:
    - type: http
      namespace: google-ads
      baseUri: "https://googleads.googleapis.com/v14"
      authentication:
        type: bearer
        token: "$secrets.google_ads_token"
      resources:
        - name: campaigns
          path: "/customers/{{customer_id}}/googleAds:searchStream"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: get-campaign-stats
              method: POST
    - type: http
      namespace: facebook-ads
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.facebook_ads_token"
      resources:
        - name: insights
          path: "/act_{{ad_account_id}}/insights"
          inputParameters:
            - name: ad_account_id
              in: path
          operations:
            - name: get-campaign-stats
              method: GET
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves member agreement details lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Member Agreement Details Lookup"
  description: "Retrieves member agreement details lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - member
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-agreement-details-lookup
          description: "Retrieves member agreement details lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.member-agreement-details-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/member/agreement/details/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: member-agreement-details-lookup
              method: GET

Orchestrates member app engagement analytics pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Member App Engagement Analytics Pipeline"
  description: "Orchestrates member app engagement analytics pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - member
    - planet-fitness
    - salesforce
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-app-engagement-analytics-pipeline
          description: "Orchestrates member app engagement analytics pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "salesforce.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "snowflake.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "slack.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/member"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/member"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/member"
          operations:
            - name: execute-3
              method: POST

Sends a targeted push notification to a member through the Planet Fitness mobile app notification service, supporting promotional offers, class reminders, and account alerts.

naftiko: "0.5"
info:
  label: "Member App Push Notification"
  description: "Sends a targeted push notification to a member through the Planet Fitness mobile app notification service, supporting promotional offers, class reminders, and account alerts."
  tags:
    - marketing
    - mobile
    - notifications
capability:
  exposes:
    - type: mcp
      namespace: mobile-notifications
      port: 8080
      tools:
        - name: send-push-notification
          description: "Send a push notification to a member via the Planet Fitness mobile app."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The member ID."
            - name: title
              in: body
              type: string
              description: "Notification title."
            - name: message
              in: body
              type: string
              description: "Notification body text."
            - name: notification_type
              in: body
              type: string
              description: "Type (promotion, class_reminder, account_alert)."
          call: "push-service.send-notification"
          with:
            user_id: "{{member_id}}"
            title: "{{title}}"
            body: "{{message}}"
            type: "{{notification_type}}"
          outputParameters:
            - name: delivery_status
              type: string
              mapping: "$.data.status"
  consumes:
    - type: http
      namespace: push-service
      baseUri: "https://api.planetfitness.com/internal/notifications/v1"
      authentication:
        type: bearer
        token: "$secrets.push_service_token"
      resources:
        - name: notifications
          path: "/push"
          operations:
            - name: send-notification
              method: POST

Retrieves member billing history lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Member Billing History Lookup"
  description: "Retrieves member billing history lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - member
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-billing-history-lookup
          description: "Retrieves member billing history lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.member-billing-history-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/member/billing/history/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: member-billing-history-lookup
              method: GET

Orchestrates member birthday rewards pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Member Birthday Rewards Pipeline"
  description: "Orchestrates member birthday rewards pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - member
    - planet-fitness
    - datadog
    - planet-fitness
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-birthday-rewards-pipeline
          description: "Orchestrates member birthday rewards pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "datadog.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "planet-fitness.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "servicenow.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: datadog-resource
          path: "/api/member"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: planet-fitness-resource
          path: "/api/member"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/member"
          operations:
            - name: execute-3
              method: POST

When a member requests cancellation, updates their status in ABC Financial, removes them from active Mailchimp lists, logs a retention note in Club OS, and sends a survey via SurveyMonkey.

naftiko: "0.5"
info:
  label: "Member Cancellation Processing Orchestrator"
  description: "When a member requests cancellation, updates their status in ABC Financial, removes them from active Mailchimp lists, logs a retention note in Club OS, and sends a survey via SurveyMonkey."
  tags:
    - membership
    - cancellation
    - abc-financial
    - mailchimp
    - club-os
    - surveymonkey
capability:
  exposes:
    - type: mcp
      namespace: member-lifecycle
      port: 8080
      tools:
        - name: process-cancellation
          description: "Given a member ID, process their cancellation across billing, CRM, email, and trigger an exit survey."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The ABC Financial member ID."
            - name: cancellation_reason
              in: body
              type: string
              description: "The reason provided for cancellation."
          steps:
            - name: cancel-billing
              type: call
              call: "abc-financial.cancel-membership"
              with:
                member_id: "{{member_id}}"
                reason: "{{cancellation_reason}}"
            - name: remove-from-list
              type: call
              call: "mailchimp.archive-subscriber"
              with:
                list_id: "active_members"
                email: "{{cancel-billing.email}}"
            - name: log-retention-note
              type: call
              call: "club-os.add-note"
              with:
                member_id: "{{member_id}}"
                note: "Cancellation processed. Reason: {{cancellation_reason}}"
            - name: send-survey
              type: call
              call: "surveymonkey.send-survey"
              with:
                survey_id: "exit_survey"
                recipient_email: "{{cancel-billing.email}}"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: memberships
          path: "/members/{{member_id}}/cancel"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: cancel-membership
              method: POST
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: basic
        username: "anystring"
        password: "$secrets.mailchimp_api_key"
      resources:
        - name: subscribers
          path: "/lists/{{list_id}}/members/{{email}}/actions/archive"
          inputParameters:
            - name: list_id
              in: path
            - name: email
              in: path
          operations:
            - name: archive-subscriber
              method: POST
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: notes
          path: "/members/{{member_id}}/notes"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: add-note
              method: POST
    - type: http
      namespace: surveymonkey
      baseUri: "https://api.surveymonkey.com/v3"
      authentication:
        type: bearer
        token: "$secrets.surveymonkey_token"
      resources:
        - name: collectors
          path: "/surveys/{{survey_id}}/collectors"
          inputParameters:
            - name: survey_id
              in: path
          operations:
            - name: send-survey
              method: POST

Retrieves a member profile from the Club OS CRM by member ID, returning membership tier, check-in history count, and home club location.

naftiko: "0.5"
info:
  label: "Member Check-In Lookup"
  description: "Retrieves a member profile from the Club OS CRM by member ID, returning membership tier, check-in history count, and home club location."
  tags:
    - membership
    - crm
    - club-os
capability:
  exposes:
    - type: mcp
      namespace: membership
      port: 8080
      tools:
        - name: get-member-profile
          description: "Look up a Planet Fitness member by ID. Returns membership tier, home club, check-in count, and expiration date."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The Club OS member identifier."
          call: "club-os.get-member"
          with:
            member_id: "{{member_id}}"
          outputParameters:
            - name: membership_tier
              type: string
              mapping: "$.data.tier"
            - name: home_club
              type: string
              mapping: "$.data.home_club_name"
            - name: checkin_count
              type: string
              mapping: "$.data.total_checkins"
            - name: expiration_date
              type: string
              mapping: "$.data.membership_expiration"
  consumes:
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: members
          path: "/members/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-member
              method: GET

Orchestrates member complaint resolution pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Member Complaint Resolution Pipeline"
  description: "Orchestrates member complaint resolution pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - member
    - planet-fitness
    - slack
    - jira
    - teams
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-complaint-resolution-pipeline
          description: "Orchestrates member complaint resolution pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "slack.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "jira.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "teams.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/member"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/member"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.teams_token"
      resources:
        - name: teams-resource
          path: "/api/member"
          operations:
            - name: execute-3
              method: POST

Orchestrates member data privacy request pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Member Data Privacy Request Pipeline"
  description: "Orchestrates member data privacy request pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - member
    - planet-fitness
    - slack
    - jira
    - teams
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-data-privacy-request-pipeline
          description: "Orchestrates member data privacy request pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "slack.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "jira.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "teams.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/member"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/member"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.teams_token"
      resources:
        - name: teams-resource
          path: "/api/member"
          operations:
            - name: execute-3
              method: POST

Orchestrates member engagement gamification pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Member Engagement Gamification Pipeline"
  description: "Orchestrates member engagement gamification pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - member
    - planet-fitness
    - servicenow
    - salesforce
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-engagement-gamification-pipeline
          description: "Orchestrates member engagement gamification pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "servicenow.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "salesforce.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "snowflake.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/member"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/member"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/member"
          operations:
            - name: execute-3
              method: POST

Calculates a member engagement score by pulling check-in frequency from Club OS, class attendance from MINDBODY, app usage from Amplitude, and stores the composite score back in Club OS.

naftiko: "0.5"
info:
  label: "Member Engagement Score Orchestrator"
  description: "Calculates a member engagement score by pulling check-in frequency from Club OS, class attendance from MINDBODY, app usage from Amplitude, and stores the composite score back in Club OS."
  tags:
    - membership
    - analytics
    - club-os
    - mindbody
    - amplitude
capability:
  exposes:
    - type: mcp
      namespace: member-analytics
      port: 8080
      tools:
        - name: calculate-engagement-score
          description: "Given a member ID, pull activity data from multiple sources and compute an engagement score."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The member ID."
            - name: period_days
              in: body
              type: string
              description: "Number of days to look back for activity."
          steps:
            - name: get-checkins
              type: call
              call: "club-os.get-checkin-history"
              with:
                member_id: "{{member_id}}"
                days: "{{period_days}}"
            - name: get-class-attendance
              type: call
              call: "mindbody.get-client-visits"
              with:
                client_id: "{{member_id}}"
                days: "{{period_days}}"
            - name: get-app-usage
              type: call
              call: "amplitude.get-user-activity"
              with:
                user_id: "{{member_id}}"
                days: "{{period_days}}"
            - name: store-score
              type: call
              call: "club-os.update-engagement-score"
              with:
                member_id: "{{member_id}}"
                checkin_count: "{{get-checkins.count}}"
                class_count: "{{get-class-attendance.count}}"
                app_sessions: "{{get-app-usage.session_count}}"
  consumes:
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: checkins
          path: "/members/{{member_id}}/checkins"
          inputParameters:
            - name: member_id
              in: path
            - name: days
              in: query
          operations:
            - name: get-checkin-history
              method: GET
        - name: engagement
          path: "/members/{{member_id}}/engagement"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: update-engagement-score
              method: PUT
    - type: http
      namespace: mindbody
      baseUri: "https://api.mindbodyonline.com/public/v6"
      authentication:
        type: bearer
        token: "$secrets.mindbody_token"
      resources:
        - name: visits
          path: "/client/clientvisits"
          inputParameters:
            - name: client_id
              in: query
            - name: days
              in: query
          operations:
            - name: get-client-visits
              method: GET
    - type: http
      namespace: amplitude
      baseUri: "https://amplitude.com/api/2"
      authentication:
        type: basic
        username: "$secrets.amplitude_api_key"
        password: "$secrets.amplitude_secret_key"
      resources:
        - name: user-activity
          path: "/useractivity"
          inputParameters:
            - name: user_id
              in: query
            - name: days
              in: query
          operations:
            - name: get-user-activity
              method: GET

Retrieves member fitness assessment lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Member Fitness Assessment Lookup"
  description: "Retrieves member fitness assessment lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - member
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-fitness-assessment-lookup
          description: "Retrieves member fitness assessment lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.member-fitness-assessment-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/member/fitness/assessment/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: member-fitness-assessment-lookup
              method: GET

Orchestrates member group fitness class pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Member Group Fitness Class Pipeline"
  description: "Orchestrates member group fitness class pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - member
    - planet-fitness
    - sendgrid
    - workday
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-group-fitness-class-pipeline
          description: "Orchestrates member group fitness class pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "sendgrid.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "workday.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "datadog.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: sendgrid-resource
          path: "/api/member"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/pf/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/api/member"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: datadog-resource
          path: "/api/member"
          operations:
            - name: execute-3
              method: POST

Orchestrates member payment collection pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Member Payment Collection Pipeline"
  description: "Orchestrates member payment collection pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - member
    - planet-fitness
    - snowflake
    - slack
    - jira
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-payment-collection-pipeline
          description: "Orchestrates member payment collection pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "slack.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "jira.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/member"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/member"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/member"
          operations:
            - name: execute-3
              method: POST

Checks a member's payment status and last transaction in ABC Financial, returning payment method, last charge date, amount, and any past-due balance.

naftiko: "0.5"
info:
  label: "Member Payment Status Lookup"
  description: "Checks a member's payment status and last transaction in ABC Financial, returning payment method, last charge date, amount, and any past-due balance."
  tags:
    - billing
    - membership
    - abc-financial
capability:
  exposes:
    - type: mcp
      namespace: billing
      port: 8080
      tools:
        - name: get-payment-status
          description: "Look up a member's billing status and most recent payment from ABC Financial."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The ABC Financial member ID."
          call: "abc-financial.get-payment-status"
          with:
            member_id: "{{member_id}}"
          outputParameters:
            - name: payment_method
              type: string
              mapping: "$.data.payment_method"
            - name: last_charge_date
              type: string
              mapping: "$.data.last_charge_date"
            - name: last_amount
              type: string
              mapping: "$.data.last_amount"
            - name: past_due_balance
              type: string
              mapping: "$.data.past_due_balance"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: payments
          path: "/members/{{member_id}}/payments"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-payment-status
              method: GET

Retrieves member photo id verification status data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Member Photo Id Verification Status"
  description: "Retrieves member photo id verification status data from the Planet Fitness fitness franchise systems."
  tags:
    - member
    - planet-fitness
    - status
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-photo-id-verification-status
          description: "Retrieves member photo id verification status data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.member-photo-id-verification-status"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/member/photo/id/verification/status/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: member-photo-id-verification-status
              method: GET

When a member refers a new signup, validates the referral in ABC Financial, issues a reward credit, updates the referrer profile in Club OS, and sends a thank-you email via Mailchimp.

naftiko: "0.5"
info:
  label: "Member Referral Reward Orchestrator"
  description: "When a member refers a new signup, validates the referral in ABC Financial, issues a reward credit, updates the referrer profile in Club OS, and sends a thank-you email via Mailchimp."
  tags:
    - membership
    - referral
    - abc-financial
    - club-os
    - mailchimp
capability:
  exposes:
    - type: mcp
      namespace: member-referrals
      port: 8080
      tools:
        - name: process-referral-reward
          description: "Given a referrer member ID and new member ID, validate the referral, issue reward credit, update CRM, and send thank-you email."
          inputParameters:
            - name: referrer_member_id
              in: body
              type: string
              description: "The referring member's ABC Financial ID."
            - name: new_member_id
              in: body
              type: string
              description: "The newly signed up member's ABC Financial ID."
          steps:
            - name: validate-referral
              type: call
              call: "abc-financial.validate-referral"
              with:
                referrer_id: "{{referrer_member_id}}"
                new_member_id: "{{new_member_id}}"
            - name: issue-credit
              type: call
              call: "abc-financial.apply-credit"
              with:
                member_id: "{{referrer_member_id}}"
                amount: "{{validate-referral.reward_amount}}"
                reason: "Member referral reward"
            - name: update-crm
              type: call
              call: "club-os.update-member"
              with:
                member_id: "{{referrer_member_id}}"
                referral_count_increment: "1"
            - name: send-thanks
              type: call
              call: "mailchimp.send-transactional"
              with:
                template: "referral_thank_you"
                email: "{{validate-referral.referrer_email}}"
                merge_vars_first_name: "{{validate-referral.referrer_first_name}}"
                merge_vars_reward: "{{validate-referral.reward_amount}}"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: referrals
          path: "/referrals/validate"
          operations:
            - name: validate-referral
              method: POST
        - name: credits
          path: "/members/{{member_id}}/credits"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: apply-credit
              method: POST
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: members
          path: "/members/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: update-member
              method: PATCH
    - type: http
      namespace: mailchimp
      baseUri: "https://mandrillapp.com/api/1.0"
      authentication:
        type: bearer
        token: "$secrets.mandrill_api_key"
      resources:
        - name: transactional
          path: "/messages/send-template"
          operations:
            - name: send-transactional
              method: POST

Orchestrates member referral tracking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Member Referral Tracking Pipeline"
  description: "Orchestrates member referral tracking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - member
    - planet-fitness
    - workday
    - datadog
    - planet-fitness
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-referral-tracking-pipeline
          description: "Orchestrates member referral tracking pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "workday.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "datadog.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "planet-fitness.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/pf/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/api/member"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: datadog-resource
          path: "/api/member"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: planet-fitness-resource
          path: "/api/member"
          operations:
            - name: execute-3
              method: POST

Orchestrates member satisfaction survey pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Member Satisfaction Survey Pipeline"
  description: "Orchestrates member satisfaction survey pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - member
    - planet-fitness
    - teams
    - sendgrid
    - workday
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-satisfaction-survey-pipeline
          description: "Orchestrates member satisfaction survey pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "teams.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "sendgrid.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "workday.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.teams_token"
      resources:
        - name: teams-resource
          path: "/api/member"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: sendgrid-resource
          path: "/api/member"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/pf/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/api/member"
          operations:
            - name: execute-3
              method: POST

Retrieves member usage frequency lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Member Usage Frequency Lookup"
  description: "Retrieves member usage frequency lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - member
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-usage-frequency-lookup
          description: "Retrieves member usage frequency lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.member-usage-frequency-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/member/usage/frequency/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: member-usage-frequency-lookup
              method: GET

Orchestrates member win back campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Member Win Back Campaign Pipeline"
  description: "Orchestrates member win back campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - member
    - planet-fitness
    - planet-fitness
    - servicenow
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-win-back-campaign-pipeline
          description: "Orchestrates member win back campaign pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "planet-fitness.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "servicenow.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "salesforce.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: planet-fitness-resource
          path: "/api/member"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/member"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/member"
          operations:
            - name: execute-3
              method: POST

Submits a membership card reprint request for a member, looking up their details in Club OS and sending the print job to the card printing vendor API.

naftiko: "0.5"
info:
  label: "Membership Card Reprint Request"
  description: "Submits a membership card reprint request for a member, looking up their details in Club OS and sending the print job to the card printing vendor API."
  tags:
    - membership
    - operations
    - club-os
capability:
  exposes:
    - type: mcp
      namespace: member-ops
      port: 8080
      tools:
        - name: request-card-reprint
          description: "Given a member ID and club ID, look up member details and send a card reprint request."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The member ID."
            - name: club_id
              in: body
              type: string
              description: "The club where the card will be picked up."
          steps:
            - name: get-member
              type: call
              call: "club-os.get-member"
              with:
                member_id: "{{member_id}}"
            - name: send-print-job
              type: call
              call: "card-printer.submit-job"
              with:
                member_name: "{{get-member.first_name}} {{get-member.last_name}}"
                member_id: "{{member_id}}"
                tier: "{{get-member.tier}}"
                destination_club: "{{club_id}}"
  consumes:
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: members
          path: "/members/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-member
              method: GET
    - type: http
      namespace: card-printer
      baseUri: "https://api.planetfitness.com/internal/cards/v1"
      authentication:
        type: bearer
        token: "$secrets.card_printer_token"
      resources:
        - name: print-jobs
          path: "/jobs"
          operations:
            - name: submit-job
              method: POST

Processes a membership freeze by updating billing status in ABC Financial, pausing email campaigns in Mailchimp, adding a freeze note in Club OS, and sending a confirmation email to the member.

naftiko: "0.5"
info:
  label: "Membership Freeze Request Orchestrator"
  description: "Processes a membership freeze by updating billing status in ABC Financial, pausing email campaigns in Mailchimp, adding a freeze note in Club OS, and sending a confirmation email to the member."
  tags:
    - membership
    - billing
    - abc-financial
    - mailchimp
    - club-os
capability:
  exposes:
    - type: mcp
      namespace: member-lifecycle
      port: 8080
      tools:
        - name: process-membership-freeze
          description: "Given a member ID and freeze duration, pause billing, update email lists, log in CRM, and send confirmation."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The ABC Financial member ID."
            - name: freeze_months
              in: body
              type: string
              description: "Number of months to freeze the membership."
            - name: reason
              in: body
              type: string
              description: "Reason for the freeze request."
          steps:
            - name: freeze-billing
              type: call
              call: "abc-financial.freeze-membership"
              with:
                member_id: "{{member_id}}"
                duration_months: "{{freeze_months}}"
            - name: pause-emails
              type: call
              call: "mailchimp.update-subscriber"
              with:
                list_id: "active_members"
                email: "{{freeze-billing.email}}"
                status: "unsubscribed"
            - name: log-freeze
              type: call
              call: "club-os.add-note"
              with:
                member_id: "{{member_id}}"
                note: "Membership frozen for {{freeze_months}} months. Reason: {{reason}}"
            - name: send-confirmation
              type: call
              call: "mailchimp.send-transactional"
              with:
                template: "freeze_confirmation"
                email: "{{freeze-billing.email}}"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: freeze
          path: "/members/{{member_id}}/freeze"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: freeze-membership
              method: POST
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: basic
        username: "anystring"
        password: "$secrets.mailchimp_api_key"
      resources:
        - name: subscribers
          path: "/lists/{{list_id}}/members/{{email}}"
          inputParameters:
            - name: list_id
              in: path
            - name: email
              in: path
          operations:
            - name: update-subscriber
              method: PATCH
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: notes
          path: "/members/{{member_id}}/notes"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: add-note
              method: POST
    - type: http
      namespace: mailchimp-transactional
      baseUri: "https://mandrillapp.com/api/1.0"
      authentication:
        type: bearer
        token: "$secrets.mandrill_api_key"
      resources:
        - name: templates
          path: "/messages/send-template"
          operations:
            - name: send-transactional
              method: POST

Pulls membership revenue data from the billing platform ABC Financial for a given club and date range, returning total dues collected, new signups, and cancellation counts.

naftiko: "0.5"
info:
  label: "Membership Revenue Report"
  description: "Pulls membership revenue data from the billing platform ABC Financial for a given club and date range, returning total dues collected, new signups, and cancellation counts."
  tags:
    - billing
    - finance
    - abc-financial
    - membership
capability:
  exposes:
    - type: mcp
      namespace: billing
      port: 8080
      tools:
        - name: get-revenue-report
          description: "Retrieve membership billing revenue for a club and date range from ABC Financial."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
          call: "abc-financial.get-revenue"
          with:
            club_id: "{{club_id}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: total_dues
              type: string
              mapping: "$.data.total_dues_collected"
            - name: new_signups
              type: string
              mapping: "$.data.new_member_count"
            - name: cancellations
              type: string
              mapping: "$.data.cancellation_count"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: revenue
          path: "/clubs/{{club_id}}/revenue"
          inputParameters:
            - name: club_id
              in: path
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: get-revenue
              method: GET

Upgrades a member from Classic to Black Card tier in ABC Financial, updates their CRM profile in Club OS, enables Black Card perks in MINDBODY, and sends a congratulatory email via Mailchimp.

naftiko: "0.5"
info:
  label: "Membership Upgrade Orchestrator"
  description: "Upgrades a member from Classic to Black Card tier in ABC Financial, updates their CRM profile in Club OS, enables Black Card perks in MINDBODY, and sends a congratulatory email via Mailchimp."
  tags:
    - membership
    - upgrade
    - abc-financial
    - club-os
    - mindbody
    - mailchimp
capability:
  exposes:
    - type: mcp
      namespace: member-lifecycle
      port: 8080
      tools:
        - name: upgrade-membership
          description: "Given a member ID, upgrade their plan from Classic to Black Card across all systems."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The ABC Financial member ID."
          steps:
            - name: upgrade-billing
              type: call
              call: "abc-financial.upgrade-tier"
              with:
                member_id: "{{member_id}}"
                new_tier: "black_card"
            - name: update-crm
              type: call
              call: "club-os.update-member"
              with:
                member_id: "{{member_id}}"
                tier: "Black Card"
            - name: enable-perks
              type: call
              call: "mindbody.update-client-services"
              with:
                client_id: "{{member_id}}"
                services: "black_card_perks"
            - name: send-congrats
              type: call
              call: "mailchimp.send-transactional"
              with:
                template: "black_card_upgrade"
                email: "{{upgrade-billing.email}}"
                merge_vars_name: "{{upgrade-billing.first_name}}"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: tier-upgrades
          path: "/members/{{member_id}}/upgrade"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: upgrade-tier
              method: POST
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: members
          path: "/members/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: update-member
              method: PATCH
    - type: http
      namespace: mindbody
      baseUri: "https://api.mindbodyonline.com/public/v6"
      authentication:
        type: bearer
        token: "$secrets.mindbody_token"
      resources:
        - name: client-services
          path: "/client/clientservices"
          operations:
            - name: update-client-services
              method: POST
    - type: http
      namespace: mailchimp
      baseUri: "https://mandrillapp.com/api/1.0"
      authentication:
        type: bearer
        token: "$secrets.mandrill_api_key"
      resources:
        - name: transactional
          path: "/messages/send-template"
          operations:
            - name: send-transactional
              method: POST

Orchestrates new club site selection analysis pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "New Club Site Selection Analysis Pipeline"
  description: "Orchestrates new club site selection analysis pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - new
    - planet-fitness
    - snowflake
    - slack
    - jira
capability:
  exposes:
    - type: mcp
      namespace: new
      port: 8080
      tools:
        - name: new-club-site-selection-analysis-pipeline
          description: "Orchestrates new club site selection analysis pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "slack.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "jira.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/new"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/new"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/new"
          operations:
            - name: execute-3
              method: POST

On new member signup in ABC Financial, creates a member record in Club OS, enrolls them in a welcome email campaign in Mailchimp, and books a free personal training session in MINDBODY.

naftiko: "0.5"
info:
  label: "New Member Onboarding Orchestrator"
  description: "On new member signup in ABC Financial, creates a member record in Club OS, enrolls them in a welcome email campaign in Mailchimp, and books a free personal training session in MINDBODY."
  tags:
    - membership
    - onboarding
    - abc-financial
    - club-os
    - mailchimp
    - mindbody
capability:
  exposes:
    - type: mcp
      namespace: member-onboarding
      port: 8080
      tools:
        - name: onboard-new-member
          description: "Given an ABC Financial member ID, create CRM record, enroll in welcome campaign, and book a free PT session."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The ABC Financial member ID for the new signup."
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
          steps:
            - name: get-member-billing
              type: call
              call: "abc-financial.get-member"
              with:
                member_id: "{{member_id}}"
            - name: create-crm-record
              type: call
              call: "club-os.create-member"
              with:
                first_name: "{{get-member-billing.first_name}}"
                last_name: "{{get-member-billing.last_name}}"
                email: "{{get-member-billing.email}}"
                club_id: "{{club_id}}"
            - name: add-to-campaign
              type: call
              call: "mailchimp.add-subscriber"
              with:
                list_id: "welcome_series"
                email: "{{get-member-billing.email}}"
                first_name: "{{get-member-billing.first_name}}"
            - name: book-pt-session
              type: call
              call: "mindbody.book-appointment"
              with:
                client_id: "{{create-crm-record.client_id}}"
                service_id: "free_pt_intro"
                location_id: "{{club_id}}"
  consumes:
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: members
          path: "/members/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-member
              method: GET
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: members
          path: "/members"
          operations:
            - name: create-member
              method: POST
    - type: http
      namespace: mailchimp
      baseUri: "https://us1.api.mailchimp.com/3.0"
      authentication:
        type: basic
        username: "anystring"
        password: "$secrets.mailchimp_api_key"
      resources:
        - name: subscribers
          path: "/lists/{{list_id}}/members"
          inputParameters:
            - name: list_id
              in: path
          operations:
            - name: add-subscriber
              method: POST
    - type: http
      namespace: mindbody
      baseUri: "https://api.mindbodyonline.com/public/v6"
      authentication:
        type: bearer
        token: "$secrets.mindbody_token"
      inputParameters:
        - name: Api-Key
          in: header
          value: "$secrets.mindbody_api_key"
      resources:
        - name: appointments
          path: "/appointment/addappointment"
          operations:
            - name: book-appointment
              method: POST

Distributes NPS surveys to members who visited a club in the last week by pulling recent check-ins from Club OS, filtering by visit frequency, sending surveys via SurveyMonkey, and logging the campaign in HubSpot.

naftiko: "0.5"
info:
  label: "NPS Survey Distribution Orchestrator"
  description: "Distributes NPS surveys to members who visited a club in the last week by pulling recent check-ins from Club OS, filtering by visit frequency, sending surveys via SurveyMonkey, and logging the campaign in HubSpot."
  tags:
    - customer-service
    - nps
    - club-os
    - surveymonkey
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: nps-surveys
      port: 8080
      tools:
        - name: distribute-nps-survey
          description: "Given a club ID, pull recent visitors, send NPS survey, and log in HubSpot."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: week_ending
              in: body
              type: string
              description: "The week ending date in YYYY-MM-DD format."
          steps:
            - name: get-recent-visitors
              type: call
              call: "club-os.get-recent-checkins"
              with:
                club_id: "{{club_id}}"
                since: "{{week_ending}}"
            - name: send-surveys
              type: call
              call: "surveymonkey.send-batch-survey"
              with:
                survey_id: "nps_weekly"
                recipients: "{{get-recent-visitors.emails}}"
            - name: log-campaign
              type: call
              call: "hubspot.create-activity"
              with:
                campaign_id: "nps_weekly_{{club_id}}"
                note: "NPS surveys sent to {{get-recent-visitors.count}} members for club {{club_id}} week ending {{week_ending}}."
  consumes:
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: checkins
          path: "/locations/{{club_id}}/recent-checkins"
          inputParameters:
            - name: club_id
              in: path
            - name: since
              in: query
          operations:
            - name: get-recent-checkins
              method: GET
    - type: http
      namespace: surveymonkey
      baseUri: "https://api.surveymonkey.com/v3"
      authentication:
        type: bearer
        token: "$secrets.surveymonkey_token"
      resources:
        - name: batch
          path: "/surveys/{{survey_id}}/collectors/batch"
          inputParameters:
            - name: survey_id
              in: path
          operations:
            - name: send-batch-survey
              method: POST
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: activities
          path: "/engagements/v1/engagements"
          operations:
            - name: create-activity
              method: POST

Queries available personal training appointment slots from MINDBODY for a specified trainer and date, returning open time windows.

naftiko: "0.5"
info:
  label: "Personal Trainer Availability Check"
  description: "Queries available personal training appointment slots from MINDBODY for a specified trainer and date, returning open time windows."
  tags:
    - scheduling
    - personal-training
    - mindbody
capability:
  exposes:
    - type: mcp
      namespace: pt-scheduling
      port: 8080
      tools:
        - name: get-trainer-availability
          description: "Retrieve available appointment slots for a specific personal trainer on a given date."
          inputParameters:
            - name: trainer_id
              in: body
              type: string
              description: "The MINDBODY staff ID for the trainer."
            - name: date
              in: body
              type: string
              description: "Date to check availability in YYYY-MM-DD format."
          call: "mindbody.get-availability"
          with:
            staff_id: "{{trainer_id}}"
            date: "{{date}}"
          outputParameters:
            - name: available_slots
              type: string
              mapping: "$.AvailableTimes"
  consumes:
    - type: http
      namespace: mindbody
      baseUri: "https://api.mindbodyonline.com/public/v6"
      authentication:
        type: bearer
        token: "$secrets.mindbody_token"
      inputParameters:
        - name: Api-Key
          in: header
          value: "$secrets.mindbody_api_key"
      resources:
        - name: staff-availability
          path: "/appointment/availabletimes"
          inputParameters:
            - name: staff_id
              in: query
            - name: date
              in: query
          operations:
            - name: get-availability
              method: GET

Orchestrates personal trainer certification tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Personal Trainer Certification Tracker"
  description: "Orchestrates personal trainer certification tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - personal
    - planet-fitness
    - workday
    - datadog
    - planet-fitness
capability:
  exposes:
    - type: mcp
      namespace: personal
      port: 8080
      tools:
        - name: personal-trainer-certification-tracker
          description: "Orchestrates personal trainer certification tracker across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "workday.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "datadog.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "planet-fitness.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/pf/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/api/personal"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: datadog-resource
          path: "/api/personal"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: planet-fitness-resource
          path: "/api/personal"
          operations:
            - name: execute-3
              method: POST

Retrieves personal training session lookup data from the Planet Fitness fitness franchise systems.

naftiko: "0.5"
info:
  label: "Personal Training Session Lookup"
  description: "Retrieves personal training session lookup data from the Planet Fitness fitness franchise systems."
  tags:
    - personal
    - planet-fitness
    - lookup
capability:
  exposes:
    - type: mcp
      namespace: personal
      port: 8080
      tools:
        - name: personal-training-session-lookup
          description: "Retrieves personal training session lookup data from the Planet Fitness fitness franchise systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The input id."
          call: "planet-fitness.personal-training-session-lookup"
          with:
            input_id: "{{input_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.data"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: planet-fitness
      baseUri: "https://api.planetfitness.com/v2"
      authentication:
        type: bearer
        token: "$secrets.pf_api_token"
      resources:
        - name: resource
          path: "/personal/training/session/lookup/{{input_id}}"
          inputParameters:
            - name: input_id
              in: path
          operations:
            - name: personal-training-session-lookup
              method: GET

Queries a point-of-sale transaction from the Square POS system by transaction ID, returning items sold, total amount, payment method, and timestamp.

naftiko: "0.5"
info:
  label: "POS Transaction Lookup"
  description: "Queries a point-of-sale transaction from the Square POS system by transaction ID, returning items sold, total amount, payment method, and timestamp."
  tags:
    - retail
    - pos
    - square
capability:
  exposes:
    - type: mcp
      namespace: retail
      port: 8080
      tools:
        - name: get-pos-transaction
          description: "Look up a POS transaction from Square by transaction ID."
          inputParameters:
            - name: transaction_id
              in: body
              type: string
              description: "The Square transaction identifier."
          call: "square.get-payment"
          with:
            payment_id: "{{transaction_id}}"
          outputParameters:
            - name: total_amount
              type: string
              mapping: "$.payment.amount_money.amount"
            - name: currency
              type: string
              mapping: "$.payment.amount_money.currency"
            - name: status
              type: string
              mapping: "$.payment.status"
            - name: created_at
              type: string
              mapping: "$.payment.created_at"
  consumes:
    - type: http
      namespace: square
      baseUri: "https://connect.squareup.com/v2"
      authentication:
        type: bearer
        token: "$secrets.square_access_token"
      resources:
        - name: payments
          path: "/payments/{{payment_id}}"
          inputParameters:
            - name: payment_id
              in: path
          operations:
            - name: get-payment
              method: GET

Validates a promotional code against the promotions engine, returning whether the code is active, the discount type, discount amount, and applicable membership tiers.

naftiko: "0.5"
info:
  label: "Promo Code Validation"
  description: "Validates a promotional code against the promotions engine, returning whether the code is active, the discount type, discount amount, and applicable membership tiers."
  tags:
    - marketing
    - promotions
    - membership
capability:
  exposes:
    - type: mcp
      namespace: promotions
      port: 8080
      tools:
        - name: validate-promo-code
          description: "Check if a promotional code is valid and return its details."
          inputParameters:
            - name: promo_code
              in: body
              type: string
              description: "The promotional code to validate."
          call: "promo-engine.validate-code"
          with:
            code: "{{promo_code}}"
          outputParameters:
            - name: is_active
              type: string
              mapping: "$.data.active"
            - name: discount_type
              type: string
              mapping: "$.data.discount_type"
            - name: discount_amount
              type: string
              mapping: "$.data.discount_value"
            - name: eligible_tiers
              type: string
              mapping: "$.data.eligible_tiers"
  consumes:
    - type: http
      namespace: promo-engine
      baseUri: "https://api.planetfitness.com/internal/promotions/v1"
      authentication:
        type: bearer
        token: "$secrets.promo_engine_token"
      resources:
        - name: codes
          path: "/codes/{{code}}/validate"
          inputParameters:
            - name: code
              in: path
          operations:
            - name: validate-code
              method: GET

Generates a quarterly franchise performance review by pulling financials from NetSuite, member metrics from ABC Financial, compliance scores from ServiceChannel, and compiles a report shared via Box.

naftiko: "0.5"
info:
  label: "Quarterly Franchise Review Orchestrator"
  description: "Generates a quarterly franchise performance review by pulling financials from NetSuite, member metrics from ABC Financial, compliance scores from ServiceChannel, and compiles a report shared via Box."
  tags:
    - franchise
    - reporting
    - netsuite
    - abc-financial
    - servicechannel
    - box
capability:
  exposes:
    - type: mcp
      namespace: franchise-reporting
      port: 8080
      tools:
        - name: generate-quarterly-review
          description: "Given a club ID and quarter, aggregate financials, member metrics, and compliance data, then upload the compiled report to Box."
          inputParameters:
            - name: club_id
              in: body
              type: string
              description: "The franchise club identifier."
            - name: quarter
              in: body
              type: string
              description: "The quarter in format YYYY-Q# (e.g., 2026-Q1)."
          steps:
            - name: get-financials
              type: call
              call: "netsuite.get-quarterly-financials"
              with:
                club_id: "{{club_id}}"
                period: "{{quarter}}"
            - name: get-member-metrics
              type: call
              call: "abc-financial.get-quarterly-metrics"
              with:
                club_id: "{{club_id}}"
                period: "{{quarter}}"
            - name: get-compliance
              type: call
              call: "servicechannel.get-compliance-summary"
              with:
                location_id: "{{club_id}}"
                period: "{{quarter}}"
            - name: upload-report
              type: call
              call: "box.upload-file"
              with:
                folder_id: "franchise_reviews"
                file_name: "QBR_{{club_id}}_{{quarter}}.pdf"
                content: "Revenue: ${{get-financials.total_revenue}}, Members: {{get-member-metrics.total_active}}, Compliance Score: {{get-compliance.score}}"
  consumes:
    - type: http
      namespace: netsuite
      baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
      authentication:
        type: bearer
        token: "$secrets.netsuite_token"
      resources:
        - name: financials
          path: "/customrecord_quarterly_financials"
          inputParameters:
            - name: club_id
              in: query
            - name: period
              in: query
          operations:
            - name: get-quarterly-financials
              method: GET
    - type: http
      namespace: abc-financial
      baseUri: "https://api.abcfinancial.com/v2"
      authentication:
        type: bearer
        token: "$secrets.abc_financial_token"
      resources:
        - name: quarterly-metrics
          path: "/clubs/{{club_id}}/metrics"
          inputParameters:
            - name: club_id
              in: path
            - name: period
              in: query
          operations:
            - name: get-quarterly-metrics
              method: GET
    - type: http
      namespace: servicechannel
      baseUri: "https://api.servicechannel.com/v3"
      authentication:
        type: bearer
        token: "$secrets.servicechannel_token"
      resources:
        - name: compliance
          path: "/locations/{{location_id}}/compliance"
          inputParameters:
            - name: location_id
              in: path
            - name: period
              in: query
          operations:
            - name: get-compliance-summary
              method: GET
    - type: http
      namespace: box
      baseUri: "https://upload.box.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/content"
          operations:
            - name: upload-file
              method: POST

Orchestrates seasonal membership promotion pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Seasonal Membership Promotion Pipeline"
  description: "Orchestrates seasonal membership promotion pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - seasonal
    - planet-fitness
    - teams
    - sendgrid
    - workday
capability:
  exposes:
    - type: mcp
      namespace: seasonal
      port: 8080
      tools:
        - name: seasonal-membership-promotion-pipeline
          description: "Orchestrates seasonal membership promotion pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "teams.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "sendgrid.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "workday.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.teams_token"
      resources:
        - name: teams-resource
          path: "/api/seasonal"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: sendgrid-resource
          path: "/api/seasonal"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/pf/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/api/seasonal"
          operations:
            - name: execute-3
              method: POST

Orchestrates social media brand monitoring pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Social Media Brand Monitoring Pipeline"
  description: "Orchestrates social media brand monitoring pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - social
    - planet-fitness
    - servicenow
    - salesforce
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: social
      port: 8080
      tools:
        - name: social-media-brand-monitoring-pipeline
          description: "Orchestrates social media brand monitoring pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "servicenow.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "salesforce.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "snowflake.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://planetfitness.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/api/social"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/social"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/social"
          operations:
            - name: execute-3
              method: POST

Creates a social media post across Instagram and Facebook via the Meta Business API, then logs the post details in HubSpot for campaign tracking and notifies the marketing team in Slack.

naftiko: "0.5"
info:
  label: "Social Media Post Scheduler Orchestrator"
  description: "Creates a social media post across Instagram and Facebook via the Meta Business API, then logs the post details in HubSpot for campaign tracking and notifies the marketing team in Slack."
  tags:
    - marketing
    - social-media
    - meta
    - hubspot
    - slack
capability:
  exposes:
    - type: mcp
      namespace: social-media
      port: 8080
      tools:
        - name: schedule-social-post
          description: "Given post content and an image URL, publish to Instagram and Facebook, log in HubSpot, and notify marketing Slack channel."
          inputParameters:
            - name: caption
              in: body
              type: string
              description: "The post caption text."
            - name: image_url
              in: body
              type: string
              description: "URL of the image to publish."
            - name: campaign_id
              in: body
              type: string
              description: "The HubSpot campaign ID for tracking."
          steps:
            - name: post-instagram
              type: call
              call: "meta.publish-ig-post"
              with:
                caption: "{{caption}}"
                image_url: "{{image_url}}"
            - name: post-facebook
              type: call
              call: "meta.publish-fb-post"
              with:
                message: "{{caption}}"
                link: "{{image_url}}"
            - name: log-campaign
              type: call
              call: "hubspot.create-activity"
              with:
                campaign_id: "{{campaign_id}}"
                note: "Social post published. IG ID: {{post-instagram.id}}, FB ID: {{post-facebook.id}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#social-media"
                text: "New post live on IG and FB. Campaign: {{campaign_id}}"
  consumes:
    - type: http
      namespace: meta
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_page_token"
      resources:
        - name: instagram-media
          path: "/{{ig_user_id}}/media"
          inputParameters:
            - name: ig_user_id
              in: path
          operations:
            - name: publish-ig-post
              method: POST
        - name: facebook-posts
          path: "/{{page_id}}/feed"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: publish-fb-post
              method: POST
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: activities
          path: "/engagements/v1/engagements"
          operations:
            - name: create-activity
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Records a tanning booth session for a Black Card member in MINDBODY and updates their session count in Club OS.

naftiko: "0.5"
info:
  label: "Tanning Booth Usage Tracker"
  description: "Records a tanning booth session for a Black Card member in MINDBODY and updates their session count in Club OS."
  tags:
    - membership
    - tanning
    - mindbody
    - club-os
capability:
  exposes:
    - type: mcp
      namespace: amenities
      port: 8080
      tools:
        - name: log-tanning-session
          description: "Record a tanning booth session for a member and update their usage count."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The member ID."
            - name: club_id
              in: body
              type: string
              description: "The club location identifier."
            - name: booth_id
              in: body
              type: string
              description: "The specific tanning booth identifier."
          steps:
            - name: log-session
              type: call
              call: "mindbody.add-client-visit"
              with:
                client_id: "{{member_id}}"
                service_id: "tanning"
                location_id: "{{club_id}}"
                resource_id: "{{booth_id}}"
            - name: update-count
              type: call
              call: "club-os.increment-usage"
              with:
                member_id: "{{member_id}}"
                amenity: "tanning"
  consumes:
    - type: http
      namespace: mindbody
      baseUri: "https://api.mindbodyonline.com/public/v6"
      authentication:
        type: bearer
        token: "$secrets.mindbody_token"
      inputParameters:
        - name: Api-Key
          in: header
          value: "$secrets.mindbody_api_key"
      resources:
        - name: visits
          path: "/client/addclientvisit"
          operations:
            - name: add-client-visit
              method: POST
    - type: http
      namespace: club-os
      baseUri: "https://api.clubos.com/v2"
      authentication:
        type: bearer
        token: "$secrets.clubos_token"
      resources:
        - name: usage
          path: "/members/{{member_id}}/usage"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: increment-usage
              method: POST

Orchestrates vendor contract renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Vendor Contract Renewal Pipeline"
  description: "Orchestrates vendor contract renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - vendor
    - planet-fitness
    - salesforce
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: vendor
      port: 8080
      tools:
        - name: vendor-contract-renewal-pipeline
          description: "Orchestrates vendor contract renewal pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "salesforce.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "snowflake.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "slack.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://planetfitness.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/api/vendor"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/vendor"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/vendor"
          operations:
            - name: execute-3
              method: POST

When a vendor invoice arrives via email, extracts invoice data, creates a payable in NetSuite, matches it against the purchase order, and notifies the AP team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vendor Invoice Processing Orchestrator"
  description: "When a vendor invoice arrives via email, extracts invoice data, creates a payable in NetSuite, matches it against the purchase order, and notifies the AP team in Microsoft Teams."
  tags:
    - finance
    - accounts-payable
    - netsuite
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ap-processing
      port: 8080
      tools:
        - name: process-vendor-invoice
          description: "Given invoice details, create a payable in NetSuite, match to PO, and notify the AP team."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "Name of the vendor."
            - name: invoice_number
              in: body
              type: string
              description: "The vendor invoice number."
            - name: amount
              in: body
              type: string
              description: "Invoice amount."
            - name: po_number
              in: body
              type: string
              description: "Related purchase order number."
          steps:
            - name: create-payable
              type: call
              call: "netsuite.create-vendor-bill"
              with:
                vendor: "{{vendor_name}}"
                invoice_number: "{{invoice_number}}"
                amount: "{{amount}}"
                po_reference: "{{po_number}}"
            - name: match-po
              type: call
              call: "netsuite.match-po"
              with:
                bill_id: "{{create-payable.bill_id}}"
                po_number: "{{po_number}}"
            - name: notify-ap
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "ap-team"
                text: "Invoice {{invoice_number}} from {{vendor_name}} (${{amount}}) created. PO match: {{match-po.match_status}}."
  consumes:
    - type: http
      namespace: netsuite
      baseUri: "https://planetfitness.suitetalk.api.netsuite.com/services/rest/record/v1"
      authentication:
        type: bearer
        token: "$secrets.netsuite_token"
      resources:
        - name: vendor-bills
          path: "/vendorBill"
          operations:
            - name: create-vendor-bill
              method: POST
        - name: po-matching
          path: "/vendorBill/{{bill_id}}/match"
          inputParameters:
            - name: bill_id
              in: path
          operations:
            - name: match-po
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates vendor payment processing pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders.

naftiko: "0.5"
info:
  label: "Vendor Payment Processing Pipeline"
  description: "Orchestrates vendor payment processing pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
  tags:
    - vendor
    - planet-fitness
    - snowflake
    - slack
    - jira
capability:
  exposes:
    - type: mcp
      namespace: vendor
      port: 8080
      tools:
        - name: vendor-payment-processing-pipeline
          description: "Orchestrates vendor payment processing pipeline across fitness franchise systems, coordinating multiple services and notifying stakeholders."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute-1"
              with:
                input: "{{input_id}}"
            - name: step-2
              type: call
              call: "slack.execute-2"
              with:
                input: "{{input_id}}"
            - name: step-3
              type: call
              call: "jira.execute-3"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://planetfitness.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/api/vendor"
          operations:
            - name: execute-1
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/api/vendor"
          operations:
            - name: execute-2
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://planetfitness.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/api/vendor"
          operations:
            - name: execute-3
              method: POST