Peloton Capabilities

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

Sort
Expand

Checks class content for accessibility compliance including captions and audio descriptions, and creates remediation tasks.

naftiko: "0.5"
info:
  label: "Accessibility Compliance Checker"
  description: "Checks class content for accessibility compliance including captions and audio descriptions, and creates remediation tasks."
  tags:
    - accessibility
    - peloton
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: accessibility
      port: 8080
      tools:
        - name: accessibility-compliance-checker
          description: "Checks class content for accessibility compliance including captions and audio descriptions, and creates remediation tasks."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "jira.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://peloton.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Retrieves payroll summary from ADP for a pay period. Returns total payroll, headcount, and department breakdowns.

naftiko: "0.5"
info:
  label: "ADP Payroll Summary"
  description: "Retrieves payroll summary from ADP for a pay period. Returns total payroll, headcount, and department breakdowns."
  tags:
    - hr
    - adp
capability:
  exposes:
    - type: mcp
      namespace: payroll-ops
      port: 8080
      tools:
        - name: get-payroll-summary
          description: "Get ADP payroll summary."
          inputParameters:
            - name: pay_period_end
              in: body
              type: string
              description: "Pay period end date."
          call: "adp.get-summary"
          with:
            period_end: "{{pay_period_end}}"
          outputParameters:
            - name: total_payroll
              type: number
              mapping: "$.data.total_amount"
            - name: headcount
              type: integer
              mapping: "$.data.employee_count"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/hr/v2"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/payroll-summaries"
          operations:
            - name: get-summary
              method: GET

Forecasts apparel demand from e-commerce data, updates inventory targets, and triggers reorder alerts in the supply chain system.

naftiko: "0.5"
info:
  label: "Apparel Demand Forecasting Pipeline"
  description: "Forecasts apparel demand from e-commerce data, updates inventory targets, and triggers reorder alerts in the supply chain system."
  tags:
    - e-commerce
    - peloton
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: apparel
      port: 8080
      tools:
        - name: apparel-demand-forecasting-pipeline
          description: "Forecasts apparel demand from e-commerce data, updates inventory targets, and triggers reorder alerts in the supply chain system."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "shopify.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: shopify
      baseUri: "https://peloton-apparel.myshopify.com/admin/api/2024-01"
      authentication:
        type: bearer
        token: "$secrets.shopify_access_token"
      resources:
        - name: shopify-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Pulls current apparel inventory levels from the warehouse management system, syncs to the e-commerce platform, and alerts the merchandising team in Slack if stock is low.

naftiko: "0.5"
info:
  label: "Apparel Inventory Sync"
  description: "Pulls current apparel inventory levels from the warehouse management system, syncs to the e-commerce platform, and alerts the merchandising team in Slack if stock is low."
  tags:
    - hardware
    - e-commerce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: inventory-ops
      port: 8080
      tools:
        - name: sync-apparel-inventory
          description: "Sync apparel inventory and alert on low stock."
          inputParameters:
            - name: product_category
              in: body
              type: string
              description: "The product category to sync."
            - name: low_stock_threshold
              in: body
              type: integer
              description: "Alert threshold for low stock units."
          steps:
            - name: get-inventory
              type: call
              call: "warehouse-api.get-inventory"
              with:
                category: "{{product_category}}"
            - name: sync-ecommerce
              type: call
              call: "ecommerce-api.update-inventory"
              with:
                products: "{{get-inventory.products}}"
            - name: alert-low-stock
              type: call
              call: "slack.post-message"
              with:
                channel: "merchandising"
                text: "Inventory sync for {{product_category}}: {{get-inventory.low_stock_count}} items below {{low_stock_threshold}} units."
  consumes:
    - type: http
      namespace: warehouse-api
      baseUri: "https://api.onepeloton.com/warehouse/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_warehouse_token"
      resources:
        - name: inventory
          path: "/inventory"
          operations:
            - name: get-inventory
              method: GET
    - type: http
      namespace: ecommerce-api
      baseUri: "https://api.onepeloton.com/ecommerce/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_ecommerce_token"
      resources:
        - name: inventory
          path: "/inventory/bulk-update"
          operations:
            - name: update-inventory
              method: PUT
    - 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 CloudWatch alarm status for Peloton's AWS infrastructure. Returns alarm name, state, and reason.

naftiko: "0.5"
info:
  label: "AWS CloudWatch Alarm Status"
  description: "Retrieves CloudWatch alarm status for Peloton's AWS infrastructure. Returns alarm name, state, and reason."
  tags:
    - operations
    - monitoring
    - cloudwatch
capability:
  exposes:
    - type: mcp
      namespace: aws-monitoring
      port: 8080
      tools:
        - name: get-alarm-status
          description: "Check CloudWatch alarm status for AWS infrastructure."
          inputParameters:
            - name: alarm_name
              in: body
              type: string
              description: "The CloudWatch alarm name."
          call: "cloudwatch.describe-alarm"
          with:
            alarm_name: "{{alarm_name}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.MetricAlarms[0].StateValue"
            - name: reason
              type: string
              mapping: "$.MetricAlarms[0].StateReason"
  consumes:
    - type: http
      namespace: cloudwatch
      baseUri: "https://monitoring.us-east-1.amazonaws.com"
      authentication:
        type: aws-sigv4
        region: "us-east-1"
        service: "monitoring"
        access_key: "$secrets.aws_access_key"
        secret_key: "$secrets.aws_secret_key"
      resources:
        - name: alarms
          path: "/?Action=DescribeAlarms&AlarmNames.member.1={{alarm_name}}"
          inputParameters:
            - name: alarm_name
              in: query
          operations:
            - name: describe-alarm
              method: GET

Coordinates beta feature rollouts by selecting member cohorts, enabling feature flags, and monitoring adoption metrics.

naftiko: "0.5"
info:
  label: "Beta Feature Rollout Coordinator"
  description: "Coordinates beta feature rollouts by selecting member cohorts, enabling feature flags, and monitoring adoption metrics."
  tags:
    - features
    - peloton
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: beta
      port: 8080
      tools:
        - name: beta-feature-rollout-coordinator
          description: "Coordinates beta feature rollouts by selecting member cohorts, enabling feature flags, and monitoring adoption metrics."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "datadog.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              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: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Uploads a file to Box and creates a shared link for team distribution.

naftiko: "0.5"
info:
  label: "Box File Sharing"
  description: "Uploads a file to Box and creates a shared link for team distribution."
  tags:
    - document-management
    - box
capability:
  exposes:
    - type: mcp
      namespace: file-sharing
      port: 8080
      tools:
        - name: upload-and-share
          description: "Upload to Box and create shared link."
          inputParameters:
            - name: folder_id
              in: body
              type: string
              description: "Box folder ID."
            - name: file_name
              in: body
              type: string
              description: "File name."
          steps:
            - name: upload
              type: call
              call: "box.upload-file"
              with:
                folder_id: "{{folder_id}}"
                file_name: "{{file_name}}"
            - name: share
              type: call
              call: "box.create-link"
              with:
                file_id: "{{upload.id}}"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/content"
          operations:
            - name: upload-file
              method: POST
        - name: links
          path: "/files/{{file_id}}?fields=shared_link"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: create-link
              method: PUT

Identifies at-risk members from Snowflake churn models, triggers personalized retention emails via SendGrid, creates Salesforce tasks for the retention team, and sends alerts to Slack.

naftiko: "0.5"
info:
  label: "Churn Risk Intervention Pipeline"
  description: "Identifies at-risk members from Snowflake churn models, triggers personalized retention emails via SendGrid, creates Salesforce tasks for the retention team, and sends alerts to Slack."
  tags:
    - subscription
    - member-engagement
    - snowflake
    - sendgrid
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: retention-ops
      port: 8080
      tools:
        - name: intervene-churn-risk
          description: "Execute churn intervention for at-risk members across email, CRM, and notifications."
          inputParameters:
            - name: risk_threshold
              in: body
              type: number
              description: "Minimum churn probability score to trigger intervention (0-1)."
            - name: segment
              in: body
              type: string
              description: "The member segment to analyze."
          steps:
            - name: get-at-risk-members
              type: call
              call: "snowflake.execute-query"
              with:
                query: "SELECT * FROM churn_predictions WHERE segment='{{segment}}' AND churn_probability >= {{risk_threshold}}"
            - name: send-retention-emails
              type: call
              call: "sendgrid.send-batch"
              with:
                recipients: "{{get-at-risk-members.emails}}"
                template_id: "retention_offer"
            - name: create-sf-tasks
              type: call
              call: "salesforce.create-bulk-tasks"
              with:
                subject: "Retention outreach - Churn risk"
                member_ids: "{{get-at-risk-members.member_ids}}"
            - name: alert-team
              type: call
              call: "slack.post-message"
              with:
                channel: "retention-team"
                text: "Churn intervention triggered for {{get-at-risk-members.count}} members in segment {{segment}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: mail
          path: "/mail/send"
          operations:
            - name: send-batch
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://peloton.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-bulk-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

Generates personalized class recommendations by analyzing workout history in Snowflake and delivering via push notification.

naftiko: "0.5"
info:
  label: "Class Recommendation Engine Pipeline"
  description: "Generates personalized class recommendations by analyzing workout history in Snowflake and delivering via push notification."
  tags:
    - recommendations
    - peloton
    - snowflake
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: class
      port: 8080
      tools:
        - name: class-recommendation-engine-pipeline
          description: "Generates personalized class recommendations by analyzing workout history in Snowflake and delivering via push notification."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "sendgrid.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              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: "/execute"
          operations:
            - name: execute
              method: POST

Retrieves class viewership metrics from the content analytics platform. Returns total rides, unique riders, average output, and completion rate.

naftiko: "0.5"
info:
  label: "Class Viewership Metrics Lookup"
  description: "Retrieves class viewership metrics from the content analytics platform. Returns total rides, unique riders, average output, and completion rate."
  tags:
    - content
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: content-analytics
      port: 8080
      tools:
        - name: get-class-metrics
          description: "Look up viewership metrics for a specific Peloton class."
          inputParameters:
            - name: class_id
              in: body
              type: string
              description: "The Peloton class identifier."
          call: "content-api.get-class-metrics"
          with:
            class_id: "{{class_id}}"
          outputParameters:
            - name: total_rides
              type: integer
              mapping: "$.data.total_completions"
            - name: unique_riders
              type: integer
              mapping: "$.data.unique_members"
            - name: avg_output
              type: number
              mapping: "$.data.avg_output_kj"
            - name: completion_rate
              type: number
              mapping: "$.data.completion_rate"
  consumes:
    - type: http
      namespace: content-api
      baseUri: "https://api.onepeloton.com/content/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_content_token"
      resources:
        - name: classes
          path: "/classes/{{class_id}}/metrics"
          inputParameters:
            - name: class_id
              in: path
          operations:
            - name: get-class-metrics
              method: GET

Creates a new fitness challenge on the platform, sets up leaderboard tracking in Snowflake, and promotes it via push notifications and Slack announcements.

naftiko: "0.5"
info:
  label: "Community Challenge Creator"
  description: "Creates a new fitness challenge on the platform, sets up leaderboard tracking in Snowflake, and promotes it via push notifications and Slack announcements."
  tags:
    - member-engagement
    - content
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: challenge-ops
      port: 8080
      tools:
        - name: create-community-challenge
          description: "Create a community fitness challenge with leaderboard and promotion."
          inputParameters:
            - name: challenge_name
              in: body
              type: string
              description: "Name of the challenge."
            - name: start_date
              in: body
              type: string
              description: "Challenge start date."
            - name: end_date
              in: body
              type: string
              description: "Challenge end date."
            - name: challenge_type
              in: body
              type: string
              description: "Type of challenge (distance, classes, minutes, streak)."
          steps:
            - name: create-challenge
              type: call
              call: "platform-api.create-challenge"
              with:
                name: "{{challenge_name}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
                type: "{{challenge_type}}"
            - name: setup-leaderboard
              type: call
              call: "snowflake.execute-query"
              with:
                query: "CALL create_challenge_leaderboard('{{create-challenge.challenge_id}}', '{{challenge_type}}')"
            - name: announce
              type: call
              call: "slack.post-message"
              with:
                channel: "community"
                text: "New challenge launched: {{challenge_name}}! {{start_date}} - {{end_date}}. Type: {{challenge_type}}"
  consumes:
    - type: http
      namespace: platform-api
      baseUri: "https://api.onepeloton.com/platform/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_platform_token"
      resources:
        - name: challenges
          path: "/challenges"
          operations:
            - name: create-challenge
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              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

Searches Confluence for knowledge base articles. Returns titles, URLs, and dates.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Search"
  description: "Searches Confluence for knowledge base articles. Returns titles, URLs, and dates."
  tags:
    - operations
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: knowledge-base
      port: 8080
      tools:
        - name: search-kb
          description: "Search Confluence articles."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "Search query."
          call: "confluence.search"
          with:
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://peloton.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/search?cql=text~'{{query}}'"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search
              method: GET

Analyzes A/B test results for content features, computes statistical significance, and publishes findings to Confluence.

naftiko: "0.5"
info:
  label: "Content A/B Test Analyzer"
  description: "Analyzes A/B test results for content features, computes statistical significance, and publishes findings to Confluence."
  tags:
    - testing
    - peloton
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: content
      port: 8080
      tools:
        - name: content-ab-test-analyzer
          description: "Analyzes A/B test results for content features, computes statistical significance, and publishes findings to Confluence."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: get-test-data
              type: call
              call: "snowflake.run-query"
              with:
                input: "{{input_id}}"
            - name: publish-results
              type: call
              call: "confluence.create-page"
              with:
                input: "{{input_id}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://peloton.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: confluence-resource
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Pulls the latest class catalog from the content management system, syncs metadata to Snowflake for analytics, and updates search indexes via the platform API.

naftiko: "0.5"
info:
  label: "Content Library Catalog Refresh"
  description: "Pulls the latest class catalog from the content management system, syncs metadata to Snowflake for analytics, and updates search indexes via the platform API."
  tags:
    - content
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: catalog-ops
      port: 8080
      tools:
        - name: refresh-content-catalog
          description: "Refresh the content catalog across analytics and search systems."
          inputParameters:
            - name: content_type
              in: body
              type: string
              description: "Content type to refresh (cycling, strength, yoga, all)."
          steps:
            - name: get-catalog
              type: call
              call: "content-api.get-catalog"
              with:
                type: "{{content_type}}"
            - name: sync-to-snowflake
              type: call
              call: "snowflake.execute-query"
              with:
                query: "CALL sync_content_catalog('{{content_type}}')"
            - name: update-search-index
              type: call
              call: "platform-api.reindex-content"
              with:
                content_type: "{{content_type}}"
  consumes:
    - type: http
      namespace: content-api
      baseUri: "https://api.onepeloton.com/content/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_content_token"
      resources:
        - name: catalog
          path: "/classes/catalog"
          operations:
            - name: get-catalog
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: platform-api
      baseUri: "https://api.onepeloton.com/platform/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_platform_token"
      resources:
        - name: search
          path: "/search/reindex"
          operations:
            - name: reindex-content
              method: POST

Tracks music licensing agreements approaching expiration, alerts legal teams, and creates renewal tasks in Jira.

naftiko: "0.5"
info:
  label: "Content Licensing Renewal Tracker"
  description: "Tracks music licensing agreements approaching expiration, alerts legal teams, and creates renewal tasks in Jira."
  tags:
    - licensing
    - peloton
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: content
      port: 8080
      tools:
        - name: content-licensing-renewal-tracker
          description: "Tracks music licensing agreements approaching expiration, alerts legal teams, and creates renewal tasks in Jira."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "jira.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://peloton.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Validates new class content meets quality standards, checks music licensing, and approves for publishing through Jira workflow.

naftiko: "0.5"
info:
  label: "Content Production Quality Gate"
  description: "Validates new class content meets quality standards, checks music licensing, and approves for publishing through Jira workflow."
  tags:
    - content
    - peloton
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: content
      port: 8080
      tools:
        - name: content-production-quality-gate
          description: "Validates new class content meets quality standards, checks music licensing, and approves for publishing through Jira workflow."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "jira.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://peloton.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Creates a new class production schedule in the studio management system, assigns instructors, books studio time, and posts the schedule to Slack.

naftiko: "0.5"
info:
  label: "Content Production Scheduler"
  description: "Creates a new class production schedule in the studio management system, assigns instructors, books studio time, and posts the schedule to Slack."
  tags:
    - content
    - production
    - slack
capability:
  exposes:
    - type: mcp
      namespace: content-production
      port: 8080
      tools:
        - name: schedule-class-production
          description: "Schedule a new class production with studio booking and instructor assignment."
          inputParameters:
            - name: class_type
              in: body
              type: string
              description: "Type of class (cycling, running, strength, yoga, meditation)."
            - name: instructor_id
              in: body
              type: string
              description: "The instructor identifier."
            - name: studio_id
              in: body
              type: string
              description: "The studio facility identifier."
            - name: record_date
              in: body
              type: string
              description: "The recording date in YYYY-MM-DD format."
          steps:
            - name: book-studio
              type: call
              call: "studio-api.book-timeslot"
              with:
                studio_id: "{{studio_id}}"
                date: "{{record_date}}"
                class_type: "{{class_type}}"
            - name: assign-instructor
              type: call
              call: "studio-api.assign-instructor"
              with:
                booking_id: "{{book-studio.booking_id}}"
                instructor_id: "{{instructor_id}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "content-production"
                text: "New {{class_type}} class scheduled for {{record_date}} in Studio {{studio_id}}. Instructor: {{assign-instructor.instructor_name}}. Booking: {{book-studio.booking_id}}"
  consumes:
    - type: http
      namespace: studio-api
      baseUri: "https://api.onepeloton.com/studio/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_studio_token"
      resources:
        - name: bookings
          path: "/bookings"
          operations:
            - name: book-timeslot
              method: POST
        - name: instructors
          path: "/bookings/{{booking_id}}/instructor"
          inputParameters:
            - name: booking_id
              in: path
          operations:
            - name: assign-instructor
              method: PUT
    - 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

Processes corporate wellness program enrollments, provisions member accounts, and reports participation to HR systems.

naftiko: "0.5"
info:
  label: "Corporate Wellness Enrollment Pipeline"
  description: "Processes corporate wellness program enrollments, provisions member accounts, and reports participation to HR systems."
  tags:
    - corporate
    - peloton
    - salesforce
    - workday
capability:
  exposes:
    - type: mcp
      namespace: corporate
      port: 8080
      tools:
        - name: corporate-wellness-enrollment-pipeline
          description: "Processes corporate wellness program enrollments, provisions member accounts, and reports participation to HR systems."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "salesforce.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "workday.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://peloton.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/peloton/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Auto-categorizes support tickets by analyzing content, enriching with member data, and routing to specialized queues.

naftiko: "0.5"
info:
  label: "Customer Support Auto Categorizer"
  description: "Auto-categorizes support tickets by analyzing content, enriching with member data, and routing to specialized queues."
  tags:
    - support
    - peloton
    - servicenow
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: customer
      port: 8080
      tools:
        - name: customer-support-auto-categorizer
          description: "Auto-categorizes support tickets by analyzing content, enriching with member data, and routing to specialized queues."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: get-member
              type: call
              call: "peloton.get-member"
              with:
                input: "{{input_id}}"
            - name: categorize
              type: call
              call: "snowflake.run-query"
              with:
                input: "{{input_id}}"
            - name: route-ticket
              type: call
              call: "servicenow.update-incident"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/user/{{input_id}}"
          operations:
            - name: get-member
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://peloton.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/table/incident"
          operations:
            - name: update-incident
              method: PATCH

Processes GDPR and CCPA data privacy requests by locating member data, generating export packages, and tracking compliance deadlines.

naftiko: "0.5"
info:
  label: "Data Privacy Request Processor"
  description: "Processes GDPR and CCPA data privacy requests by locating member data, generating export packages, and tracking compliance deadlines."
  tags:
    - privacy
    - peloton
    - servicenow
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: data
      port: 8080
      tools:
        - name: data-privacy-request-processor
          description: "Processes GDPR and CCPA data privacy requests by locating member data, generating export packages, and tracking compliance deadlines."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "servicenow.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://peloton.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Retrieves Datadog monitor status for Peloton's platform infrastructure. Returns monitor name, state, and last triggered time.

naftiko: "0.5"
info:
  label: "Datadog Monitor Status Lookup"
  description: "Retrieves Datadog monitor status for Peloton's platform infrastructure. Returns monitor name, state, and last triggered time."
  tags:
    - operations
    - monitoring
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-monitor-status
          description: "Check Datadog monitor status for platform infrastructure."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor identifier."
          call: "datadog.get-monitor"
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: status
              type: string
              mapping: "$.overall_state"
            - name: last_triggered
              type: string
              mapping: "$.state.last_triggered_ts"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Checks the current firmware version and update status for a Peloton device by serial number.

naftiko: "0.5"
info:
  label: "Device Firmware Status Lookup"
  description: "Checks the current firmware version and update status for a Peloton device by serial number."
  tags:
    - hardware
    - device-management
capability:
  exposes:
    - type: mcp
      namespace: device-ops
      port: 8080
      tools:
        - name: get-firmware-status
          description: "Check firmware version and update status for a Peloton device."
          inputParameters:
            - name: device_serial
              in: body
              type: string
              description: "The device serial number."
          call: "hardware-api.get-firmware"
          with:
            serial: "{{device_serial}}"
          outputParameters:
            - name: current_version
              type: string
              mapping: "$.data.firmware_version"
            - name: latest_version
              type: string
              mapping: "$.data.latest_available"
            - name: update_status
              type: string
              mapping: "$.data.update_status"
  consumes:
    - type: http
      namespace: hardware-api
      baseUri: "https://api.onepeloton.com/hardware/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_hardware_token"
      resources:
        - name: firmware
          path: "/devices/{{serial}}/firmware"
          inputParameters:
            - name: serial
              in: path
          operations:
            - name: get-firmware
              method: GET

Runs remote diagnostics on Peloton hardware, checks firmware compatibility, and creates ServiceNow tickets for devices needing repair.

naftiko: "0.5"
info:
  label: "Device Health Diagnostic Pipeline"
  description: "Runs remote diagnostics on Peloton hardware, checks firmware compatibility, and creates ServiceNow tickets for devices needing repair."
  tags:
    - hardware
    - peloton
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: device
      port: 8080
      tools:
        - name: device-health-diagnostic-pipeline
          description: "Runs remote diagnostics on Peloton hardware, checks firmware compatibility, and creates ServiceNow tickets for devices needing repair."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "servicenow.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://peloton.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Retrieves the status of an e-commerce order (apparel, accessories) by order ID. Returns order status, items, and tracking information.

naftiko: "0.5"
info:
  label: "E-commerce Order Status Lookup"
  description: "Retrieves the status of an e-commerce order (apparel, accessories) by order ID. Returns order status, items, and tracking information."
  tags:
    - hardware
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: ecommerce-ops
      port: 8080
      tools:
        - name: get-order-status
          description: "Look up an e-commerce order status by order identifier."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The e-commerce order identifier."
          call: "ecommerce-api.get-order"
          with:
            order_id: "{{order_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.data.status"
            - name: items
              type: array
              mapping: "$.data.line_items"
            - name: tracking_number
              type: string
              mapping: "$.data.tracking_number"
  consumes:
    - type: http
      namespace: ecommerce-api
      baseUri: "https://api.onepeloton.com/ecommerce/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_ecommerce_token"
      resources:
        - name: orders
          path: "/orders/{{order_id}}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET

On new hire creation in Workday, provisions accounts, creates a ServiceNow onboarding ticket, and sends a welcome message in Slack.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "On new hire creation in Workday, provisions accounts, creates a ServiceNow onboarding ticket, and sends a welcome message in Slack."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Orchestrate new hire onboarding across Workday, ServiceNow, and Slack."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: start_date
              in: body
              type: string
              description: "The start date."
            - name: department
              in: body
              type: string
              description: "The department."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                description: "Onboarding for {{get-employee.full_name}} starting {{start_date}} in {{department}}."
            - name: send-welcome
              type: call
              call: "slack.post-message"
              with:
                channel: "new-hires"
                text: "Welcome to Peloton, {{get-employee.first_name}}! Onboarding ticket: {{open-ticket.number}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://peloton.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
    - 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

Compiles annual member statistics for year-in-review features, generates personalized reports, and distributes via email.

naftiko: "0.5"
info:
  label: "End of Year Member Stats Pipeline"
  description: "Compiles annual member statistics for year-in-review features, generates personalized reports, and distributes via email."
  tags:
    - reporting
    - peloton
    - snowflake
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: end
      port: 8080
      tools:
        - name: end-of-year-member-stats-pipeline
          description: "Compiles annual member statistics for year-in-review features, generates personalized reports, and distributes via email."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: compile-stats
              type: call
              call: "snowflake.run-query"
              with:
                input: "{{input_id}}"
            - name: generate-report
              type: call
              call: "peloton.generate-report"
              with:
                input: "{{input_id}}"
            - name: distribute
              type: call
              call: "sendgrid.send-email"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/reports/year-in-review"
          operations:
            - name: generate-report
              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: "/mail/send"
          operations:
            - name: send-email
              method: POST

Coordinates firmware updates across the Peloton device fleet by staging updates, monitoring rollout progress, and alerting on failures.

naftiko: "0.5"
info:
  label: "Fleet Firmware Update Rollout"
  description: "Coordinates firmware updates across the Peloton device fleet by staging updates, monitoring rollout progress, and alerting on failures."
  tags:
    - firmware
    - peloton
    - datadog
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: fleet
      port: 8080
      tools:
        - name: fleet-firmware-update-rollout
          description: "Coordinates firmware updates across the Peloton device fleet by staging updates, monitoring rollout progress, and alerting on failures."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "datadog.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "pagerduty.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              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: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: pagerduty-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Retrieves product details from the Peloton apparel e-commerce catalog.

naftiko: "0.5"
info:
  label: "Get Apparel Product Details"
  description: "Retrieves product details from the Peloton apparel e-commerce catalog."
  tags:
    - e-commerce
    - peloton
    - apparel
capability:
  exposes:
    - type: mcp
      namespace: e-commerce
      port: 8080
      tools:
        - name: get-apparel-product-details
          description: "Retrieves product details from the Peloton apparel e-commerce catalog."
          inputParameters:
            - name: sku
              in: body
              type: string
              description: "The sku."
          call: "shopify.get-product"
          with:
            sku: "{{sku}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: price
              type: string
              mapping: "$.variants[0].price"
  consumes:
    - type: http
      namespace: shopify
      baseUri: "https://peloton-apparel.myshopify.com/admin/api/2024-01"
      authentication:
        type: bearer
        token: "$secrets.shopify_access_token"
      resources:
        - name: get-apparel-product-details
          path: "/products.json"
          inputParameters:
            - name: sku
              in: path
          operations:
            - name: get-apparel-product-details
              method: GET

Retrieves details and progress for a Peloton community challenge.

naftiko: "0.5"
info:
  label: "Get Challenge Details"
  description: "Retrieves details and progress for a Peloton community challenge."
  tags:
    - challenges
    - peloton
    - community
capability:
  exposes:
    - type: mcp
      namespace: challenges
      port: 8080
      tools:
        - name: get-challenge-details
          description: "Retrieves details and progress for a Peloton community challenge."
          inputParameters:
            - name: challenge_id
              in: body
              type: string
              description: "The challenge id."
          call: "peloton.get-challenge"
          with:
            challenge_id: "{{challenge_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: participants
              type: integer
              mapping: "$.participant_count"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: get-challenge-details
          path: "/challenges/{{challenge_id}}"
          inputParameters:
            - name: challenge_id
              in: path
          operations:
            - name: get-challenge-details
              method: GET

Retrieves detailed information about a specific Peloton class including instructor, duration, and difficulty.

naftiko: "0.5"
info:
  label: "Get Class Details"
  description: "Retrieves detailed information about a specific Peloton class including instructor, duration, and difficulty."
  tags:
    - content
    - peloton
    - classes
capability:
  exposes:
    - type: mcp
      namespace: content
      port: 8080
      tools:
        - name: get-class-details
          description: "Look up a Peloton class by class ID."
          inputParameters:
            - name: class_id
              in: body
              type: string
              description: "The Peloton class ID."
          call: "peloton.get-class"
          with:
            class_id: "{{class_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: instructor
              type: string
              mapping: "$.instructor.name"
            - name: duration
              type: integer
              mapping: "$.duration"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: classes
          path: "/ride/{{class_id}}"
          inputParameters:
            - name: class_id
              in: path
          operations:
            - name: get-class
              method: GET

Retrieves aggregated ratings and reviews for a Peloton class.

naftiko: "0.5"
info:
  label: "Get Class Ratings Summary"
  description: "Retrieves aggregated ratings and reviews for a Peloton class."
  tags:
    - content
    - peloton
    - ratings
capability:
  exposes:
    - type: mcp
      namespace: content
      port: 8080
      tools:
        - name: get-class-ratings-summary
          description: "Retrieves aggregated ratings and reviews for a Peloton class."
          inputParameters:
            - name: class_id
              in: body
              type: string
              description: "The class id."
          call: "peloton.get-ratings"
          with:
            class_id: "{{class_id}}"
          outputParameters:
            - name: average_rating
              type: number
              mapping: "$.average_score"
            - name: total_ratings
              type: integer
              mapping: "$.total_ratings"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: resource
          path: "/ride/{{class_id}}/ratings"
          inputParameters:
            - name: class_id
              in: path
          operations:
            - name: get-ratings
              method: GET

Retrieves the list of available content categories and class types on the Peloton platform.

naftiko: "0.5"
info:
  label: "Get Content Category List"
  description: "Retrieves the list of available content categories and class types on the Peloton platform."
  tags:
    - content
    - peloton
    - categories
capability:
  exposes:
    - type: mcp
      namespace: content
      port: 8080
      tools:
        - name: list-categories
          description: "List all Peloton content categories."
          inputParameters: []
          call: "peloton.list-categories"
          with: {}
          outputParameters:
            - name: categories
              type: array
              mapping: "$.categories"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: categories
          path: "/ride/categories"
          operations:
            - name: list-categories
              method: GET

Retrieves the delivery status and tracking for a Peloton hardware order.

naftiko: "0.5"
info:
  label: "Get Delivery Order Status"
  description: "Retrieves the delivery status and tracking for a Peloton hardware order."
  tags:
    - logistics
    - peloton
    - delivery
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: get-delivery-order-status
          description: "Retrieves the delivery status and tracking for a Peloton hardware order."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The order id."
          call: "peloton.get-delivery"
          with:
            order_id: "{{order_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: tracking_number
              type: string
              mapping: "$.tracking_number"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: get-delivery-order-status
          path: "/deliveries/{{order_id}}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-delivery-order-status
              method: GET

Retrieves the connectivity and firmware status of a Peloton hardware device.

naftiko: "0.5"
info:
  label: "Get Device Status"
  description: "Retrieves the connectivity and firmware status of a Peloton hardware device."
  tags:
    - hardware
    - peloton
    - devices
capability:
  exposes:
    - type: mcp
      namespace: hardware
      port: 8080
      tools:
        - name: get-device-status
          description: "Check the status of a Peloton device by serial number."
          inputParameters:
            - name: serial_number
              in: body
              type: string
              description: "The device serial number."
          call: "peloton.get-device"
          with:
            serial_number: "{{serial_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: firmware_version
              type: string
              mapping: "$.firmware_version"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: devices
          path: "/devices/{{serial_number}}"
          inputParameters:
            - name: serial_number
              in: path
          operations:
            - name: get-device
              method: GET

Retrieves profile and biography details for a Peloton instructor.

naftiko: "0.5"
info:
  label: "Get Instructor Details"
  description: "Retrieves profile and biography details for a Peloton instructor."
  tags:
    - instructors
    - peloton
    - content
capability:
  exposes:
    - type: mcp
      namespace: instructors
      port: 8080
      tools:
        - name: get-instructor-details
          description: "Retrieves profile and biography details for a Peloton instructor."
          inputParameters:
            - name: instructor_id
              in: body
              type: string
              description: "The instructor id."
          call: "peloton.get-instructor"
          with:
            instructor_id: "{{instructor_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: bio
              type: string
              mapping: "$.bio"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: get-instructor-details
          path: "/instructor/{{instructor_id}}"
          inputParameters:
            - name: instructor_id
              in: path
          operations:
            - name: get-instructor-details
              method: GET

Retrieves the leaderboard ranking for a specific Peloton class ride.

naftiko: "0.5"
info:
  label: "Get Leaderboard Ranking"
  description: "Retrieves the leaderboard ranking for a specific Peloton class ride."
  tags:
    - leaderboard
    - peloton
    - classes
capability:
  exposes:
    - type: mcp
      namespace: leaderboard
      port: 8080
      tools:
        - name: get-leaderboard
          description: "Retrieve leaderboard rankings for a class."
          inputParameters:
            - name: ride_id
              in: body
              type: string
              description: "The Peloton ride ID."
          call: "peloton.get-leaderboard"
          with:
            ride_id: "{{ride_id}}"
          outputParameters:
            - name: rankings
              type: array
              mapping: "$.data"
            - name: total_riders
              type: integer
              mapping: "$.total"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: leaderboard
          path: "/ride/{{ride_id}}/leaderboard"
          inputParameters:
            - name: ride_id
              in: path
          operations:
            - name: get-leaderboard
              method: GET

Retrieves the achievements and badges earned by a Peloton member.

naftiko: "0.5"
info:
  label: "Get Member Achievements"
  description: "Retrieves the achievements and badges earned by a Peloton member."
  tags:
    - members
    - peloton
    - gamification
capability:
  exposes:
    - type: mcp
      namespace: members
      port: 8080
      tools:
        - name: get-member-achievements
          description: "Look up achievements for a Peloton member."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The Peloton member ID."
          call: "peloton.get-achievements"
          with:
            member_id: "{{member_id}}"
          outputParameters:
            - name: achievements
              type: array
              mapping: "$.achievements"
            - name: total_count
              type: integer
              mapping: "$.total"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: achievements
          path: "/user/{{member_id}}/achievements"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-achievements
              method: GET

Retrieves the friends list for a Peloton member.

naftiko: "0.5"
info:
  label: "Get Member Friends List"
  description: "Retrieves the friends list for a Peloton member."
  tags:
    - social
    - peloton
    - members
capability:
  exposes:
    - type: mcp
      namespace: social
      port: 8080
      tools:
        - name: get-member-friends-list
          description: "Retrieves the friends list for a Peloton member."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The member id."
          call: "peloton.get-friends"
          with:
            member_id: "{{member_id}}"
          outputParameters:
            - name: friends
              type: array
              mapping: "$.friends"
            - name: count
              type: integer
              mapping: "$.total"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: resource
          path: "/user/{{member_id}}/friends"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-friends
              method: GET

Retrieves heart rate zone configuration for a Peloton member.

naftiko: "0.5"
info:
  label: "Get Member Heart Rate Zones"
  description: "Retrieves heart rate zone configuration for a Peloton member."
  tags:
    - fitness
    - peloton
    - health
capability:
  exposes:
    - type: mcp
      namespace: fitness
      port: 8080
      tools:
        - name: get-member-heart-rate-zones
          description: "Retrieves heart rate zone configuration for a Peloton member."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The member id."
          call: "peloton.get-hr-zones"
          with:
            member_id: "{{member_id}}"
          outputParameters:
            - name: zones
              type: array
              mapping: "$.heart_rate_zones"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: get-member-heart-rate-zones
          path: "/user/{{member_id}}/heart_rate_zones"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-member-heart-rate-zones
              method: GET

Retrieves the music playlist for a specific Peloton class.

naftiko: "0.5"
info:
  label: "Get Music Playlist Details"
  description: "Retrieves the music playlist for a specific Peloton class."
  tags:
    - music
    - peloton
    - content
capability:
  exposes:
    - type: mcp
      namespace: music
      port: 8080
      tools:
        - name: get-music-playlist-details
          description: "Retrieves the music playlist for a specific Peloton class."
          inputParameters:
            - name: ride_id
              in: body
              type: string
              description: "The ride id."
          call: "peloton.get-playlist"
          with:
            ride_id: "{{ride_id}}"
          outputParameters:
            - name: songs
              type: array
              mapping: "$.songs"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: get-music-playlist-details
          path: "/ride/{{ride_id}}/playlist"
          inputParameters:
            - name: ride_id
              in: path
          operations:
            - name: get-music-playlist-details
              method: GET

Retrieves the count of on-demand classes by fitness discipline.

naftiko: "0.5"
info:
  label: "Get On-Demand Library Count"
  description: "Retrieves the count of on-demand classes by fitness discipline."
  tags:
    - content
    - peloton
    - library
capability:
  exposes:
    - type: mcp
      namespace: content
      port: 8080
      tools:
        - name: get-on-demand-library-count
          description: "Retrieves the count of on-demand classes by fitness discipline."
          inputParameters:
            - name: discipline
              in: body
              type: string
              description: "The discipline."
          call: "peloton.count-classes"
          with:
            discipline: "{{discipline}}"
          outputParameters:
            - name: count
              type: integer
              mapping: "$.total"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: get-on-demand-library-count
          path: "/ride/archived"
          inputParameters:
            - name: discipline
              in: path
          operations:
            - name: get-on-demand-library-count
              method: GET

Checks Peloton retail showroom inventory levels for hardware products.

naftiko: "0.5"
info:
  label: "Get Retail Store Inventory"
  description: "Checks Peloton retail showroom inventory levels for hardware products."
  tags:
    - retail
    - peloton
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: retail
      port: 8080
      tools:
        - name: get-retail-store-inventory
          description: "Checks Peloton retail showroom inventory levels for hardware products."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "The store id."
          call: "peloton.check-inventory"
          with:
            store_id: "{{store_id}}"
          outputParameters:
            - name: quantity
              type: integer
              mapping: "$.quantity_on_hand"
            - name: available
              type: boolean
              mapping: "$.available"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: get-retail-store-inventory
          path: "/stores/{{store_id}}/inventory"
          inputParameters:
            - name: store_id
              in: path
          operations:
            - name: get-retail-store-inventory
              method: GET

Retrieves the billing history for a Peloton member subscription.

naftiko: "0.5"
info:
  label: "Get Subscription Billing History"
  description: "Retrieves the billing history for a Peloton member subscription."
  tags:
    - billing
    - peloton
    - subscriptions
capability:
  exposes:
    - type: mcp
      namespace: billing
      port: 8080
      tools:
        - name: get-subscription-billing-history
          description: "Retrieves the billing history for a Peloton member subscription."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The subscription id."
          call: "peloton.get-billing-history"
          with:
            subscription_id: "{{subscription_id}}"
          outputParameters:
            - name: transactions
              type: array
              mapping: "$.billing_transactions"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: get-subscription-billing-history
          path: "/subscriptions/{{subscription_id}}/billing"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-subscription-billing-history
              method: GET

Retrieves the payment method on file for a Peloton subscription.

naftiko: "0.5"
info:
  label: "Get Subscription Payment Method"
  description: "Retrieves the payment method on file for a Peloton subscription."
  tags:
    - billing
    - peloton
    - payments
capability:
  exposes:
    - type: mcp
      namespace: billing
      port: 8080
      tools:
        - name: get-subscription-payment-method
          description: "Retrieves the payment method on file for a Peloton subscription."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "The subscription id."
          call: "peloton.get-payment-method"
          with:
            subscription_id: "{{subscription_id}}"
          outputParameters:
            - name: card_last_four
              type: string
              mapping: "$.card.last_four"
            - name: card_brand
              type: string
              mapping: "$.card.brand"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: resource
          path: "/subscriptions/{{subscription_id}}/payment"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-payment-method
              method: GET

Retrieves aggregated workout metrics for a Peloton member.

naftiko: "0.5"
info:
  label: "Get Workout Metrics Summary"
  description: "Retrieves aggregated workout metrics for a Peloton member."
  tags:
    - fitness
    - peloton
    - metrics
capability:
  exposes:
    - type: mcp
      namespace: fitness
      port: 8080
      tools:
        - name: get-workout-metrics-summary
          description: "Retrieves aggregated workout metrics for a Peloton member."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The member id."
          call: "peloton.get-metrics"
          with:
            member_id: "{{member_id}}"
          outputParameters:
            - name: total_workouts
              type: integer
              mapping: "$.total_workouts"
            - name: total_calories
              type: integer
              mapping: "$.total_calories"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: get-workout-metrics-summary
          path: "/user/{{member_id}}/workout_metrics_summary"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-workout-metrics-summary
              method: GET

Retrieves Google Ads spending data for Peloton marketing campaigns.

naftiko: "0.5"
info:
  label: "Google Ads Campaign Spend Lookup"
  description: "Retrieves Google Ads spending data for Peloton marketing campaigns."
  tags:
    - marketing
    - google-ads
capability:
  exposes:
    - type: mcp
      namespace: ad-spending
      port: 8080
      tools:
        - name: get-ad-spend
          description: "Look up Google Ads campaign spend."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "Google Ads campaign ID."
          call: "google-ads.get-spend"
          with:
            campaign_id: "{{campaign_id}}"
          outputParameters:
            - name: spend
              type: number
              mapping: "$.data.cost_micros"
            - name: impressions
              type: integer
              mapping: "$.data.impressions"
  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/peloton/campaigns/{{campaign_id}}/metrics"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-spend
              method: GET

Retrieves web traffic metrics from Google Analytics for the Peloton website. Returns sessions, bounce rate, and conversion rate.

naftiko: "0.5"
info:
  label: "Google Analytics Web Traffic Report"
  description: "Retrieves web traffic metrics from Google Analytics for the Peloton website. Returns sessions, bounce rate, and conversion rate."
  tags:
    - marketing
    - analytics
    - google-analytics
capability:
  exposes:
    - type: mcp
      namespace: web-analytics
      port: 8080
      tools:
        - name: get-web-traffic
          description: "Get Peloton website traffic metrics from Google Analytics."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Report start date."
            - name: end_date
              in: body
              type: string
              description: "Report end date."
          call: "google-analytics.run-report"
          with:
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: sessions
              type: integer
              mapping: "$.rows[0].metricValues[0].value"
            - name: bounce_rate
              type: number
              mapping: "$.rows[0].metricValues[1].value"
            - name: conversion_rate
              type: number
              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/peloton/runReport"
          operations:
            - name: run-report
              method: POST

Retrieves GTM tag configuration for the Peloton website.

naftiko: "0.5"
info:
  label: "Google Tag Manager Config Lookup"
  description: "Retrieves GTM tag configuration for the Peloton website."
  tags:
    - marketing
    - google-tag-manager
capability:
  exposes:
    - type: mcp
      namespace: gtm-ops
      port: 8080
      tools:
        - name: get-gtm-tag
          description: "Look up a GTM tag configuration."
          inputParameters:
            - name: tag_id
              in: body
              type: string
              description: "GTM tag ID."
          call: "gtm.get-tag"
          with:
            tag_id: "{{tag_id}}"
          outputParameters:
            - name: tag_name
              type: string
              mapping: "$.tag.name"
            - name: tag_type
              type: string
              mapping: "$.tag.type"
  consumes:
    - type: http
      namespace: gtm
      baseUri: "https://www.googleapis.com/tagmanager/v2"
      authentication:
        type: bearer
        token: "$secrets.google_tagmanager_token"
      resources:
        - name: tags
          path: "/accounts/peloton/containers/web/workspaces/default/tags/{{tag_id}}"
          inputParameters:
            - name: tag_id
              in: path
          operations:
            - name: get-tag
              method: GET

Tracks hardware delivery status by order ID. When delivery is confirmed, triggers device activation and sends a setup guide email to the member.

naftiko: "0.5"
info:
  label: "Hardware Delivery Tracker"
  description: "Tracks hardware delivery status by order ID. When delivery is confirmed, triggers device activation and sends a setup guide email to the member."
  tags:
    - hardware
    - member-engagement
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: delivery-ops
      port: 8080
      tools:
        - name: track-and-activate-delivery
          description: "Track hardware delivery and trigger device activation on delivery confirmation."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The hardware order identifier."
            - name: member_email
              in: body
              type: string
              description: "The member email address."
          steps:
            - name: check-delivery
              type: call
              call: "logistics-api.get-delivery-status"
              with:
                order_id: "{{order_id}}"
            - name: activate-device
              type: call
              call: "hardware-api.activate-device"
              with:
                order_id: "{{order_id}}"
                delivery_confirmed: "{{check-delivery.delivered}}"
            - name: send-setup-guide
              type: call
              call: "sendgrid.send-email"
              with:
                to: "{{member_email}}"
                subject: "Your Peloton Has Arrived - Setup Guide"
                body: "Your device is ready! Tracking: {{check-delivery.tracking_number}}. Start your setup at onepeloton.com/setup"
  consumes:
    - type: http
      namespace: logistics-api
      baseUri: "https://api.onepeloton.com/logistics/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_logistics_token"
      resources:
        - name: deliveries
          path: "/orders/{{order_id}}/delivery"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-delivery-status
              method: GET
    - type: http
      namespace: hardware-api
      baseUri: "https://api.onepeloton.com/hardware/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_hardware_token"
      resources:
        - name: activation
          path: "/devices/activate"
          operations:
            - name: activate-device
              method: POST
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: mail
          path: "/mail/send"
          operations:
            - name: send-email
              method: POST

Processes hardware returns by coordinating logistics pickup, issuing refunds via Stripe, and updating the CRM record.

naftiko: "0.5"
info:
  label: "Hardware Return and Refund Processor"
  description: "Processes hardware returns by coordinating logistics pickup, issuing refunds via Stripe, and updating the CRM record."
  tags:
    - returns
    - peloton
    - stripe
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: hardware
      port: 8080
      tools:
        - name: hardware-return-and-refund-processor
          description: "Processes hardware returns by coordinating logistics pickup, issuing refunds via Stripe, and updating the CRM record."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "stripe.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "salesforce.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: stripe
      baseUri: "https://api.stripe.com/v1"
      authentication:
        type: bearer
        token: "$secrets.stripe_secret_key"
      resources:
        - name: stripe-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://peloton.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_access_token"
      resources:
        - name: salesforce-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

When a hardware warranty claim is submitted, validates the device warranty status, creates a ServiceNow case, and sends the member a replacement tracking email via SendGrid.

naftiko: "0.5"
info:
  label: "Hardware Warranty Claim Processor"
  description: "When a hardware warranty claim is submitted, validates the device warranty status, creates a ServiceNow case, and sends the member a replacement tracking email via SendGrid."
  tags:
    - hardware
    - member-engagement
    - servicenow
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: warranty-ops
      port: 8080
      tools:
        - name: process-warranty-claim
          description: "Process a hardware warranty claim with validation, case creation, and member notification."
          inputParameters:
            - name: device_serial
              in: body
              type: string
              description: "The device serial number."
            - name: member_email
              in: body
              type: string
              description: "The member email address."
            - name: issue_description
              in: body
              type: string
              description: "Description of the hardware issue."
          steps:
            - name: check-warranty
              type: call
              call: "hardware-api.check-warranty"
              with:
                serial: "{{device_serial}}"
            - name: create-case
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "Warranty claim: {{device_serial}}"
                category: "hardware_warranty"
                description: "{{issue_description}}. Warranty status: {{check-warranty.status}}. Expiry: {{check-warranty.expiry_date}}"
            - name: send-confirmation
              type: call
              call: "sendgrid.send-email"
              with:
                to: "{{member_email}}"
                subject: "Peloton Warranty Claim Received"
                body: "Your warranty claim for device {{device_serial}} has been received. Case: {{create-case.number}}"
  consumes:
    - type: http
      namespace: hardware-api
      baseUri: "https://api.onepeloton.com/hardware/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_hardware_token"
      resources:
        - name: warranty
          path: "/devices/{{serial}}/warranty"
          inputParameters:
            - name: serial
              in: path
          operations:
            - name: check-warranty
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://peloton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: mail
          path: "/mail/send"
          operations:
            - name: send-email
              method: POST

Syncs marketing leads from HubSpot to Salesforce for the B2B corporate wellness team.

naftiko: "0.5"
info:
  label: "HubSpot Lead Sync"
  description: "Syncs marketing leads from HubSpot to Salesforce for the B2B corporate wellness team."
  tags:
    - marketing
    - hubspot
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: lead-sync
      port: 8080
      tools:
        - name: sync-hubspot-lead
          description: "Sync a HubSpot lead to Salesforce."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "HubSpot contact ID."
          steps:
            - name: get-contact
              type: call
              call: "hubspot.get-contact"
              with:
                contact_id: "{{contact_id}}"
            - name: create-lead
              type: call
              call: "salesforce.create-lead"
              with:
                email: "{{get-contact.email}}"
                company: "{{get-contact.company}}"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://peloton.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST

Aggregates instructor class metrics from Snowflake, generates performance reports, and publishes to Confluence for leadership review.

naftiko: "0.5"
info:
  label: "Instructor Class Performance Report"
  description: "Aggregates instructor class metrics from Snowflake, generates performance reports, and publishes to Confluence for leadership review."
  tags:
    - instructors
    - peloton
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: instructor
      port: 8080
      tools:
        - name: instructor-class-performance-report
          description: "Aggregates instructor class metrics from Snowflake, generates performance reports, and publishes to Confluence for leadership review."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "confluence.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://peloton.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: confluence-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Onboards new Peloton instructors by provisioning accounts, scheduling orientation, and setting up content creation workflows.

naftiko: "0.5"
info:
  label: "Instructor Onboarding Orchestrator"
  description: "Onboards new Peloton instructors by provisioning accounts, scheduling orientation, and setting up content creation workflows."
  tags:
    - onboarding
    - peloton
    - workday
    - jira
capability:
  exposes:
    - type: mcp
      namespace: instructor
      port: 8080
      tools:
        - name: instructor-onboarding-orchestrator
          description: "Onboards new Peloton instructors by provisioning accounts, scheduling orientation, and setting up content creation workflows."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: create-profile
              type: call
              call: "peloton.create-instructor"
              with:
                input: "{{input_id}}"
            - name: provision-hr
              type: call
              call: "workday.create-worker"
              with:
                input: "{{input_id}}"
            - name: create-onboard-tasks
              type: call
              call: "jira.create-issue"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/instructors"
          operations:
            - name: create-instructor
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/peloton/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/workers"
          operations:
            - name: create-worker
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://peloton.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Reconciles instructor compensation by matching class completions against pay schedules and flagging discrepancies.

naftiko: "0.5"
info:
  label: "Instructor Pay Reconciliation"
  description: "Reconciles instructor compensation by matching class completions against pay schedules and flagging discrepancies."
  tags:
    - compensation
    - peloton
    - workday
    - slack
capability:
  exposes:
    - type: mcp
      namespace: instructor
      port: 8080
      tools:
        - name: instructor-pay-reconciliation
          description: "Reconciles instructor compensation by matching class completions against pay schedules and flagging discrepancies."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "workday.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/peloton/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workday-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Aggregates instructor performance metrics from the content platform, stores in Snowflake, and refreshes the instructor analytics dashboard in Tableau.

naftiko: "0.5"
info:
  label: "Instructor Performance Dashboard Sync"
  description: "Aggregates instructor performance metrics from the content platform, stores in Snowflake, and refreshes the instructor analytics dashboard in Tableau."
  tags:
    - content
    - analytics
    - snowflake
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: instructor-analytics
      port: 8080
      tools:
        - name: sync-instructor-metrics
          description: "Aggregate and sync instructor performance metrics."
          inputParameters:
            - name: instructor_id
              in: body
              type: string
              description: "The instructor identifier."
            - name: period
              in: body
              type: string
              description: "The reporting period (weekly, monthly, quarterly)."
          steps:
            - name: get-metrics
              type: call
              call: "content-api.get-instructor-metrics"
              with:
                instructor_id: "{{instructor_id}}"
                period: "{{period}}"
            - name: store-metrics
              type: call
              call: "snowflake.insert-record"
              with:
                table: "instructor_performance"
                data:
                  instructor_id: "{{instructor_id}}"
                  period: "{{period}}"
                  total_classes: "{{get-metrics.total_classes}}"
                  avg_rating: "{{get-metrics.avg_rating}}"
                  total_riders: "{{get-metrics.total_riders}}"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-extract"
              with:
                datasource_id: "instructor_performance_ds"
  consumes:
    - type: http
      namespace: content-api
      baseUri: "https://api.onepeloton.com/content/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_content_token"
      resources:
        - name: instructors
          path: "/instructors/{{instructor_id}}/metrics"
          inputParameters:
            - name: instructor_id
              in: path
          operations:
            - name: get-instructor-metrics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://tableau.peloton.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/peloton/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-extract
              method: POST

Retrieves an instructor's class schedule for a given week. Returns scheduled classes, class types, and studio assignments.

naftiko: "0.5"
info:
  label: "Instructor Schedule Lookup"
  description: "Retrieves an instructor's class schedule for a given week. Returns scheduled classes, class types, and studio assignments."
  tags:
    - content
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: instructor-ops
      port: 8080
      tools:
        - name: get-instructor-schedule
          description: "Look up an instructor's weekly class schedule."
          inputParameters:
            - name: instructor_id
              in: body
              type: string
              description: "The instructor identifier."
            - name: week_start
              in: body
              type: string
              description: "The week start date in YYYY-MM-DD format."
          call: "studio-api.get-schedule"
          with:
            instructor_id: "{{instructor_id}}"
            week_start: "{{week_start}}"
          outputParameters:
            - name: classes
              type: array
              mapping: "$.data.scheduled_classes"
            - name: total_classes
              type: integer
              mapping: "$.data.total_count"
  consumes:
    - type: http
      namespace: studio-api
      baseUri: "https://api.onepeloton.com/studio/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_studio_token"
      resources:
        - name: schedules
          path: "/instructors/{{instructor_id}}/schedule"
          inputParameters:
            - name: instructor_id
              in: path
          operations:
            - name: get-schedule
              method: GET

Creates a Jira bug ticket for platform issues, links to the Datadog incident, and notifies the engineering team in Slack.

naftiko: "0.5"
info:
  label: "Jira Bug Tracker"
  description: "Creates a Jira bug ticket for platform issues, links to the Datadog incident, and notifies the engineering team in Slack."
  tags:
    - development
    - jira
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: bug-tracking
      port: 8080
      tools:
        - name: create-bug-ticket
          description: "Create a Jira bug ticket with Datadog incident context and Slack notification."
          inputParameters:
            - name: summary
              in: body
              type: string
              description: "Bug summary."
            - name: description
              in: body
              type: string
              description: "Detailed bug description."
            - name: datadog_monitor_id
              in: body
              type: string
              description: "Related Datadog monitor ID."
            - name: priority
              in: body
              type: string
              description: "Bug priority."
          steps:
            - name: get-monitor-context
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{datadog_monitor_id}}"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "PLAT"
                issue_type: "Bug"
                summary: "{{summary}}"
                description: "{{description}}\n\nDatadog monitor: {{get-monitor-context.name}} ({{get-monitor-context.overall_state}})"
                priority: "{{priority}}"
            - name: notify-engineering
              type: call
              call: "slack.post-message"
              with:
                channel: "engineering-bugs"
                text: "New bug: {{create-ticket.key}} - {{summary}} ({{priority}}). Datadog: {{get-monitor-context.name}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://peloton.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              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

Pulls sprint progress from Jira and posts a summary to Slack.

naftiko: "0.5"
info:
  label: "Jira Sprint Reporter"
  description: "Pulls sprint progress from Jira and posts a summary to Slack."
  tags:
    - development
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: dev-reporting
      port: 8080
      tools:
        - name: report-sprint
          description: "Post Jira sprint progress to Slack."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira board ID."
          steps:
            - name: get-sprint
              type: call
              call: "jira.get-active-sprint"
              with:
                board_id: "{{board_id}}"
            - name: get-issues
              type: call
              call: "jira.get-sprint-issues"
              with:
                sprint_id: "{{get-sprint.id}}"
            - name: post-report
              type: call
              call: "slack.post-message"
              with:
                channel: "engineering"
                text: "Sprint {{get-sprint.name}}: {{get-issues.done_count}}/{{get-issues.total_count}} done."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://peloton.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprints
          path: "/board/{{board_id}}/sprint?state=active"
          inputParameters:
            - name: board_id
              in: path
          operations:
            - name: get-active-sprint
              method: GET
        - name: sprint-issues
          path: "/sprint/{{sprint_id}}/issue"
          inputParameters:
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-issues
              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

Pulls LinkedIn ad metrics and stores in Snowflake for B2B marketing analysis.

naftiko: "0.5"
info:
  label: "LinkedIn Ad Campaign Reporter"
  description: "Pulls LinkedIn ad metrics and stores in Snowflake for B2B marketing analysis."
  tags:
    - marketing
    - linkedin
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: b2b-marketing
      port: 8080
      tools:
        - name: report-linkedin-campaign
          description: "Report LinkedIn ad performance to Snowflake."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "LinkedIn campaign ID."
          steps:
            - name: get-metrics
              type: call
              call: "linkedin.get-analytics"
              with:
                campaign_id: "{{campaign_id}}"
            - name: store-report
              type: call
              call: "snowflake.insert-record"
              with:
                table: "linkedin_campaigns"
                data:
                  campaign_id: "{{campaign_id}}"
                  impressions: "{{get-metrics.impressions}}"
                  clicks: "{{get-metrics.clicks}}"
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: analytics
          path: "/adAnalyticsV2?campaigns=urn:li:sponsoredCampaign:{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-analytics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

Responds to live class streaming incidents by checking CDN health, alerting engineering, and posting status updates.

naftiko: "0.5"
info:
  label: "Live Class Incident Response"
  description: "Responds to live class streaming incidents by checking CDN health, alerting engineering, and posting status updates."
  tags:
    - streaming
    - peloton
    - datadog
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: live
      port: 8080
      tools:
        - name: live-class-incident-response
          description: "Responds to live class streaming incidents by checking CDN health, alerting engineering, and posting status updates."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "datadog.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "pagerduty.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  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: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: pagerduty-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Monitors real-time viewer counts during live classes, stores metrics in Snowflake, and sends alerts to Slack if viewership drops below expected thresholds.

naftiko: "0.5"
info:
  label: "Live Class Viewer Count Monitor"
  description: "Monitors real-time viewer counts during live classes, stores metrics in Snowflake, and sends alerts to Slack if viewership drops below expected thresholds."
  tags:
    - content
    - analytics
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: live-monitoring
      port: 8080
      tools:
        - name: monitor-live-viewership
          description: "Monitor live class viewership and alert on anomalies."
          inputParameters:
            - name: class_id
              in: body
              type: string
              description: "The live class identifier."
            - name: expected_viewers
              in: body
              type: integer
              description: "Expected minimum viewer count."
          steps:
            - name: get-live-metrics
              type: call
              call: "streaming-api.get-live-stats"
              with:
                class_id: "{{class_id}}"
            - name: store-metrics
              type: call
              call: "snowflake.insert-record"
              with:
                table: "live_class_metrics"
                data:
                  class_id: "{{class_id}}"
                  viewer_count: "{{get-live-metrics.current_viewers}}"
                  peak_viewers: "{{get-live-metrics.peak_viewers}}"
            - name: alert-if-low
              type: call
              call: "slack.post-message"
              with:
                channel: "content-ops"
                text: "Live class {{class_id}}: {{get-live-metrics.current_viewers}} viewers (expected: {{expected_viewers}}). Peak: {{get-live-metrics.peak_viewers}}"
  consumes:
    - type: http
      namespace: streaming-api
      baseUri: "https://api.onepeloton.com/streaming/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_streaming_token"
      resources:
        - name: live
          path: "/classes/{{class_id}}/live-stats"
          inputParameters:
            - name: class_id
              in: path
          operations:
            - name: get-live-stats
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              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

Sends a MailChimp email campaign to a subscriber segment for Peloton marketing.

naftiko: "0.5"
info:
  label: "MailChimp Campaign Dispatcher"
  description: "Sends a MailChimp email campaign to a subscriber segment for Peloton marketing."
  tags:
    - marketing
    - mailchimp
capability:
  exposes:
    - type: mcp
      namespace: email-campaigns
      port: 8080
      tools:
        - name: send-mailchimp-campaign
          description: "Send a MailChimp campaign to a segment."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The MailChimp campaign ID."
          call: "mailchimp.send-campaign"
          with:
            campaign_id: "{{campaign_id}}"
  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/{{campaign_id}}/actions/send"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: send-campaign
              method: POST

Tracks marketing campaign attribution by correlating ad spend with new member signups and computing ROI metrics.

naftiko: "0.5"
info:
  label: "Marketing Attribution Pipeline"
  description: "Tracks marketing campaign attribution by correlating ad spend with new member signups and computing ROI metrics."
  tags:
    - marketing
    - peloton
    - google-analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: marketing
      port: 8080
      tools:
        - name: marketing-attribution-pipeline
          description: "Tracks marketing campaign attribution by correlating ad spend with new member signups and computing ROI metrics."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "google-analytics.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: google-analytics-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Pulls campaign performance from Google Ads and Facebook, correlates with subscription conversions in Snowflake, and updates the marketing dashboard in Tableau.

naftiko: "0.5"
info:
  label: "Marketing Campaign Performance Tracker"
  description: "Pulls campaign performance from Google Ads and Facebook, correlates with subscription conversions in Snowflake, and updates the marketing dashboard in Tableau."
  tags:
    - marketing
    - subscription
    - google-ads
    - facebook
    - snowflake
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: track-campaign-performance
          description: "Track marketing campaign performance across channels and correlate with subscriptions."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The marketing campaign identifier."
            - name: date_start
              in: body
              type: string
              description: "Report start date."
            - name: date_end
              in: body
              type: string
              description: "Report end date."
          steps:
            - name: get-google-metrics
              type: call
              call: "google-ads.get-campaign-stats"
              with:
                campaign_id: "{{campaign_id}}"
                start_date: "{{date_start}}"
                end_date: "{{date_end}}"
            - name: get-facebook-metrics
              type: call
              call: "meta-api.get-campaign-insights"
              with:
                campaign_id: "{{campaign_id}}"
                start_date: "{{date_start}}"
                end_date: "{{date_end}}"
            - name: correlate-conversions
              type: call
              call: "snowflake.execute-query"
              with:
                query: "CALL correlate_campaign_conversions('{{campaign_id}}', '{{date_start}}', '{{date_end}}')"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-extract"
              with:
                datasource_id: "marketing_performance_ds"
  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/peloton/campaigns/{{campaign_id}}/stats"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-stats
              method: GET
    - type: http
      namespace: meta-api
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_access_token"
      resources:
        - name: campaigns
          path: "/{{campaign_id}}/insights"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-insights
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://tableau.peloton.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/peloton/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-extract
              method: POST

Pulls member activity data from the platform, calculates engagement scores in Snowflake, and updates Salesforce with the latest engagement tier for targeted campaigns.

naftiko: "0.5"
info:
  label: "Member Engagement Score Calculator"
  description: "Pulls member activity data from the platform, calculates engagement scores in Snowflake, and updates Salesforce with the latest engagement tier for targeted campaigns."
  tags:
    - member-engagement
    - analytics
    - snowflake
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: engagement-analytics
      port: 8080
      tools:
        - name: calculate-engagement-score
          description: "Calculate member engagement scores and update Salesforce for campaign targeting."
          inputParameters:
            - name: member_segment
              in: body
              type: string
              description: "The member segment to process."
            - name: lookback_days
              in: body
              type: integer
              description: "Number of days to analyze activity."
          steps:
            - name: get-activity-data
              type: call
              call: "platform-api.get-member-activity"
              with:
                segment: "{{member_segment}}"
                days: "{{lookback_days}}"
            - name: calculate-scores
              type: call
              call: "snowflake.execute-query"
              with:
                query: "CALL calculate_engagement_scores('{{member_segment}}', {{lookback_days}})"
            - name: update-salesforce
              type: call
              call: "salesforce.update-segment"
              with:
                segment: "{{member_segment}}"
                engagement_scores: "{{calculate-scores.results}}"
  consumes:
    - type: http
      namespace: platform-api
      baseUri: "https://api.onepeloton.com/platform/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_platform_token"
      resources:
        - name: activity
          path: "/members/activity"
          operations:
            - name: get-member-activity
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://peloton.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: segments
          path: "/sobjects/Member_Segment__c"
          operations:
            - name: update-segment
              method: PATCH

Collects member feedback from surveys, analyzes sentiment, and routes actionable insights to product teams via Jira.

naftiko: "0.5"
info:
  label: "Member Feedback Sentiment Analyzer"
  description: "Collects member feedback from surveys, analyzes sentiment, and routes actionable insights to product teams via Jira."
  tags:
    - feedback
    - peloton
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-feedback-sentiment-analyzer
          description: "Collects member feedback from surveys, analyzes sentiment, and routes actionable insights to product teams via Jira."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "jira.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://peloton.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Detects member workout milestones, creates personalized congratulations, and sends push notifications and social media posts.

naftiko: "0.5"
info:
  label: "Member Milestone Celebration Pipeline"
  description: "Detects member workout milestones, creates personalized congratulations, and sends push notifications and social media posts."
  tags:
    - milestones
    - peloton
    - sendgrid
    - slack
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-milestone-celebration-pipeline
          description: "Detects member workout milestones, creates personalized congratulations, and sends push notifications and social media posts."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "sendgrid.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              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: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Retrieves a Peloton member profile by member ID. Returns username, location, total workouts, and membership status.

naftiko: "0.5"
info:
  label: "Member Profile Lookup"
  description: "Retrieves a Peloton member profile by member ID. Returns username, location, total workouts, and membership status."
  tags:
    - member-engagement
    - member-data
capability:
  exposes:
    - type: mcp
      namespace: member-profiles
      port: 8080
      tools:
        - name: get-member-profile
          description: "Look up a member profile by ID."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The member identifier."
          call: "platform-api.get-profile"
          with:
            member_id: "{{member_id}}"
          outputParameters:
            - name: username
              type: string
              mapping: "$.data.username"
            - name: total_workouts
              type: integer
              mapping: "$.data.total_workouts"
            - name: membership_status
              type: string
              mapping: "$.data.membership_status"
  consumes:
    - type: http
      namespace: platform-api
      baseUri: "https://api.onepeloton.com/platform/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_platform_token"
      resources:
        - name: members
          path: "/members/{{member_id}}"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-profile
              method: GET

Processes member referral rewards by validating the referral, crediting accounts, and sending confirmation notifications.

naftiko: "0.5"
info:
  label: "Member Referral Rewards Processor"
  description: "Processes member referral rewards by validating the referral, crediting accounts, and sending confirmation notifications."
  tags:
    - referrals
    - peloton
    - stripe
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-referral-rewards-processor
          description: "Processes member referral rewards by validating the referral, crediting accounts, and sending confirmation notifications."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "stripe.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "sendgrid.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: stripe
      baseUri: "https://api.stripe.com/v1"
      authentication:
        type: bearer
        token: "$secrets.stripe_secret_key"
      resources:
        - name: stripe-resource
          path: "/execute"
          operations:
            - name: execute
              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: "/execute"
          operations:
            - name: execute
              method: POST

Identifies at-risk members, generates personalized recommendations, and triggers re-engagement campaigns through email and push notifications.

naftiko: "0.5"
info:
  label: "Member Retention Intervention Workflow"
  description: "Identifies at-risk members, generates personalized recommendations, and triggers re-engagement campaigns through email and push notifications."
  tags:
    - retention
    - peloton
    - snowflake
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-retention-intervention-workflow
          description: "Identifies at-risk members, generates personalized recommendations, and triggers re-engagement campaigns through email and push notifications."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "sendgrid.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "hubspot.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              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: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: hubspot-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

When a new subscription is created in the billing system, provisions the member account, activates hardware pairing, sends a welcome email via SendGrid, and logs the subscription in Snowflake.

naftiko: "0.5"
info:
  label: "Member Subscription Orchestrator"
  description: "When a new subscription is created in the billing system, provisions the member account, activates hardware pairing, sends a welcome email via SendGrid, and logs the subscription in Snowflake."
  tags:
    - subscription
    - member-engagement
    - sendgrid
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: subscription-ops
      port: 8080
      tools:
        - name: process-new-subscription
          description: "Orchestrate new member subscription setup across billing, hardware, and notification systems."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The Peloton member identifier."
            - name: plan_type
              in: body
              type: string
              description: "Subscription plan type (all-access, app-only, guide)."
            - name: hardware_id
              in: body
              type: string
              description: "The hardware device serial number, if applicable."
          steps:
            - name: activate-subscription
              type: call
              call: "billing-api.activate-plan"
              with:
                member_id: "{{member_id}}"
                plan_type: "{{plan_type}}"
            - name: pair-hardware
              type: call
              call: "hardware-api.pair-device"
              with:
                member_id: "{{member_id}}"
                device_serial: "{{hardware_id}}"
            - name: send-welcome
              type: call
              call: "sendgrid.send-email"
              with:
                to: "{{activate-subscription.email}}"
                subject: "Welcome to Peloton!"
                body: "Your {{plan_type}} subscription is active. Device paired: {{pair-hardware.status}}"
            - name: log-subscription
              type: call
              call: "snowflake.insert-record"
              with:
                table: "subscriptions"
                data:
                  member_id: "{{member_id}}"
                  plan_type: "{{plan_type}}"
                  hardware_id: "{{hardware_id}}"
  consumes:
    - type: http
      namespace: billing-api
      baseUri: "https://api.onepeloton.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_billing_token"
      resources:
        - name: plans
          path: "/subscriptions/activate"
          operations:
            - name: activate-plan
              method: POST
    - type: http
      namespace: hardware-api
      baseUri: "https://api.onepeloton.com/hardware/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_hardware_token"
      resources:
        - name: devices
          path: "/devices/pair"
          operations:
            - name: pair-device
              method: POST
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: mail
          path: "/mail/send"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

Identifies lapsed members, generates personalized win-back offers, and delivers multi-channel re-engagement campaigns.

naftiko: "0.5"
info:
  label: "Member Win-Back Campaign Orchestrator"
  description: "Identifies lapsed members, generates personalized win-back offers, and delivers multi-channel re-engagement campaigns."
  tags:
    - retention
    - peloton
    - hubspot
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: member
      port: 8080
      tools:
        - name: member-win-back-campaign-orchestrator
          description: "Identifies lapsed members, generates personalized win-back offers, and delivers multi-channel re-engagement campaigns."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: query-lapsed
              type: call
              call: "snowflake.run-query"
              with:
                input: "{{input_id}}"
            - name: create-campaign
              type: call
              call: "hubspot.create-campaign"
              with:
                input: "{{input_id}}"
            - name: send-offers
              type: call
              call: "sendgrid.send-email"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: hubspot-resource
          path: "/marketing/v3/campaigns"
          operations:
            - name: create-campaign
              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: "/mail/send"
          operations:
            - name: send-email
              method: POST

Retrieves a member's workout history by member ID. Returns recent workouts, total counts by type, and personal records.

naftiko: "0.5"
info:
  label: "Member Workout History Lookup"
  description: "Retrieves a member's workout history by member ID. Returns recent workouts, total counts by type, and personal records."
  tags:
    - member-engagement
    - fitness-data
capability:
  exposes:
    - type: mcp
      namespace: member-data
      port: 8080
      tools:
        - name: get-workout-history
          description: "Look up a member's workout history and personal records."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The Peloton member identifier."
            - name: limit
              in: body
              type: integer
              description: "Number of recent workouts to return."
          call: "platform-api.get-workouts"
          with:
            member_id: "{{member_id}}"
            limit: "{{limit}}"
          outputParameters:
            - name: workouts
              type: array
              mapping: "$.data.workouts"
            - name: total_workouts
              type: integer
              mapping: "$.data.total_count"
            - name: personal_records
              type: object
              mapping: "$.data.personal_records"
  consumes:
    - type: http
      namespace: platform-api
      baseUri: "https://api.onepeloton.com/platform/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_platform_token"
      resources:
        - name: workouts
          path: "/members/{{member_id}}/workouts"
          inputParameters:
            - name: member_id
              in: path
          operations:
            - name: get-workouts
              method: GET

Sends a message to a Microsoft Teams channel. Used for cross-platform notifications.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Notifier"
  description: "Sends a message to a Microsoft Teams channel. Used for cross-platform notifications."
  tags:
    - communications
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: teams-notifications
      port: 8080
      tools:
        - name: send-teams-message
          description: "Post a message to Microsoft Teams."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "Teams channel ID."
            - name: message
              in: body
              type: string
              description: "Message text."
          call: "msteams.send-message"
          with:
            channel_id: "{{channel_id}}"
            text: "{{message}}"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Checks music licensing agreements for class content, validates rights availability, and updates the content system with approved playlists.

naftiko: "0.5"
info:
  label: "Music Licensing Sync"
  description: "Checks music licensing agreements for class content, validates rights availability, and updates the content system with approved playlists."
  tags:
    - content
    - licensing
capability:
  exposes:
    - type: mcp
      namespace: music-licensing
      port: 8080
      tools:
        - name: validate-music-rights
          description: "Validate music licensing rights for class content."
          inputParameters:
            - name: class_id
              in: body
              type: string
              description: "The class identifier."
            - name: playlist_id
              in: body
              type: string
              description: "The playlist identifier."
          steps:
            - name: check-rights
              type: call
              call: "music-api.validate-playlist"
              with:
                playlist_id: "{{playlist_id}}"
            - name: update-class
              type: call
              call: "content-api.set-playlist"
              with:
                class_id: "{{class_id}}"
                playlist_id: "{{playlist_id}}"
                rights_status: "{{check-rights.status}}"
  consumes:
    - type: http
      namespace: music-api
      baseUri: "https://api.onepeloton.com/music/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_music_token"
      resources:
        - name: playlists
          path: "/playlists/{{playlist_id}}/validate"
          inputParameters:
            - name: playlist_id
              in: path
          operations:
            - name: validate-playlist
              method: GET
    - type: http
      namespace: content-api
      baseUri: "https://api.onepeloton.com/content/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_content_token"
      resources:
        - name: classes
          path: "/classes/{{class_id}}/playlist"
          inputParameters:
            - name: class_id
              in: path
          operations:
            - name: set-playlist
              method: PUT

Retrieves application performance from New Relic for the Peloton platform.

naftiko: "0.5"
info:
  label: "New Relic Performance Monitor"
  description: "Retrieves application performance from New Relic for the Peloton platform."
  tags:
    - operations
    - new-relic
capability:
  exposes:
    - type: mcp
      namespace: apm-ops
      port: 8080
      tools:
        - name: get-app-performance
          description: "Get app performance from New Relic."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "New Relic app ID."
          call: "newrelic.get-app"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: response_time
              type: number
              mapping: "$.application.application_summary.response_time"
            - name: error_rate
              type: number
              mapping: "$.application.application_summary.error_rate"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apiKey
        key: "$secrets.newrelic_api_key"
        header: "X-Api-Key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app
              method: GET

Analyzes NPS survey responses, segments by member cohort, and distributes insights to product and support teams.

naftiko: "0.5"
info:
  label: "NPS Survey Analysis Pipeline"
  description: "Analyzes NPS survey responses, segments by member cohort, and distributes insights to product and support teams."
  tags:
    - surveys
    - peloton
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: nps
      port: 8080
      tools:
        - name: nps-survey-analysis-pipeline
          description: "Analyzes NPS survey responses, segments by member cohort, and distributes insights to product and support teams."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "tableau.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://tableau.peloton.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: tableau-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Integrates partner content into the Peloton platform by validating assets, scheduling publication, and tracking performance.

naftiko: "0.5"
info:
  label: "Partnership Content Integration Pipeline"
  description: "Integrates partner content into the Peloton platform by validating assets, scheduling publication, and tracking performance."
  tags:
    - partnerships
    - peloton
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: partnership
      port: 8080
      tools:
        - name: partnership-content-integration-pipeline
          description: "Integrates partner content into the Peloton platform by validating assets, scheduling publication, and tracking performance."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: validate-content
              type: call
              call: "peloton.validate-content"
              with:
                input: "{{input_id}}"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                input: "{{input_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/content/validate"
          operations:
            - name: validate-content
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://peloton.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Segments members from Salesforce, sends targeted push notifications via the mobile platform, and logs delivery metrics in Snowflake.

naftiko: "0.5"
info:
  label: "Push Notification Campaign Sender"
  description: "Segments members from Salesforce, sends targeted push notifications via the mobile platform, and logs delivery metrics in Snowflake."
  tags:
    - member-engagement
    - marketing
    - salesforce
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: push-campaigns
      port: 8080
      tools:
        - name: send-push-campaign
          description: "Send a targeted push notification campaign to a member segment."
          inputParameters:
            - name: segment_id
              in: body
              type: string
              description: "The Salesforce audience segment identifier."
            - name: message_title
              in: body
              type: string
              description: "The push notification title."
            - name: message_body
              in: body
              type: string
              description: "The push notification body text."
          steps:
            - name: get-audience
              type: call
              call: "salesforce.get-segment-members"
              with:
                segment_id: "{{segment_id}}"
            - name: send-notifications
              type: call
              call: "mobile-api.send-push-batch"
              with:
                member_ids: "{{get-audience.member_ids}}"
                title: "{{message_title}}"
                body: "{{message_body}}"
            - name: log-delivery
              type: call
              call: "snowflake.insert-record"
              with:
                table: "push_campaign_metrics"
                data:
                  segment_id: "{{segment_id}}"
                  sent_count: "{{send-notifications.sent_count}}"
                  delivered_count: "{{send-notifications.delivered_count}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://peloton.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: segments
          path: "/sobjects/Member_Segment__c/{{segment_id}}/members"
          inputParameters:
            - name: segment_id
              in: path
          operations:
            - name: get-segment-members
              method: GET
    - type: http
      namespace: mobile-api
      baseUri: "https://api.onepeloton.com/mobile/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_mobile_token"
      resources:
        - name: push
          path: "/notifications/push/batch"
          operations:
            - name: send-push-batch
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

Generates quarterly fitness summary reports for members, assembles data from workouts, and delivers via email.

naftiko: "0.5"
info:
  label: "Quarterly Fitness Report Generator"
  description: "Generates quarterly fitness summary reports for members, assembles data from workouts, and delivers via email."
  tags:
    - reporting
    - peloton
    - snowflake
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: quarterly
      port: 8080
      tools:
        - name: quarterly-fitness-report-generator
          description: "Generates quarterly fitness summary reports for members, assembles data from workouts, and delivers via email."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "sendgrid.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              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: "/execute"
          operations:
            - name: execute
              method: POST

Looks up a Salesforce lead by email. Returns lead status, source, and owner for the sales team.

naftiko: "0.5"
info:
  label: "Salesforce Lead Lookup"
  description: "Looks up a Salesforce lead by email. Returns lead status, source, and owner for the sales team."
  tags:
    - sales
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: get-lead-by-email
          description: "Look up a Salesforce lead by email address."
          inputParameters:
            - name: email
              in: body
              type: string
              description: "The lead email address."
          call: "salesforce.query-lead"
          with:
            email: "{{email}}"
          outputParameters:
            - name: lead_status
              type: string
              mapping: "$.records[0].Status"
            - name: lead_source
              type: string
              mapping: "$.records[0].LeadSource"
            - name: owner
              type: string
              mapping: "$.records[0].Owner.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://peloton.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/query?q=SELECT+Id,Status,LeadSource,Owner.Name+FROM+Lead+WHERE+Email='{{email}}'"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: query-lead
              method: GET

Syncs approved SAP Concur expense reports to Oracle financials and notifies finance via Slack.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Sync"
  description: "Syncs approved SAP Concur expense reports to Oracle financials and notifies finance via Slack."
  tags:
    - finance
    - sap-concur
    - oracle
    - slack
capability:
  exposes:
    - type: mcp
      namespace: expense-ops
      port: 8080
      tools:
        - name: sync-expenses
          description: "Sync approved expenses from Concur to Oracle."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Concur report ID."
          steps:
            - name: get-report
              type: call
              call: "concur.get-report"
              with:
                report_id: "{{report_id}}"
            - name: create-journal
              type: call
              call: "oracle.create-journal"
              with:
                amount: "{{get-report.total_amount}}"
                description: "Expense {{report_id}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "finance"
                text: "Expense {{report_id}} synced. Amount: ${{get-report.total_amount}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://peloton.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: journals
          path: "/journalEntries"
          operations:
            - name: create-journal
              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

Plans seasonal content releases by analyzing viewership trends, scheduling classes, and notifying instructors through Teams.

naftiko: "0.5"
info:
  label: "Seasonal Content Calendar Planner"
  description: "Plans seasonal content releases by analyzing viewership trends, scheduling classes, and notifying instructors through Teams."
  tags:
    - content
    - peloton
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: seasonal
      port: 8080
      tools:
        - name: seasonal-content-calendar-planner
          description: "Plans seasonal content releases by analyzing viewership trends, scheduling classes, and notifying instructors through Teams."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "snowflake.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "teams.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "jira.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/execute"
          operations:
            - name: execute
              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: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://peloton.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: jira-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Sends a transactional email via SendGrid. Reusable email sending primitive for Peloton workflows.

naftiko: "0.5"
info:
  label: "SendGrid Email Sender"
  description: "Sends a transactional email via SendGrid. Reusable email sending primitive for Peloton workflows."
  tags:
    - communications
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: email-ops
      port: 8080
      tools:
        - name: send-email
          description: "Send a transactional email via SendGrid."
          inputParameters:
            - name: to
              in: body
              type: string
              description: "Recipient email address."
            - name: subject
              in: body
              type: string
              description: "Email subject."
            - name: body
              in: body
              type: string
              description: "Email body text."
          call: "sendgrid.send-email"
          with:
            to: "{{to}}"
            subject: "{{subject}}"
            body: "{{body}}"
  consumes:
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: mail
          path: "/mail/send"
          operations:
            - name: send-email
              method: POST

Looks up a ServiceNow customer support case by number. Returns case status, priority, and assigned agent.

naftiko: "0.5"
info:
  label: "ServiceNow Support Ticket Lookup"
  description: "Looks up a ServiceNow customer support case by number. Returns case status, priority, and assigned agent."
  tags:
    - member-engagement
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: support-ops
      port: 8080
      tools:
        - name: get-support-case
          description: "Look up a customer support case by number."
          inputParameters:
            - name: case_number
              in: body
              type: string
              description: "The ServiceNow case number."
          call: "servicenow.get-case"
          with:
            case_number: "{{case_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_agent
              type: string
              mapping: "$.result.assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://peloton.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_customerservice_case?sysparm_query=number={{case_number}}"
          inputParameters:
            - name: case_number
              in: query
          operations:
            - name: get-case
              method: GET

Uploads a document to SharePoint. Used for report sharing across Peloton teams.

naftiko: "0.5"
info:
  label: "SharePoint Document Upload"
  description: "Uploads a document to SharePoint. Used for report sharing across Peloton teams."
  tags:
    - document-management
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: doc-management
      port: 8080
      tools:
        - name: upload-document
          description: "Upload a document to SharePoint."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "SharePoint site ID."
            - name: file_path
              in: body
              type: string
              description: "Destination file path."
          call: "sharepoint.upload-file"
          with:
            site_id: "{{site_id}}"
            file_path: "{{file_path}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: upload-file
              method: PUT

Analyzes retail showroom foot traffic, correlates with sales conversions, and updates the retail dashboard.

naftiko: "0.5"
info:
  label: "Showroom Traffic Analysis Pipeline"
  description: "Analyzes retail showroom foot traffic, correlates with sales conversions, and updates the retail dashboard."
  tags:
    - retail
    - peloton
    - google-analytics
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: showroom
      port: 8080
      tools:
        - name: showroom-traffic-analysis-pipeline
          description: "Analyzes retail showroom foot traffic, correlates with sales conversions, and updates the retail dashboard."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: get-traffic
              type: call
              call: "google-analytics.run-report"
              with:
                input: "{{input_id}}"
            - name: correlate-sales
              type: call
              call: "snowflake.run-query"
              with:
                input: "{{input_id}}"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-workbook"
              with:
                input: "{{input_id}}"
  consumes:
    - type: http
      namespace: google-analytics
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: google-analytics-resource
          path: "/properties/runReport"
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: snowflake-resource
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://tableau.peloton.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: tableau-resource
          path: "/sites/default/workbooks/refresh"
          operations:
            - name: refresh-workbook
              method: POST

Sends a formatted message to a Slack channel. Reusable notification primitive for Peloton workflows.

naftiko: "0.5"
info:
  label: "Slack Channel Notifier"
  description: "Sends a formatted message to a Slack channel. Reusable notification primitive for Peloton workflows."
  tags:
    - communications
    - slack
capability:
  exposes:
    - type: mcp
      namespace: slack-notifications
      port: 8080
      tools:
        - name: send-slack-message
          description: "Send a message to a Slack channel."
          inputParameters:
            - name: channel
              in: body
              type: string
              description: "The Slack channel."
            - name: text
              in: body
              type: string
              description: "The message text."
          call: "slack.post-message"
          with:
            channel: "{{channel}}"
            text: "{{text}}"
  consumes:
    - 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

Executes a SQL query against Peloton's Snowflake data warehouse. Returns result rows and metadata.

naftiko: "0.5"
info:
  label: "Snowflake Query Runner"
  description: "Executes a SQL query against Peloton's Snowflake data warehouse. Returns result rows and metadata."
  tags:
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: data-warehouse
      port: 8080
      tools:
        - name: run-snowflake-query
          description: "Execute a SQL query against the Peloton Snowflake warehouse."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The SQL query to execute."
          call: "snowflake.execute-query"
          with:
            statement: "{{query}}"
          outputParameters:
            - name: rows
              type: array
              mapping: "$.data"
            - name: row_count
              type: integer
              mapping: "$.resultSetMetaData.numRows"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Syncs challenge leaderboard data to social media platforms and sends progress updates to participants.

naftiko: "0.5"
info:
  label: "Social Challenge Leaderboard Sync"
  description: "Syncs challenge leaderboard data to social media platforms and sends progress updates to participants."
  tags:
    - social
    - peloton
    - twitter
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: social
      port: 8080
      tools:
        - name: social-challenge-leaderboard-sync
          description: "Syncs challenge leaderboard data to social media platforms and sends progress updates to participants."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "twitter.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "sendgrid.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: twitter
      baseUri: "https://api.twitter.com/2"
      authentication:
        type: bearer
        token: "$secrets.twitter_bearer_token"
      resources:
        - name: twitter-resource
          path: "/execute"
          operations:
            - name: execute
              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: "/execute"
          operations:
            - name: execute
              method: POST

Pulls brand engagement metrics from Instagram and Facebook, stores in Snowflake, and updates the social media dashboard in Tableau for the marketing team.

naftiko: "0.5"
info:
  label: "Social Media Engagement Aggregator"
  description: "Pulls brand engagement metrics from Instagram and Facebook, stores in Snowflake, and updates the social media dashboard in Tableau for the marketing team."
  tags:
    - marketing
    - social-media
    - instagram
    - facebook
    - snowflake
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: social-analytics
      port: 8080
      tools:
        - name: aggregate-social-engagement
          description: "Aggregate social media engagement metrics across platforms."
          inputParameters:
            - name: date
              in: body
              type: string
              description: "The reporting date."
          steps:
            - name: get-instagram-data
              type: call
              call: "meta-api.get-page-insights"
              with:
                platform: "instagram"
                date: "{{date}}"
            - name: get-facebook-data
              type: call
              call: "meta-api.get-page-insights"
              with:
                platform: "facebook"
                date: "{{date}}"
            - name: store-metrics
              type: call
              call: "snowflake.insert-record"
              with:
                table: "social_engagement"
                data:
                  date: "{{date}}"
                  ig_engagement: "{{get-instagram-data.engagement_rate}}"
                  fb_engagement: "{{get-facebook-data.engagement_rate}}"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-extract"
              with:
                datasource_id: "social_engagement_ds"
  consumes:
    - type: http
      namespace: meta-api
      baseUri: "https://graph.facebook.com/v18.0"
      authentication:
        type: bearer
        token: "$secrets.meta_access_token"
      resources:
        - name: insights
          path: "/peloton/insights"
          operations:
            - name: get-page-insights
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://tableau.peloton.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/peloton/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-extract
              method: POST

Detects scheduling conflicts in the production studio, proposes alternatives, and updates the calendar system.

naftiko: "0.5"
info:
  label: "Studio Scheduling Conflict Resolver"
  description: "Detects scheduling conflicts in the production studio, proposes alternatives, and updates the calendar system."
  tags:
    - scheduling
    - peloton
    - google-calendar
    - slack
capability:
  exposes:
    - type: mcp
      namespace: studio
      port: 8080
      tools:
        - name: studio-scheduling-conflict-resolver
          description: "Detects scheduling conflicts in the production studio, proposes alternatives, and updates the calendar system."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "google-calendar.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "slack.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: google-calendar
      baseUri: "https://www.googleapis.com/calendar/v3"
      authentication:
        type: bearer
        token: "$secrets.google_calendar_token"
      resources:
        - name: google-calendar-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: slack-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST

Processes a subscription cancellation, updates the billing system, creates a retention case in Salesforce, and sends a win-back email via SendGrid.

naftiko: "0.5"
info:
  label: "Subscription Cancellation Processor"
  description: "Processes a subscription cancellation, updates the billing system, creates a retention case in Salesforce, and sends a win-back email via SendGrid."
  tags:
    - subscription
    - member-engagement
    - salesforce
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: cancellation-ops
      port: 8080
      tools:
        - name: process-cancellation
          description: "Process a subscription cancellation with retention follow-up."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "The member identifier."
            - name: reason
              in: body
              type: string
              description: "Cancellation reason."
          steps:
            - name: cancel-subscription
              type: call
              call: "billing-api.cancel-plan"
              with:
                member_id: "{{member_id}}"
                reason: "{{reason}}"
            - name: create-retention-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Cancellation: {{member_id}}"
                description: "Reason: {{reason}}. Plan: {{cancel-subscription.plan_type}}"
                type: "Retention"
            - name: send-winback
              type: call
              call: "sendgrid.send-email"
              with:
                to: "{{cancel-subscription.email}}"
                template_id: "winback_offer"
                subject: "We miss you at Peloton"
  consumes:
    - type: http
      namespace: billing-api
      baseUri: "https://api.onepeloton.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_billing_token"
      resources:
        - name: cancellations
          path: "/subscriptions/cancel"
          operations:
            - name: cancel-plan
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://peloton.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
    - type: http
      namespace: sendgrid
      baseUri: "https://api.sendgrid.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sendgrid_api_key"
      resources:
        - name: mail
          path: "/mail/send"
          operations:
            - name: send-email
              method: POST

Retrieves subscription plan details by plan ID. Returns plan name, price, features, and billing cycle.

naftiko: "0.5"
info:
  label: "Subscription Plan Lookup"
  description: "Retrieves subscription plan details by plan ID. Returns plan name, price, features, and billing cycle."
  tags:
    - subscription
    - billing
capability:
  exposes:
    - type: mcp
      namespace: plan-info
      port: 8080
      tools:
        - name: get-plan-details
          description: "Look up subscription plan details."
          inputParameters:
            - name: plan_id
              in: body
              type: string
              description: "The subscription plan identifier."
          call: "billing-api.get-plan"
          with:
            plan_id: "{{plan_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.data.name"
            - name: price
              type: number
              mapping: "$.data.monthly_price"
            - name: features
              type: array
              mapping: "$.data.features"
  consumes:
    - type: http
      namespace: billing-api
      baseUri: "https://api.onepeloton.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_billing_token"
      resources:
        - name: plans
          path: "/plans/{{plan_id}}"
          inputParameters:
            - name: plan_id
              in: path
          operations:
            - name: get-plan
              method: GET

Aggregates subscription revenue by plan type from the billing system, enriches with cohort analysis from Snowflake, and refreshes the finance dashboard in Tableau.

naftiko: "0.5"
info:
  label: "Subscription Revenue Report Generator"
  description: "Aggregates subscription revenue by plan type from the billing system, enriches with cohort analysis from Snowflake, and refreshes the finance dashboard in Tableau."
  tags:
    - subscription
    - revenue
    - snowflake
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: revenue-analytics
      port: 8080
      tools:
        - name: generate-revenue-report
          description: "Generate a subscription revenue report with cohort analysis."
          inputParameters:
            - name: month
              in: body
              type: string
              description: "The reporting month in YYYY-MM format."
          steps:
            - name: get-billing-data
              type: call
              call: "billing-api.get-monthly-revenue"
              with:
                month: "{{month}}"
            - name: run-cohort-analysis
              type: call
              call: "snowflake.execute-query"
              with:
                query: "CALL subscription_cohort_analysis('{{month}}')"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-extract"
              with:
                datasource_id: "subscription_revenue_ds"
  consumes:
    - type: http
      namespace: billing-api
      baseUri: "https://api.onepeloton.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.peloton_billing_token"
      resources:
        - name: revenue
          path: "/revenue/monthly"
          operations:
            - name: get-monthly-revenue
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://peloton.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://tableau.peloton.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/peloton/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-extract
              method: POST

Triggers a Tableau datasource extract refresh. Used to update dashboards after data pipeline completions.

naftiko: "0.5"
info:
  label: "Tableau Dashboard Refresh"
  description: "Triggers a Tableau datasource extract refresh. Used to update dashboards after data pipeline completions."
  tags:
    - analytics
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: dashboard-ops
      port: 8080
      tools:
        - name: refresh-tableau-dashboard
          description: "Trigger a Tableau datasource extract refresh."
          inputParameters:
            - name: datasource_id
              in: body
              type: string
              description: "The Tableau datasource identifier."
          call: "tableau.refresh-extract"
          with:
            datasource_id: "{{datasource_id}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.peloton.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/peloton/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-extract
              method: POST

Validates vendor invoices against SAP POs and creates Oracle payment requests.

naftiko: "0.5"
info:
  label: "Vendor Invoice Processor"
  description: "Validates vendor invoices against SAP POs and creates Oracle payment requests."
  tags:
    - procurement
    - sap
    - oracle
    - slack
capability:
  exposes:
    - type: mcp
      namespace: vendor-payments
      port: 8080
      tools:
        - name: process-invoice
          description: "Process a vendor invoice."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP PO number."
            - name: amount
              in: body
              type: number
              description: "Invoice amount."
          steps:
            - name: validate-po
              type: call
              call: "sap.get-po"
              with:
                po_number: "{{po_number}}"
            - name: create-payment
              type: call
              call: "oracle.create-payment"
              with:
                po_number: "{{po_number}}"
                amount: "{{amount}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "finance"
                text: "Invoice ${{amount}} for PO {{po_number}} processed."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://peloton.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://peloton.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: payments
          path: "/payablesInvoices"
          operations:
            - name: create-payment
              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

Evaluates warranty extension requests by checking device history, generating quotes, and notifying the customer.

naftiko: "0.5"
info:
  label: "Warranty Extension Evaluation Pipeline"
  description: "Evaluates warranty extension requests by checking device history, generating quotes, and notifying the customer."
  tags:
    - warranty
    - peloton
    - servicenow
    - sendgrid
capability:
  exposes:
    - type: mcp
      namespace: warranty
      port: 8080
      tools:
        - name: warranty-extension-evaluation-pipeline
          description: "Evaluates warranty extension requests by checking device history, generating quotes, and notifying the customer."
          inputParameters:
            - name: input_id
              in: body
              type: string
              description: "The primary input identifier."
          steps:
            - name: step-1
              type: call
              call: "peloton.execute"
              with:
                action: "process"
            - name: step-2
              type: call
              call: "servicenow.execute"
              with:
                action: "process"
            - name: step-3
              type: call
              call: "sendgrid.execute"
              with:
                action: "process"
  consumes:
    - type: http
      namespace: peloton
      baseUri: "https://api.onepeloton.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.peloton_api_token"
      resources:
        - name: peloton-resource
          path: "/execute"
          operations:
            - name: execute
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://peloton.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: servicenow-resource
          path: "/execute"
          operations:
            - name: execute
              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: "/execute"
          operations:
            - name: execute
              method: POST

Creates a Zoom meeting and posts the link to a Slack channel for team sync.

naftiko: "0.5"
info:
  label: "Zoom Meeting Scheduler"
  description: "Creates a Zoom meeting and posts the link to a Slack channel for team sync."
  tags:
    - communications
    - zoom
    - slack
capability:
  exposes:
    - type: mcp
      namespace: meeting-ops
      port: 8080
      tools:
        - name: schedule-zoom-meeting
          description: "Schedule a Zoom meeting and share in Slack."
          inputParameters:
            - name: topic
              in: body
              type: string
              description: "Meeting topic."
            - name: start_time
              in: body
              type: string
              description: "Start time ISO 8601."
            - name: channel
              in: body
              type: string
              description: "Slack channel."
          steps:
            - name: create-meeting
              type: call
              call: "zoom.create-meeting"
              with:
                topic: "{{topic}}"
                start_time: "{{start_time}}"
            - name: post-link
              type: call
              call: "slack.post-message"
              with:
                channel: "{{channel}}"
                text: "Zoom: {{topic}} at {{start_time}}. Join: {{create-meeting.join_url}}"
  consumes:
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/users/me/meetings"
          operations:
            - name: create-meeting
              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