Costco Capabilities

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

Sort
Expand

When traffic drops, queries Snowflake, creates Jira ticket, and alerts digital team via Slack.

naftiko: "0.5"
info:
  label: "Adobe Analytics Traffic Drop Investigation"
  description: "When traffic drops, queries Snowflake, creates Jira ticket, and alerts digital team via Slack."
  tags:
    - analytics
    - adobe-analytics
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: digital-ops
      port: 8080
      tools:
        - name: investigate-traffic-drop
          description: "Given report suite and date, investigate and alert."
          inputParameters:
            - name: report_suite
              in: body
              type: string
              description: "Report suite."
            - name: drop_date
              in: body
              type: string
              description: "Date."
            - name: drop_percentage
              in: body
              type: string
              description: "Drop percentage."
          steps:
            - name: query-data
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT channel, SUM(sessions) as sessions FROM DIGITAL.WEB_ANALYTICS WHERE report_date = '{{drop_date}}' GROUP BY channel ORDER BY sessions DESC"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: DIGITAL
                issue_type: Task
                summary: "Traffic drop: {{drop_percentage}}% on {{drop_date}}"
            - name: alert
              type: call
              call: slack.post-message
              with:
                channel: "digital-alerts"
                text: "Traffic drop {{drop_percentage}}% on {{drop_date}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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

When AWS Cost Anomaly Detection flags an unexpected spend spike, creates a ServiceNow ticket and alerts the FinOps team in Teams.

naftiko: "0.5"
info:
  label: "AWS Cost Anomaly Alert Handler"
  description: "When AWS Cost Anomaly Detection flags an unexpected spend spike, creates a ServiceNow ticket and alerts the FinOps team in Teams."
  tags:
    - cloud
    - finops
    - aws
    - servicenow
    - microsoft-teams
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-aws-cost-anomaly
          description: "Given an AWS account ID, service name, and anomaly amount, create a ServiceNow cost ticket and alert the FinOps team in Teams."
          inputParameters:
            - name: aws_account_id
              in: body
              type: string
              description: "The AWS account ID where the anomaly occurred."
            - name: anomaly_amount
              in: body
              type: number
              description: "The anomalous incremental spend in USD."
            - name: aws_service
              in: body
              type: string
              description: "The AWS service driving the spend spike."
          steps:
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "AWS cost anomaly: {{aws_service}} in {{aws_account_id}} +${{anomaly_amount}}"
                category: "cloud_cost"
                urgency: "2"
            - name: alert-finops
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "finops-team"
                message: "AWS cost spike: {{aws_service}} in {{aws_account_id}} +${{anomaly_amount}} | ServiceNow: {{create-ticket.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks Azure resource health status.

naftiko: "0.5"
info:
  label: "Azure Resource Health Check"
  description: "Checks Azure resource health status."
  tags:
    - cloud
    - azure
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: cloud-ops
      port: 8080
      tools:
        - name: check-resource-health
          description: "Given an Azure resource ID, return health status."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Azure resource ID."
          call: azure.get-health
          with:
            resource_id: "{{resource_id}}"
          outputParameters:
            - name: availability_state
              type: string
              mapping: "$.properties.availabilityState"
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: resource-health
          path: "/{{resource_id}}/providers/Microsoft.ResourceHealth/availabilityStatuses/current?api-version=2023-07-01"
          inputParameters:
            - name: resource_id
              in: path
          operations:
            - name: get-health
              method: GET

When AWS cost anomaly is detected, creates Jira ticket and alerts FinOps Slack.

naftiko: "0.5"
info:
  label: "Cloud Cost Spike Investigation"
  description: "When AWS cost anomaly is detected, creates Jira ticket and alerts FinOps Slack."
  tags:
    - cloud
    - finops
    - aws
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: investigate-cost-spike
          description: "Given an AWS account and date, investigate and alert."
          inputParameters:
            - name: aws_account_id
              in: body
              type: string
              description: "AWS account ID."
            - name: anomaly_date
              in: body
              type: string
              description: "Date YYYY-MM-DD."
          steps:
            - name: get-cost
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT service, SUM(cost) as total FROM FINOPS.AWS_BILLING WHERE account_id = '{{aws_account_id}}' AND usage_date = '{{anomaly_date}}' GROUP BY service ORDER BY total DESC"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: FINOPS
                issue_type: Task
                summary: "Cost anomaly: {{aws_account_id}} on {{anomaly_date}}"
            - name: alert
              type: call
              call: slack.post-message
              with:
                channel: "finops-alerts"
                text: "Cost spike in {{aws_account_id}} on {{anomaly_date}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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

When Datadog fires a critical alert, creates a ServiceNow incident, pages on-call via PagerDuty, and notifies ops Slack.

naftiko: "0.5"
info:
  label: "Datadog Alert to PagerDuty Escalation"
  description: "When Datadog fires a critical alert, creates a ServiceNow incident, pages on-call via PagerDuty, and notifies ops Slack."
  tags:
    - observability
    - datadog
    - pagerduty
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: incident-ops
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given an alert ID, create incident, page on-call, and notify ops."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Datadog alert ID."
            - name: alert_title
              in: body
              type: string
              description: "Alert title."
            - name: service_name
              in: body
              type: string
              description: "Affected service."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: application
                urgency: 1
                short_description: "[P1] {{alert_title}} — {{service_name}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "{{service_name}}"
                title: "{{alert_title}}"
                urgency: high
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "oncall-alerts"
                text: "P1: {{alert_title}} on {{service_name}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          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

When a Datadog monitor fires for a production infrastructure issue, creates a ServiceNow P1 incident and pages the on-call team in Teams.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Alert to ServiceNow"
  description: "When a Datadog monitor fires for a production infrastructure issue, creates a ServiceNow P1 incident and pages the on-call team in Teams."
  tags:
    - observability
    - itsm
    - datadog
    - servicenow
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: infra-ops
      port: 8080
      tools:
        - name: handle-infra-alert
          description: "Given a Datadog monitor ID and alert message, create a ServiceNow P1 incident and page the on-call team in Teams."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered."
            - name: monitor_name
              in: body
              type: string
              description: "The Datadog monitor name."
            - name: alert_message
              in: body
              type: string
              description: "The alert message body from Datadog."
          steps:
            - name: get-monitor
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Infra alert: {{monitor_name}}"
                description: "{{alert_message}}\nMonitor: {{monitor_id}}\nState: {{get-monitor.overall_state}}"
                urgency: "1"
            - name: page-oncall
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "infra-oncall"
                message: "P1 Alert: {{monitor_name}} | ServiceNow: {{create-incident.number}} | {{alert_message}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks a Datadog monitor status by ID.

naftiko: "0.5"
info:
  label: "Datadog Monitor Status Check"
  description: "Checks a Datadog monitor status by ID."
  tags:
    - observability
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-monitor-status
          description: "Given a Datadog monitor ID, return status."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Monitor ID."
          call: datadog.get-monitor
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: overall_state
              type: string
              mapping: "$.overall_state"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Queries Snowflake demand forecast, identifies SKUs below safety stock, and creates SAP replenishment POs.

naftiko: "0.5"
info:
  label: "Demand Forecast to Replenishment Order"
  description: "Queries Snowflake demand forecast, identifies SKUs below safety stock, and creates SAP replenishment POs."
  tags:
    - supply-chain
    - snowflake
    - sap
    - slack
    - replenishment
capability:
  exposes:
    - type: mcp
      namespace: replenishment
      port: 8080
      tools:
        - name: trigger-replenishment
          description: "Given a warehouse and category, check stock and create POs."
          inputParameters:
            - name: warehouse_id
              in: body
              type: string
              description: "Warehouse ID."
            - name: category
              in: body
              type: string
              description: "Product category."
          steps:
            - name: get-low-stock
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT sku, on_hand_qty, reorder_qty FROM SUPPLY_CHAIN.REPLENISHMENT_VIEW WHERE warehouse_id = '{{warehouse_id}}' AND category = '{{category}}' AND on_hand_qty < safety_stock"
            - name: create-po
              type: call
              call: sap.create-purchase-order
              with:
                items: "{{get-low-stock.results}}"
                warehouse_id: "{{warehouse_id}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "supply-chain-ops"
                text: "Replenishment for warehouse {{warehouse_id}}: {{get-low-stock.row_count}} items. PO: {{create-po.po_number}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.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"
          operations:
            - name: create-purchase-order
              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

Detects fulfillment delays in Snowflake, creates a Jira issue, updates the Salesforce member case, and notifies logistics via Slack.

naftiko: "0.5"
info:
  label: "E-Commerce Order Fulfillment Issue Pipeline"
  description: "Detects fulfillment delays in Snowflake, creates a Jira issue, updates the Salesforce member case, and notifies logistics via Slack."
  tags:
    - ecommerce
    - snowflake
    - jira
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: fulfillment-issue
      port: 8080
      tools:
        - name: handle-delay
          description: "Orchestrate fulfillment delay investigation and member notification."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "Order ID."
            - name: member_id
              in: body
              type: string
              description: "Member ID."
          steps:
            - name: get-order-details
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT order_date, expected_delivery, current_status, warehouse_id FROM ECOMMERCE.ORDERS WHERE order_id = '{{order_id}}'"
            - name: create-jira
              type: call
              call: "jira.create-issue"
              with:
                project: "ECOM"
                summary: "Fulfillment delay: Order {{order_id}}"
                description: "Order status: {{get-order-details.results[0].current_status}}. Expected delivery: {{get-order-details.results[0].expected_delivery}}."
                issuetype: "Bug"
            - name: update-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Order {{order_id}} fulfillment delay"
                member_id: "{{member_id}}"
                description: "Investigating delay. Jira: {{create-jira.key}}."
            - name: notify-logistics
              type: call
              call: "slack.post-message"
              with:
                channel: "logistics-ops"
                text: "Fulfillment delay: Order {{order_id}} from Warehouse {{get-order-details.results[0].warehouse_id}}. Jira: {{create-jira.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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: salesforce
      baseUri: "https://costco.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: 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

When a Workday termination is processed, deactivates Okta access, disables the Microsoft 365 account, and closes open ServiceNow tickets.

naftiko: "0.5"
info:
  label: "Employee Offboarding Access Revocation"
  description: "When a Workday termination is processed, deactivates Okta access, disables the Microsoft 365 account, and closes open ServiceNow tickets."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and termination date, deactivate Okta, disable the Microsoft Graph account, and resolve open ServiceNow tickets."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "Termination date in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: deactivate-okta
              type: call
              call: "okta.deactivate-user"
              with:
                login: "{{get-worker.work_email}}"
            - name: disable-m365
              type: call
              call: "msgraph.update-user"
              with:
                userPrincipalName: "{{get-worker.work_email}}"
                accountEnabled: "false"
            - name: close-tickets
              type: call
              call: "servicenow.close-user-tickets"
              with:
                caller_id: "{{get-worker.work_email}}"
  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: "/costco/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{login}}/lifecycle/deactivate"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{userPrincipalName}}"
          inputParameters:
            - name: userPrincipalName
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: close-user-tickets
              method: PATCH

Creates a ServiceNow incident for food safety reports, pulls affected product data from SAP, notifies store operations via Slack, and creates a Salesforce case for supplier follow-up.

naftiko: "0.5"
info:
  label: "Food Safety Incident Pipeline"
  description: "Creates a ServiceNow incident for food safety reports, pulls affected product data from SAP, notifies store operations via Slack, and creates a Salesforce case for supplier follow-up."
  tags:
    - food-safety
    - servicenow
    - sap
    - slack
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: food-safety
      port: 8080
      tools:
        - name: report-incident
          description: "Orchestrate food safety incident response."
          inputParameters:
            - name: product_code
              in: body
              type: string
              description: "Product code."
            - name: warehouse_id
              in: body
              type: string
              description: "Warehouse where issue found."
            - name: description
              in: body
              type: string
              description: "Incident description."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-record"
              with:
                table: "incident"
                short_description: "Food safety: {{product_code}} at Warehouse {{warehouse_id}}"
                description: "{{description}}"
                urgency: "1"
            - name: get-product-info
              type: call
              call: "sap.get-material"
              with:
                material_number: "{{product_code}}"
            - name: notify-ops
              type: call
              call: "slack.post-message"
              with:
                channel: "food-safety-alerts"
                text: "FOOD SAFETY ALERT: {{get-product-info.description}} ({{product_code}}) at Warehouse {{warehouse_id}}. Incident: {{create-incident.number}}."
            - name: create-supplier-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Food safety: {{product_code}} - {{get-product-info.description}}"
                description: "{{description}}. Warehouse: {{warehouse_id}}."
                priority: "Critical"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              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
    - type: http
      namespace: salesforce
      baseUri: "https://costco.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

On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, logs a Datadog event, and alerts the engineering team in Teams.

naftiko: "0.5"
info:
  label: "GitHub CI/CD Pipeline Failure Handler"
  description: "On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, logs a Datadog event, and alerts the engineering team in Teams."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - microsoft-teams
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops-cicd
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions workflow failure, create a Jira bug, log a Datadog event, and alert the engineering Teams channel."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
            - name: workflow_name
              in: body
              type: string
              description: "The name of the failed GitHub Actions workflow."
            - name: branch
              in: body
              type: string
              description: "The branch on which the failure occurred."
            - name: run_id
              in: body
              type: string
              description: "The GitHub Actions workflow run ID."
          steps:
            - name: get-run-details
              type: call
              call: "github.get-workflow-run"
              with:
                repo: "{{repo}}"
                run_id: "{{run_id}}"
            - name: create-jira-bug
              type: call
              call: "jira.create-issue"
              with:
                projectKey: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
                description: "Run: {{run_id}}\nConclusion: {{get-run-details.conclusion}}"
            - name: log-datadog
              type: call
              call: "datadog.create-event"
              with:
                title: "CI Failure: {{repo}} {{workflow_name}}"
                text: "Branch: {{branch}}, Run: {{run_id}}"
                alert_type: "error"
            - name: alert-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "engineering-alerts"
                message: "CI Failure: {{repo}} | Branch: {{branch}} | Workflow: {{workflow_name}} | Jira: {{create-jira-bug.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://costco.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: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: events
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a GitHub release is published, creates a ServiceNow change request and notifies engineering via Slack.

naftiko: "0.5"
info:
  label: "GitHub Release to ServiceNow Change"
  description: "When a GitHub release is published, creates a ServiceNow change request and notifies engineering via Slack."
  tags:
    - devops
    - github
    - servicenow
    - slack
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: release-ops
      port: 8080
      tools:
        - name: process-release
          description: "Given a repo and release tag, create change request and notify engineering."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "Repository."
            - name: release_tag
              in: body
              type: string
              description: "Release tag."
          steps:
            - name: get-release
              type: call
              call: github.get-release
              with:
                repo_name: "{{repo_name}}"
                tag: "{{release_tag}}"
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "Release {{release_tag}} for {{repo_name}}"
                description: "{{get-release.body}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "engineering-releases"
                text: "Release {{release_tag}} for {{repo_name}}. Change: {{create-change.number}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: releases
          path: "/repos/{{repo_name}}/releases/tags/{{tag}}"
          inputParameters:
            - name: repo_name
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              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

Looks up a GitHub repository and returns description and default branch.

naftiko: "0.5"
info:
  label: "GitHub Repository Info"
  description: "Looks up a GitHub repository and returns description and default branch."
  tags:
    - devops
    - github
    - repository
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-repo-info
          description: "Given a repo name, return description and branch."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "Repository in org/repo format."
          call: github.get-repo
          with:
            repo_name: "{{repo_name}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.description"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo_name}}"
          inputParameters:
            - name: repo_name
              in: path
          operations:
            - name: get-repo
              method: GET

Scans GitHub Dependabot alerts for critical vulnerabilities, creates Jira security tickets, and notifies the security team in Teams.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Triage"
  description: "Scans GitHub Dependabot alerts for critical vulnerabilities, creates Jira security tickets, and notifies the security team in Teams."
  tags:
    - security
    - devops
    - github
    - jira
    - microsoft-teams
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-vulnerability-alerts
          description: "Given a GitHub repository, retrieve critical Dependabot alerts, create Jira security tickets, and post a summary to the security Teams channel."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
          steps:
            - name: get-alerts
              type: call
              call: "github.get-dependabot-alerts"
              with:
                repo: "{{repo}}"
                severity: "critical"
            - name: create-security-ticket
              type: call
              call: "jira.create-issue"
              with:
                projectKey: "SEC"
                issuetype: "Security"
                summary: "Critical vulnerability: {{get-alerts.advisory_summary}}"
                description: "Package: {{get-alerts.package_name}}\nCVSS: {{get-alerts.cvss_score}}\nRepo: {{repo}}"
            - name: notify-security
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "security-team"
                message: "Critical vulnerability in {{repo}}: {{get-alerts.advisory_summary}} | Jira: {{create-security-ticket.key}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{repo}}/dependabot/alerts"
          inputParameters:
            - name: repo
              in: path
            - name: severity
              in: query
          operations:
            - name: get-dependabot-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://costco.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Uses Anthropic Claude to summarize procurement contracts and policy documents from SharePoint and posts the key points to the relevant Teams channel.

naftiko: "0.5"
info:
  label: "Intelligent Document Summarization"
  description: "Uses Anthropic Claude to summarize procurement contracts and policy documents from SharePoint and posts the key points to the relevant Teams channel."
  tags:
    - ai
    - automation
    - anthropic
    - sharepoint
    - microsoft-teams
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: ai-docs
      port: 8080
      tools:
        - name: summarize-document
          description: "Given a SharePoint file path and target Teams channel, retrieve the document, send to Claude for summarization, and post the summary to Teams."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID containing the document."
            - name: file_path
              in: body
              type: string
              description: "The relative file path in SharePoint."
            - name: teams_channel_id
              in: body
              type: string
              description: "The Teams channel ID to post the summary to."
          steps:
            - name: get-document
              type: call
              call: "sharepoint.get-file-content"
              with:
                siteId: "{{site_id}}"
                filePath: "{{file_path}}"
            - name: summarize
              type: call
              call: "anthropic.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                content: "Summarize this business document in 3-5 key bullet points: {{get-document.content}}"
            - name: post-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "{{teams_channel_id}}"
                message: "Document summary for {{file_path}}:\n{{summarize.content}}"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{siteId}}/drive/root:{{filePath}}:/content"
          inputParameters:
            - name: siteId
              in: path
            - name: filePath
              in: path
          operations:
            - name: get-file-content
              method: GET
    - type: http
      namespace: anthropic
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a Jira issue by key and returns summary and status.

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves a Jira issue by key and returns summary and status."
  tags:
    - devops
    - jira
    - issue-tracking
capability:
  exposes:
    - type: mcp
      namespace: issue-tracking
      port: 8080
      tools:
        - name: get-issue
          description: "Given a Jira issue key, return summary and status."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key."
          call: jira.get-issue
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://costco.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Retrieves completed Jira sprint data and posts a velocity summary to the engineering team's Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "Retrieves completed Jira sprint data and posts a velocity summary to the engineering team's Teams channel."
  tags:
    - devops
    - engineering
    - jira
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: engineering-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity
          description: "Given a Jira board ID and sprint ID, retrieve completed issues and story points, then post a velocity summary to the engineering Teams channel."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The Jira software board ID."
            - name: sprint_id
              in: body
              type: string
              description: "The Jira sprint ID to report on."
          steps:
            - name: get-sprint-issues
              type: call
              call: "jira.get-sprint-issues"
              with:
                boardId: "{{board_id}}"
                sprintId: "{{sprint_id}}"
            - name: post-velocity
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "engineering-team"
                message: "Sprint {{sprint_id}} complete: {{get-sprint-issues.completedIssues}} issues, {{get-sprint-issues.completedPoints}} story points."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://costco.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: sprint-issues
          path: "/board/{{boardId}}/sprint/{{sprintId}}/issue"
          inputParameters:
            - name: boardId
              in: path
            - name: sprintId
              in: path
          operations:
            - name: get-sprint-issues
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a pod enters CrashLoopBackOff, collects logs via Datadog, creates ServiceNow incident, and pages on-call.

naftiko: "0.5"
info:
  label: "Kubernetes Pod CrashLoop Responder"
  description: "When a pod enters CrashLoopBackOff, collects logs via Datadog, creates ServiceNow incident, and pages on-call."
  tags:
    - infrastructure
    - kubernetes
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: k8s-ops
      port: 8080
      tools:
        - name: handle-crashloop
          description: "Given namespace and pod, collect logs, create incident, and page on-call."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Namespace."
            - name: pod_name
              in: body
              type: string
              description: "Pod name."
            - name: cluster
              in: body
              type: string
              description: "Cluster."
          steps:
            - name: get-logs
              type: call
              call: datadog.search-logs
              with:
                query: "kube_namespace:{{namespace}} pod_name:{{pod_name}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: infrastructure
                urgency: 1
                short_description: "CrashLoop: {{pod_name}} in {{namespace}}/{{cluster}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "{{cluster}}-k8s"
                title: "CrashLoop: {{pod_name}}"
                urgency: high
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: logs
          path: "/logs/events/search"
          operations:
            - name: search-logs
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://costco.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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

When a member complaint is received, creates a Salesforce case, looks up the order in SAP, and notifies member services via Slack.

naftiko: "0.5"
info:
  label: "Member Complaint to Case and Refund"
  description: "When a member complaint is received, creates a Salesforce case, looks up the order in SAP, and notifies member services via Slack."
  tags:
    - customer-service
    - salesforce
    - sap
    - slack
    - refund
capability:
  exposes:
    - type: mcp
      namespace: member-services
      port: 8080
      tools:
        - name: process-member-complaint
          description: "Given member email and order number, create case, look up order, and notify team."
          inputParameters:
            - name: member_email
              in: body
              type: string
              description: "Member email."
            - name: order_number
              in: body
              type: string
              description: "Order number."
            - name: complaint
              in: body
              type: string
              description: "Complaint description."
          steps:
            - name: lookup-order
              type: call
              call: sap.get-sales-order
              with:
                order_number: "{{order_number}}"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Member complaint: Order {{order_number}}"
                description: "{{complaint}}"
                contact_email: "{{member_email}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "member-services"
                text: "New complaint case {{create-case.case_number}} for order {{order_number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-sales-order
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://costco.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: 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

Queries Snowflake for suspicious member transactions, creates a Salesforce case, flags the account in Okta, and notifies loss prevention via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Member Fraud Detection Pipeline"
  description: "Queries Snowflake for suspicious member transactions, creates a Salesforce case, flags the account in Okta, and notifies loss prevention via Microsoft Teams."
  tags:
    - fraud
    - snowflake
    - salesforce
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fraud-detection
      port: 8080
      tools:
        - name: investigate-fraud
          description: "Orchestrate fraud detection and account flagging."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "Member ID."
            - name: alert_type
              in: body
              type: string
              description: "Type of fraud alert."
          steps:
            - name: query-transactions
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT transaction_id, amount, warehouse_id, transaction_date FROM SECURITY.SUSPICIOUS_TRANSACTIONS WHERE member_id = '{{member_id}}' AND alert_type = '{{alert_type}}'"
            - name: create-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Fraud alert: Member {{member_id}} - {{alert_type}}"
                description: "Suspicious transactions: {{query-transactions.row_count}}."
                priority: "High"
            - name: flag-account
              type: call
              call: "okta.update-user"
              with:
                user_id: "{{member_id}}"
                profile_status: "fraud_review"
            - name: notify-lp
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.loss_prevention_channel"
                text: "Fraud alert: Member {{member_id}} ({{alert_type}}). {{query-transactions.row_count}} suspicious transactions. Case: {{create-case.id}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://costco.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: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PUT
    - 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: post-channel-message
              method: POST

Queries Snowflake for members approaching renewal, updates Salesforce contacts, and sends reminders via marketing automation.

naftiko: "0.5"
info:
  label: "Membership Renewal Reminder Orchestrator"
  description: "Queries Snowflake for members approaching renewal, updates Salesforce contacts, and sends reminders via marketing automation."
  tags:
    - membership
    - snowflake
    - salesforce
    - slack
    - marketing
capability:
  exposes:
    - type: mcp
      namespace: membership-ops
      port: 8080
      tools:
        - name: send-renewal-reminders
          description: "Given a renewal window, find expiring memberships and trigger reminders."
          inputParameters:
            - name: days_before_expiry
              in: body
              type: string
              description: "Days before expiry to send reminder."
          steps:
            - name: get-expiring
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT member_id, email, membership_type, expiry_date FROM MEMBERSHIP.MEMBERS WHERE expiry_date = DATEADD(day, {{days_before_expiry}}, CURRENT_DATE()) AND renewal_status = 'PENDING'"
            - name: update-salesforce
              type: call
              call: salesforce.update-contacts
              with:
                members: "{{get-expiring.results}}"
                renewal_reminder_sent: true
            - name: notify-marketing
              type: call
              call: slack.post-message
              with:
                channel: "membership-marketing"
                text: "Renewal reminders sent to {{get-expiring.row_count}} members expiring in {{days_before_expiry}} days."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/composite/sobjects"
          operations:
            - name: update-contacts
              method: PATCH
    - 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

Identifies eligible members in Snowflake, updates membership tier in Salesforce, sends upgrade notification via Slack, and logs in ServiceNow.

naftiko: "0.5"
info:
  label: "Membership Tier Upgrade Pipeline"
  description: "Identifies eligible members in Snowflake, updates membership tier in Salesforce, sends upgrade notification via Slack, and logs in ServiceNow."
  tags:
    - membership
    - snowflake
    - salesforce
    - slack
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: tier-upgrade
      port: 8080
      tools:
        - name: process-upgrade
          description: "Orchestrate membership tier upgrade for eligible members."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "Member ID."
          steps:
            - name: check-eligibility
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT current_tier, annual_spend, eligible_tier FROM MEMBERSHIP.TIER_ELIGIBILITY WHERE member_id = '{{member_id}}'"
            - name: update-tier
              type: call
              call: "salesforce.update-record"
              with:
                object: "Account"
                member_id: "{{member_id}}"
                tier: "{{check-eligibility.results[0].eligible_tier}}"
            - name: log-upgrade
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_membership_changes"
                member_id: "{{member_id}}"
                previous_tier: "{{check-eligibility.results[0].current_tier}}"
                new_tier: "{{check-eligibility.results[0].eligible_tier}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "membership-ops"
                text: "Member {{member_id}} upgraded from {{check-eligibility.results[0].current_tier}} to {{check-eligibility.results[0].eligible_tier}}. Annual spend: {{check-eligibility.results[0].annual_spend}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects/{{object}}"
          inputParameters:
            - name: object
              in: path
          operations:
            - name: update-record
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-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

Lists channels in a Microsoft Teams team.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel List"
  description: "Lists channels in a Microsoft Teams team."
  tags:
    - communication
    - microsoft-teams
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: list-channels
          description: "Given a team ID, return channels."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Team ID."
          call: msteams.list-channels
          with:
            team_id: "{{team_id}}"
          outputParameters:
            - name: channels
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{team_id}}/channels"
          inputParameters:
            - name: team_id
              in: path
          operations:
            - name: list-channels
              method: GET

When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Okta access, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "New Employee Onboarding Orchestrator"
  description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Okta access, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence: open a ServiceNow ticket, provision Okta, and send a Teams welcome."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-snow-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-worker.full_name}}"
                category: "hr_onboarding"
            - name: activate-okta
              type: call
              call: "okta.create-user"
              with:
                login: "{{get-worker.work_email}}"
                firstName: "{{get-worker.first_name}}"
                lastName: "{{get-worker.last_name}}"
            - name: send-welcome
              type: call
              call: "msteams.post-message"
              with:
                recipient: "{{get-worker.work_email}}"
                message: "Welcome to Costco, {{get-worker.first_name}}! Your onboarding ticket: {{create-snow-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: "/costco/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/chats/messages"
          operations:
            - name: post-message
              method: POST

Reads new hire data from Workday, creates Okta account, provisions ServiceNow assets, and sends welcome email via Microsoft Teams.

naftiko: "0.5"
info:
  label: "New Hire IT Provisioning Pipeline"
  description: "Reads new hire data from Workday, creates Okta account, provisions ServiceNow assets, and sends welcome email via Microsoft Teams."
  tags:
    - onboarding
    - workday
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: it-provisioning
      port: 8080
      tools:
        - name: provision-new-hire
          description: "Orchestrate IT provisioning for new employees."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                employee_id: "{{employee_id}}"
            - name: create-okta-user
              type: call
              call: "okta.create-user"
              with:
                firstName: "{{get-employee.first_name}}"
                lastName: "{{get-employee.last_name}}"
                email: "{{get-employee.email}}"
                department: "{{get-employee.department}}"
            - name: provision-assets
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "IT setup for {{get-employee.first_name}} {{get-employee.last_name}}"
                category: "New Hire Provisioning"
                department: "{{get-employee.department}}"
            - name: send-welcome
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.hr_onboarding_channel"
                text: "New hire provisioned: {{get-employee.first_name}} {{get-employee.last_name}} ({{get-employee.department}}). Okta: {{create-okta-user.id}}. IT Request: {{provision-assets.number}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: workers
          path: "/Human_Resources/Worker/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a new vendor is approved, creates SAP vendor master, opens ServiceNow ticket, and notifies procurement via Slack.

naftiko: "0.5"
info:
  label: "New Vendor Onboarding Orchestrator"
  description: "When a new vendor is approved, creates SAP vendor master, opens ServiceNow ticket, and notifies procurement via Slack."
  tags:
    - procurement
    - sap
    - servicenow
    - slack
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: vendor-ops
      port: 8080
      tools:
        - name: onboard-vendor
          description: "Given vendor details, create SAP record, ServiceNow ticket, and notify."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "Vendor name."
            - name: vendor_tax_id
              in: body
              type: string
              description: "Tax ID."
            - name: category
              in: body
              type: string
              description: "Category."
          steps:
            - name: create-vendor
              type: call
              call: sap.create-vendor
              with:
                vendor_name: "{{vendor_name}}"
                tax_id: "{{vendor_tax_id}}"
            - name: open-ticket
              type: call
              call: servicenow.create-request
              with:
                category: vendor_onboarding
                short_description: "Vendor onboarding: {{vendor_name}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "procurement-onboarding"
                text: "Vendor {{vendor_name}} onboarded. SAP: {{create-vendor.vendor_id}}. Ticket: {{open-ticket.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: suppliers
          path: "/A_Supplier"
          operations:
            - name: create-vendor
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves group membership details for a user in Okta by email address.

naftiko: "0.5"
info:
  label: "Okta Group Membership Lookup"
  description: "Retrieves group membership details for a user in Okta by email address."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: okta-groups
      port: 8080
      tools:
        - name: get-user-groups
          description: "Look up Okta group memberships for a user."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "User email address."
          call: "okta.get-user-groups"
          with:
            user_id: "{{user_email}}"
          outputParameters:
            - name: groups
              type: array
              mapping: "$.groups"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
      resources:
        - name: users
          path: "/users/{{user_id}}/groups"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: get-user-groups
              method: GET

When Okta detects suspicious login, creates security incident, suspends sessions, and alerts SOC.

naftiko: "0.5"
info:
  label: "Okta Suspicious Login Handler"
  description: "When Okta detects suspicious login, creates security incident, suspends sessions, and alerts SOC."
  tags:
    - security
    - okta
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: threat-response
      port: 8080
      tools:
        - name: handle-suspicious-login
          description: "Given event ID and user, create incident, suspend sessions, and alert SOC."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "Okta event ID."
            - name: user_login
              in: body
              type: string
              description: "User email."
          steps:
            - name: get-event
              type: call
              call: okta.get-event
              with:
                event_id: "{{event_id}}"
            - name: suspend-sessions
              type: call
              call: okta.clear-sessions
              with:
                user_login: "{{user_login}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: security
                urgency: 1
                short_description: "Suspicious login: {{user_login}} from {{get-event.client_ip}}"
            - name: alert
              type: call
              call: slack.post-message
              with:
                channel: "soc-alerts"
                text: "Suspicious login: {{user_login}} from {{get-event.client_ip}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: events
          path: "/logs?filter=uuid+eq+\"{{event_id}}\""
          inputParameters:
            - name: event_id
              in: query
          operations:
            - name: get-event
              method: GET
        - name: sessions
          path: "/users/{{user_login}}/sessions"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: clear-sessions
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://costco.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

Retrieves Okta users with privileged group assignments for a quarterly access review and uploads the report to SharePoint.

naftiko: "0.5"
info:
  label: "Okta User Access Review"
  description: "Retrieves Okta users with privileged group assignments for a quarterly access review and uploads the report to SharePoint."
  tags:
    - identity
    - security
    - okta
    - sharepoint
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: run-access-review
          description: "Given an Okta group ID and SharePoint site ID, retrieve all active group members and upload the access review report to SharePoint."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Okta group ID to review for privileged access."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "The SharePoint site ID where the report should be uploaded."
          steps:
            - name: get-group-members
              type: call
              call: "okta.get-group-members"
              with:
                groupId: "{{group_id}}"
            - name: upload-report
              type: call
              call: "sharepoint.create-file"
              with:
                siteId: "{{sharepoint_site_id}}"
                fileName: "access-review-{{group_id}}.json"
                content: "{{get-group-members.members}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{groupId}}/users"
          inputParameters:
            - name: groupId
              in: path
          operations:
            - name: get-group-members
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/sites/{{siteId}}/drive/root/children"
          inputParameters:
            - name: siteId
              in: path
          operations:
            - name: create-file
              method: POST

Looks up an Okta user by email and returns profile and status.

naftiko: "0.5"
info:
  label: "Okta User Profile Lookup"
  description: "Looks up an Okta user by email and returns profile and status."
  tags:
    - security
    - okta
    - identity
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-user-profile
          description: "Given an Okta login email, return user profile."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "User login email."
          call: okta.get-user
          with:
            user_login: "{{user_login}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{user_login}}"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: get-user
              method: GET

Retrieves current on-call engineer for a PagerDuty schedule.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Lookup"
  description: "Retrieves current on-call engineer for a PagerDuty schedule."
  tags:
    - operations
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: get-oncall
          description: "Given a schedule ID, return on-call user."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "Schedule ID."
          call: pagerduty.get-oncall
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user_name
              type: string
              mapping: "$.schedule.final_schedule.rendered_schedule_entries[0].user.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: schedules
          path: "/schedules/{{schedule_id}}"
          inputParameters:
            - name: schedule_id
              in: path
          operations:
            - name: get-oncall
              method: GET

Checks Power BI dataset refresh status.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks Power BI dataset refresh status."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-refresh-status
          description: "Given a dataset ID, return refresh status."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Dataset GUID."
          call: power-bi.get-refresh
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes?$top=1"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

Triggers a Power BI dataset refresh for the retail sales dashboard and notifies the analytics team in Teams when complete.

naftiko: "0.5"
info:
  label: "Power BI Retail Sales Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the retail sales dashboard and notifies the analytics team in Teams when complete."
  tags:
    - data
    - analytics
    - power-bi
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: trigger-sales-dashboard-refresh
          description: "Given a Power BI workspace ID and dataset ID, trigger a dataset refresh for the retail sales dashboard and notify the analytics team in Teams."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID to refresh."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspaceId: "{{workspace_id}}"
                datasetId: "{{dataset_id}}"
            - name: notify-analytics
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "analytics-team"
                message: "Power BI retail sales dataset {{dataset_id}} refresh triggered in workspace {{workspace_id}}."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{workspaceId}}/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: workspaceId
              in: path
            - name: datasetId
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Triggers a Power BI dataset refresh for warehouse operational KPI dashboards.

naftiko: "0.5"
info:
  label: "Power BI Warehouse KPI Refresh"
  description: "Triggers a Power BI dataset refresh for warehouse operational KPI dashboards."
  tags:
    - analytics
    - power-bi
    - warehouse-operations
capability:
  exposes:
    - type: mcp
      namespace: warehouse-kpi
      port: 8080
      tools:
        - name: refresh-kpi-dashboard
          description: "Trigger a Power BI refresh for warehouse KPIs."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
          call: "powerbi.refresh-dataset"
          with:
            group_id: "$secrets.powerbi_workspace_id"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: request_id
              type: string
              mapping: "$.requestId"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Creates a product master in SAP, sets up a Salesforce marketing campaign, stores product data in Snowflake, and announces via Slack.

naftiko: "0.5"
info:
  label: "Private Label Product Launch Pipeline"
  description: "Creates a product master in SAP, sets up a Salesforce marketing campaign, stores product data in Snowflake, and announces via Slack."
  tags:
    - product-launch
    - sap
    - salesforce
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: product-launch
      port: 8080
      tools:
        - name: launch-product
          description: "Orchestrate Kirkland Signature product launch setup."
          inputParameters:
            - name: product_name
              in: body
              type: string
              description: "Product name."
            - name: category
              in: body
              type: string
              description: "Product category."
            - name: launch_date
              in: body
              type: string
              description: "Planned launch date."
          steps:
            - name: create-material
              type: call
              call: "sap.create-material-master"
              with:
                description: "{{product_name}}"
                material_group: "{{category}}"
                brand: "Kirkland Signature"
            - name: create-campaign
              type: call
              call: "salesforce.create-campaign"
              with:
                name: "Launch: {{product_name}}"
                start_date: "{{launch_date}}"
                type: "Product Launch"
            - name: store-product-data
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO PRODUCT.LAUNCHES (product_name, category, launch_date, sap_material, sf_campaign) VALUES ('{{product_name}}', '{{category}}', '{{launch_date}}', '{{create-material.material_number}}', '{{create-campaign.id}}')"
            - name: announce-launch
              type: call
              call: "slack.post-message"
              with:
                channel: "merchandising"
                text: "New Kirkland product launch: {{product_name}} ({{category}}). Launch date: {{launch_date}}. SAP: {{create-material.material_number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material"
          operations:
            - name: create-material-master
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: campaigns
          path: "/sobjects/Campaign"
          operations:
            - name: create-campaign
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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

When a recall is initiated, queries SAP for affected warehouses, creates Salesforce case, and broadcasts to warehouse managers via Teams.

naftiko: "0.5"
info:
  label: "Product Recall Notification Orchestrator"
  description: "When a recall is initiated, queries SAP for affected warehouses, creates Salesforce case, and broadcasts to warehouse managers via Teams."
  tags:
    - compliance
    - sap
    - salesforce
    - microsoft-teams
    - product-safety
capability:
  exposes:
    - type: mcp
      namespace: product-safety
      port: 8080
      tools:
        - name: process-recall
          description: "Given material number and recall reason, find affected warehouses and notify."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
            - name: recall_reason
              in: body
              type: string
              description: "Recall reason."
          steps:
            - name: get-affected
              type: call
              call: sap.get-stock-by-plant
              with:
                material_number: "{{material_number}}"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Recall: {{material_number}}"
                description: "{{recall_reason}}. Warehouses: {{get-affected.plant_count}}."
                priority: Critical
            - name: notify
              type: call
              call: msteams.send-channel-message
              with:
                team_id: warehouse-managers
                channel: recalls
                text: "RECALL: {{material_number}}. {{recall_reason}}. {{get-affected.plant_count}} warehouses. Case: {{create-case.case_number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod?$filter=Material eq '{{material_number}}'"
          inputParameters:
            - name: material_number
              in: query
          operations:
            - name: get-stock-by-plant
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://costco.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Snowflake for compliance metrics, creates SharePoint report, and notifies compliance team via Teams.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Audit Report"
  description: "Queries Snowflake for compliance metrics, creates SharePoint report, and notifies compliance team via Teams."
  tags:
    - compliance
    - snowflake
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: generate-report
          description: "Given quarter and year, query metrics and notify."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Quarter."
            - name: fiscal_year
              in: body
              type: string
              description: "Year."
          steps:
            - name: query
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT control_area, pass_count, fail_count FROM COMPLIANCE.QUARTERLY_METRICS WHERE fiscal_quarter = '{{fiscal_quarter}}' AND fiscal_year = '{{fiscal_year}}'"
            - name: create-report
              type: call
              call: sharepoint.create-document
              with:
                name: "Compliance-{{fiscal_quarter}}-{{fiscal_year}}.xlsx"
                data: "{{query.results}}"
            - name: notify
              type: call
              call: msteams.send-channel-message
              with:
                team_id: compliance-team
                channel: general
                text: "Compliance report for {{fiscal_quarter}} {{fiscal_year}}: {{create-report.web_url}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/sites/costco.sharepoint.com/drive/root:/{{name}}:/content"
          inputParameters:
            - name: name
              in: path
          operations:
            - name: create-document
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a high-priority Salesforce member service case is escalated, creates a ServiceNow P2 ticket and notifies the member services team in Teams.

naftiko: "0.5"
info:
  label: "Salesforce Case Escalation to ServiceNow"
  description: "When a high-priority Salesforce member service case is escalated, creates a ServiceNow P2 ticket and notifies the member services team in Teams."
  tags:
    - customer-support
    - crm
    - salesforce
    - servicenow
    - microsoft-teams
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: support-ops
      port: 8080
      tools:
        - name: handle-case-escalation
          description: "Given a Salesforce case ID, retrieve case details and create a linked ServiceNow ticket, then notify the member services team in Teams."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case record ID."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                caseId: "{{case_id}}"
            - name: create-snow-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Escalated case: {{get-case.Subject}}"
                description: "Salesforce Case: {{case_id}}\nMember: {{get-case.AccountName}}\nDetails: {{get-case.Description}}"
                urgency: "2"
            - name: notify-support-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "member-services"
                message: "Case escalated: {{get-case.Subject}} | Member: {{get-case.AccountName}} | ServiceNow: {{create-snow-ticket.number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{caseId}}"
          inputParameters:
            - name: caseId
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves Costco Wholesale member account details from Salesforce given a member number, returning membership tier, status, and open cases.

naftiko: "0.5"
info:
  label: "Salesforce Member Account Lookup"
  description: "Retrieves Costco Wholesale member account details from Salesforce given a member number, returning membership tier, status, and open cases."
  tags:
    - crm
    - member-management
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: member-ops
      port: 8080
      tools:
        - name: get-member-account
          description: "Given a Costco member number, retrieve the member account details including membership tier, status, and open service cases from Salesforce."
          inputParameters:
            - name: member_number
              in: body
              type: string
              description: "The Costco member number."
          call: "salesforce.get-account"
          with:
            memberNumber: "{{member_number}}"
          outputParameters:
            - name: account_id
              type: string
              mapping: "$.records[0].Id"
            - name: member_name
              type: string
              mapping: "$.records[0].Name"
            - name: membership_tier
              type: string
              mapping: "$.records[0].MembershipTier__c"
            - name: status
              type: string
              mapping: "$.records[0].Status__c"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/query"
          inputParameters:
            - name: memberNumber
              in: query
          operations:
            - name: get-account
              method: GET

When a Salesforce B2B opportunity is marked Closed Won, creates a matching SAP S/4HANA sales order and notifies the account team in Teams.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to SAP Sales Order Sync"
  description: "When a Salesforce B2B opportunity is marked Closed Won, creates a matching SAP S/4HANA sales order and notifies the account team in Teams."
  tags:
    - crm
    - sales
    - salesforce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crm-opportunity
      port: 8080
      tools:
        - name: sync-closed-opportunity
          description: "Given a Salesforce opportunity ID that closed Won, create an SAP S/4HANA sales order and notify the account team in Teams."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity record ID."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sales-order
              type: call
              call: "sap-sd.create-sales-order"
              with:
                customerName: "{{get-opportunity.AccountName}}"
                amount: "{{get-opportunity.Amount}}"
                currency: "{{get-opportunity.CurrencyIsoCode}}"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "sales-team"
                message: "Opportunity {{get-opportunity.Name}} Closed Won. SAP Sales Order {{create-sales-order.salesOrderId}} created."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap-sd
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder"
          operations:
            - name: create-sales-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves vendor account details and contract status from Salesforce.

naftiko: "0.5"
info:
  label: "Salesforce Vendor Account Lookup"
  description: "Retrieves vendor account details and contract status from Salesforce."
  tags:
    - vendor-management
    - salesforce
    - procurement
capability:
  exposes:
    - type: mcp
      namespace: vendor-account
      port: 8080
      tools:
        - name: get-vendor-account
          description: "Look up vendor account details in Salesforce."
          inputParameters:
            - name: vendor_name
              in: body
              type: string
              description: "Vendor name."
          call: "salesforce.query-account"
          with:
            query: "SELECT Id, Name, Type, Contract_Status__c, Annual_Revenue__c FROM Account WHERE Name = '{{vendor_name}}' AND Type = 'Vendor'"
          outputParameters:
            - name: account
              type: object
              mapping: "$.records[0]"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: queries
          path: "/query"
          operations:
            - name: query-account
              method: GET

Checks contract compliance in SAP Ariba, compares spend in Snowflake, creates a Jira compliance ticket, and notifies procurement via Slack.

naftiko: "0.5"
info:
  label: "SAP Ariba Contract Compliance Pipeline"
  description: "Checks contract compliance in SAP Ariba, compares spend in Snowflake, creates a Jira compliance ticket, and notifies procurement via Slack."
  tags:
    - compliance
    - sap-ariba
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: contract-compliance
      port: 8080
      tools:
        - name: check-compliance
          description: "Audit vendor contract compliance against actual spend."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: contract_id
              in: body
              type: string
              description: "Contract ID."
          steps:
            - name: get-contract
              type: call
              call: "ariba.get-contract"
              with:
                contract_id: "{{contract_id}}"
            - name: get-spend
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT SUM(amount) as total_spend, COUNT(*) as po_count FROM PROCUREMENT.VENDOR_SPEND WHERE vendor_id = '{{vendor_id}}' AND contract_id = '{{contract_id}}'"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "PROC"
                summary: "Contract compliance: {{vendor_id}} - {{contract_id}}"
                description: "Contract value: {{get-contract.total_value}}. Actual spend: {{get-spend.results[0].total_spend}}. PO count: {{get-spend.results[0].po_count}}."
                issuetype: "Task"
            - name: notify-procurement
              type: call
              call: "slack.post-message"
              with:
                channel: "procurement-compliance"
                text: "Contract compliance review: Vendor {{vendor_id}}. Spend: {{get-spend.results[0].total_spend}} vs contract: {{get-contract.total_value}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/contract-compliance/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: contracts
          path: "/contracts/{{contract_id}}"
          inputParameters:
            - name: contract_id
              in: path
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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

Registers a new supplier in SAP Ariba, creates the vendor master in SAP S/4HANA, and notifies the procurement team in Teams.

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding"
  description: "Registers a new supplier in SAP Ariba, creates the vendor master in SAP S/4HANA, and notifies the procurement team in Teams."
  tags:
    - procurement
    - supplier-management
    - sap-ariba
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-onboarding
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given supplier name, email, and country, register in SAP Ariba, create the SAP vendor master, and notify the procurement team in Teams."
          inputParameters:
            - name: supplier_name
              in: body
              type: string
              description: "Legal name of the supplier."
            - name: supplier_email
              in: body
              type: string
              description: "Primary contact email for the supplier."
            - name: country_code
              in: body
              type: string
              description: "ISO 2-letter country code."
          steps:
            - name: register-ariba
              type: call
              call: "ariba.create-supplier"
              with:
                name: "{{supplier_name}}"
                email: "{{supplier_email}}"
                country: "{{country_code}}"
            - name: create-vendor-master
              type: call
              call: "sap-erp.create-vendor"
              with:
                companyName: "{{supplier_name}}"
                aribaId: "{{register-ariba.supplierId}}"
                country: "{{country_code}}"
            - name: notify-procurement
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "procurement-team"
                message: "New supplier onboarded: {{supplier_name}} | Ariba ID: {{register-ariba.supplierId}} | SAP Vendor: {{create-vendor-master.vendorId}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: sap-erp
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/A_BusinessPartner"
          operations:
            - name: create-vendor
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

When an expense report is submitted in SAP Concur, retrieves the details and routes the approval request to the manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Approval"
  description: "When an expense report is submitted in SAP Concur, retrieves the details and routes the approval request to the manager via Microsoft Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-approval
      port: 8080
      tools:
        - name: approve-expense-report
          description: "Given an SAP Concur expense report ID and manager email, retrieve report details and send an approval request to the manager in Teams."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: manager_email
              in: body
              type: string
              description: "The Microsoft Teams UPN of the approving manager."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                reportId: "{{report_id}}"
            - name: send-approval
              type: call
              call: "msteams.post-message"
              with:
                recipient: "{{manager_email}}"
                message: "Expense approval needed: Report {{report_id}} for {{get-report.Total}} {{get-report.CurrencyCode}} by {{get-report.OwnerName}}."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{reportId}}"
          inputParameters:
            - name: reportId
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/chats/messages"
          operations:
            - name: post-message
              method: POST

Detects travel policy violations in SAP Concur, creates a Workday notification, logs in Jira, and alerts the manager via Slack.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Policy Violation Pipeline"
  description: "Detects travel policy violations in SAP Concur, creates a Workday notification, logs in Jira, and alerts the manager via Slack."
  tags:
    - travel
    - sap-concur
    - workday
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: travel-violations
      port: 8080
      tools:
        - name: handle-violation
          description: "Process travel policy violations."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "Concur expense report ID."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                employee_id: "{{get-report.employee_id}}"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "TRAVEL"
                summary: "Policy violation: Report {{report_id}}"
                description: "Employee: {{get-employee.name}}. Amount: {{get-report.total}}. Violation: {{get-report.violation_type}}."
                issuetype: "Task"
            - name: notify-manager
              type: call
              call: "slack.post-message"
              with:
                channel: "{{get-employee.manager_slack}}"
                text: "Travel policy violation by {{get-employee.name}}: {{get-report.violation_type}}. Amount: {{get-report.total}}. Jira: {{create-ticket.key}}."
  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-expense-report
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: workers
          path: "/Human_Resources/Worker/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://costco.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

When a SAP delivery is delayed, creates ServiceNow incident and notifies logistics via Slack.

naftiko: "0.5"
info:
  label: "SAP Delivery Delay Escalation"
  description: "When a SAP delivery is delayed, creates ServiceNow incident and notifies logistics via Slack."
  tags:
    - logistics
    - sap
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: escalate-delay
          description: "Given a delivery number, check delay, create incident, and alert."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "SAP delivery number."
          steps:
            - name: get-delivery
              type: call
              call: sap.get-delivery
              with:
                delivery_number: "{{delivery_number}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: logistics
                urgency: 2
                short_description: "Delivery delay: {{delivery_number}} — {{get-delivery.delay_days}} days"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "logistics-ops"
                text: "Delivery {{delivery_number}} delayed {{get-delivery.delay_days}} days. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://costco.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

At month end, retrieves the SAP S/4HANA period close status for all company codes and posts the consolidated checklist to the finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Finance Period Close Status Check"
  description: "At month end, retrieves the SAP S/4HANA period close status for all company codes and posts the consolidated checklist to the finance Teams channel."
  tags:
    - finance
    - erp
    - sap
    - microsoft-teams
    - period-close
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: check-period-close-status
          description: "Given a fiscal year and period, retrieve the SAP period close status for all Costco company codes and post the status to the finance Teams channel."
          inputParameters:
            - name: fiscal_year
              in: body
              type: string
              description: "The fiscal year, e.g. 2025."
            - name: fiscal_period
              in: body
              type: string
              description: "The fiscal period number, e.g. 03 for March."
          steps:
            - name: get-close-status
              type: call
              call: "sap-finance.get-period-status"
              with:
                fiscalYear: "{{fiscal_year}}"
                fiscalPeriod: "{{fiscal_period}}"
            - name: post-status
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "finance-team"
                message: "Period close FY{{fiscal_year}} P{{fiscal_period}}: Open items={{get-close-status.openItems}}, Blocked postings={{get-close-status.blockedPostings}}"
  consumes:
    - type: http
      namespace: sap-finance
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_FIGL_PERIOD_LOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: period-status
          path: "/A_AccountingPeriodLock"
          inputParameters:
            - name: fiscalYear
              in: query
            - name: fiscalPeriod
              in: query
          operations:
            - name: get-period-status
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries SAP for period-close status, aggregates in Snowflake, and posts readiness to finance Teams channel.

naftiko: "0.5"
info:
  label: "SAP Financial Close Readiness"
  description: "Queries SAP for period-close status, aggregates in Snowflake, and posts readiness to finance Teams channel."
  tags:
    - finance
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: check-close-readiness
          description: "Given fiscal period, query close tasks and post readiness."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period."
            - name: company_code
              in: body
              type: string
              description: "Company code."
          steps:
            - name: get-tasks
              type: call
              call: sap.get-close-tasks
              with:
                fiscal_period: "{{fiscal_period}}"
                company_code: "{{company_code}}"
            - name: aggregate
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT task_category, COUNT(*) as total, SUM(CASE WHEN status='COMPLETE' THEN 1 ELSE 0 END) as done FROM FINANCE.CLOSE_TASKS WHERE fiscal_period = '{{fiscal_period}}' GROUP BY task_category"
            - name: post
              type: call
              call: msteams.send-channel-message
              with:
                team_id: finance-team
                channel: period-close
                text: "Close readiness for {{fiscal_period}}: {{aggregate.results}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_FINANCIALPERIODCLOSE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: close-tasks
          path: "/A_FinPeriodCloseTask"
          operations:
            - name: get-close-tasks
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Compares SAP goods receipt with purchase order quantities, creates a Jira issue for variances, and notifies the receiving team via Slack.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Discrepancy Pipeline"
  description: "Compares SAP goods receipt with purchase order quantities, creates a Jira issue for variances, and notifies the receiving team via Slack."
  tags:
    - receiving
    - sap
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: goods-receipt-discrepancy
      port: 8080
      tools:
        - name: check-receipt
          description: "Validate goods receipt against purchase order."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number."
            - name: warehouse_id
              in: body
              type: string
              description: "Receiving warehouse."
          steps:
            - name: get-po-details
              type: call
              call: "sap.get-purchase-order"
              with:
                po_number: "{{po_number}}"
            - name: get-receipt
              type: call
              call: "sap.get-goods-receipt"
              with:
                po_number: "{{po_number}}"
            - name: create-issue
              type: call
              call: "jira.create-issue"
              with:
                project: "WHSE"
                summary: "Goods receipt discrepancy: PO {{po_number}}"
                description: "PO items: {{get-po-details.item_count}}. Received items: {{get-receipt.item_count}}."
                issuetype: "Bug"
            - name: notify-receiving
              type: call
              call: "slack.post-message"
              with:
                channel: "warehouse-{{warehouse_id}}-receiving"
                text: "Receipt discrepancy for PO {{po_number}}. Jira: {{create-issue.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.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-purchase-order
              method: GET
        - name: goods-receipts
          path: "/A_PurchaseOrder('{{po_number}}')/to_GoodsReceipt"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-goods-receipt
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://costco.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

When a goods receipt is posted in SAP, updates Snowflake inventory and notifies the warehouse Slack channel.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt to Inventory Update"
  description: "When a goods receipt is posted in SAP, updates Snowflake inventory and notifies the warehouse Slack channel."
  tags:
    - supply-chain
    - sap
    - snowflake
    - slack
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: process-goods-receipt
          description: "Given a SAP goods receipt number, update Snowflake and notify warehouse."
          inputParameters:
            - name: gr_document
              in: body
              type: string
              description: "SAP goods receipt number."
            - name: warehouse_id
              in: body
              type: string
              description: "Warehouse ID."
          steps:
            - name: get-receipt
              type: call
              call: sap.get-goods-receipt
              with:
                gr_document: "{{gr_document}}"
            - name: update-inventory
              type: call
              call: snowflake.execute-statement
              with:
                statement: "UPDATE SUPPLY_CHAIN.INVENTORY SET on_hand_qty = on_hand_qty + {{get-receipt.quantity}} WHERE sku = '{{get-receipt.material}}' AND warehouse_id = '{{warehouse_id}}'"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "warehouse-{{warehouse_id}}"
                text: "Goods receipt {{gr_document}}: {{get-receipt.quantity}} units of {{get-receipt.material}} at warehouse {{warehouse_id}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: material-documents
          path: "/A_MaterialDocumentHeader('{{gr_document}}')"
          inputParameters:
            - name: gr_document
              in: path
          operations:
            - name: get-goods-receipt
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves current inventory stock levels from SAP S/4HANA for a given product and warehouse, for use in replenishment planning and buyer reporting.

naftiko: "0.5"
info:
  label: "SAP Inventory Stock Overview"
  description: "Retrieves current inventory stock levels from SAP S/4HANA for a given product and warehouse, for use in replenishment planning and buyer reporting."
  tags:
    - supply-chain
    - inventory
    - sap
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: inventory-ops
      port: 8080
      tools:
        - name: get-stock-overview
          description: "Given a SAP material number and plant code, retrieve on-hand stock quantity, unit of measure, and warehouse location. Use for replenishment planning and buyer review."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number for the product."
            - name: plant_code
              in: body
              type: string
              description: "The SAP plant (warehouse/location) code."
          call: "sap-inventory.get-stock"
          with:
            materialNumber: "{{material_number}}"
            plantCode: "{{plant_code}}"
          outputParameters:
            - name: unrestricted_stock
              type: number
              mapping: "$.d.MatlStkInAcctMod.UnrestrictedWarehousingQuantity"
            - name: unit_of_measure
              type: string
              mapping: "$.d.MatlStkInAcctMod.BaseUnit"
            - name: storage_location
              type: string
              mapping: "$.d.MatlStkInAcctMod.StorageLocation"
  consumes:
    - type: http
      namespace: sap-inventory
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod(Material='{{materialNumber}}',Plant='{{plantCode}}')"
          inputParameters:
            - name: materialNumber
              in: path
            - name: plantCode
              in: path
          operations:
            - name: get-stock
              method: GET

Retrieves material master data from SAP for a given material number including description, category, and stock levels.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP for a given material number including description, category, and stock levels."
  tags:
    - inventory
    - sap
    - material-management
capability:
  exposes:
    - type: mcp
      namespace: material-master
      port: 8080
      tools:
        - name: get-material
          description: "Look up material master record by material number."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
          call: "sap.get-material"
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: category
              type: string
              mapping: "$.d.MaterialGroup"
            - name: stock_quantity
              type: number
              mapping: "$.d.UnrestrictedStock"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Material('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Looks up an SAP S/4HANA purchase order by number and returns structured header status, vendor name, and total value for procurement review.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up an SAP S/4HANA purchase order by number and returns structured header status, vendor name, and total value for procurement review."
  tags:
    - procurement
    - finance
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a PO number, retrieve the SAP purchase order status, vendor name, total value, and line items. Use for procurement approvals and spend visibility."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number, e.g. 4500012345."
          call: "sap-erp.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: currency
              type: string
              mapping: "$.d.TransactionCurrency"
  consumes:
    - type: http
      namespace: sap-erp
      baseUri: "https://costco-s4.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

Retrieves pricing rules from Snowflake, updates SAP pricing conditions, refreshes Power BI pricing dashboard, and notifies merchandising via Slack.

naftiko: "0.5"
info:
  label: "Seasonal Pricing Update Pipeline"
  description: "Retrieves pricing rules from Snowflake, updates SAP pricing conditions, refreshes Power BI pricing dashboard, and notifies merchandising via Slack."
  tags:
    - pricing
    - snowflake
    - sap
    - power-bi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: seasonal-pricing
      port: 8080
      tools:
        - name: update-pricing
          description: "Orchestrate seasonal pricing updates across systems."
          inputParameters:
            - name: season
              in: body
              type: string
              description: "Season identifier."
            - name: category
              in: body
              type: string
              description: "Product category."
          steps:
            - name: get-pricing-rules
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT sku, current_price, new_price, discount_pct FROM PRICING.SEASONAL_RULES WHERE season = '{{season}}' AND category = '{{category}}'"
            - name: update-sap
              type: call
              call: "sap.update-pricing-conditions"
              with:
                season: "{{season}}"
                items: "{{get-pricing-rules.results}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "$secrets.powerbi_workspace_id"
                dataset_id: "$secrets.pricing_dataset_id"
            - name: notify-merchandising
              type: call
              call: "slack.post-message"
              with:
                channel: "merchandising"
                text: "Seasonal pricing updated: {{season}} / {{category}}. {{get-pricing-rules.row_count}} SKUs updated. Dashboard refreshing."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/SD_PRICING_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: pricing
          path: "/A_PricingCondition"
          operations:
            - name: update-pricing-conditions
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              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

Queries Snowflake for seasonal demand, creates Workday requisitions, and notifies HR via Teams.

naftiko: "0.5"
info:
  label: "Seasonal Workforce Planning"
  description: "Queries Snowflake for seasonal demand, creates Workday requisitions, and notifies HR via Teams."
  tags:
    - hr
    - workforce-planning
    - snowflake
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workforce-planning
      port: 8080
      tools:
        - name: plan-seasonal-hiring
          description: "Given region and season, query demand and create requisitions."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Region."
            - name: season
              in: body
              type: string
              description: "Season."
          steps:
            - name: get-forecast
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT warehouse_id, AVG(peak_headcount) as avg_peak FROM HR.SEASONAL_DEMAND WHERE region = '{{region}}' AND season = '{{season}}' GROUP BY warehouse_id"
            - name: create-requisitions
              type: call
              call: workday.create-requisition
              with:
                region: "{{region}}"
                job_profile: "Seasonal Warehouse Worker"
                positions: "{{get-forecast.total_positions}}"
            - name: notify
              type: call
              call: msteams.send-channel-message
              with:
                team_id: regional-hr
                channel: "{{region}}"
                text: "Seasonal hiring for {{region}} ({{season}}): {{get-forecast.total_positions}} positions."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/costco/jobRequisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a GitHub security advisory is detected, creates a Jira ticket and alerts security Slack channel.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Tracker"
  description: "When a GitHub security advisory is detected, creates a Jira ticket and alerts security Slack channel."
  tags:
    - security
    - github
    - jira
    - slack
    - vulnerability
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: track-vulnerability
          description: "Given a repo and advisory ID, create ticket and alert security."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository."
            - name: advisory_id
              in: body
              type: string
              description: "Advisory ID."
          steps:
            - name: get-advisory
              type: call
              call: github.get-advisory
              with:
                repo_name: "{{repo_name}}"
                advisory_id: "{{advisory_id}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: SEC
                issue_type: Bug
                summary: "{{get-advisory.severity}}: {{get-advisory.summary}} in {{repo_name}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "security-alerts"
                text: "{{get-advisory.severity}} in {{repo_name}}: {{get-advisory.summary}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: advisories
          path: "/repos/{{repo_name}}/security-advisories/{{advisory_id}}"
          inputParameters:
            - name: repo_name
              in: path
            - name: advisory_id
              in: path
          operations:
            - name: get-advisory
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://costco.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

Retrieves IT asset details from the ServiceNow CMDB for a specified warehouse location.

naftiko: "0.5"
info:
  label: "ServiceNow Asset Inventory Lookup"
  description: "Retrieves IT asset details from the ServiceNow CMDB for a specified warehouse location."
  tags:
    - it-assets
    - servicenow
    - cmdb
capability:
  exposes:
    - type: mcp
      namespace: asset-inventory
      port: 8080
      tools:
        - name: get-assets
          description: "Look up IT assets by warehouse location."
          inputParameters:
            - name: location
              in: body
              type: string
              description: "Warehouse location name."
          call: "servicenow.get-assets"
          with:
            location: "{{location}}"
          outputParameters:
            - name: assets
              type: array
              mapping: "$.result"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/alm_hardware"
          operations:
            - name: get-assets
              method: GET

Creates a ServiceNow standard change request for planned system maintenance, associates affected CIs, and notifies stakeholders in Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request for System Maintenance"
  description: "Creates a ServiceNow standard change request for planned system maintenance, associates affected CIs, and notifies stakeholders in Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: open-change-request
          description: "Given a change description, affected CIs, and planned window, create a ServiceNow change request and notify IT operations in Teams."
          inputParameters:
            - name: change_description
              in: body
              type: string
              description: "Description of the planned change."
            - name: affected_ci
              in: body
              type: string
              description: "Comma-separated list of affected configuration items."
            - name: planned_start
              in: body
              type: string
              description: "Planned change start in ISO 8601 format."
            - name: planned_end
              in: body
              type: string
              description: "Planned change end in ISO 8601 format."
          steps:
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "{{change_description}}"
                type: "standard"
                start_date: "{{planned_start}}"
                end_date: "{{planned_end}}"
                cmdb_ci: "{{affected_ci}}"
            - name: notify-it-ops
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "it-operations"
                message: "Change {{create-change.number}} scheduled: {{change_description}} | Window: {{planned_start}} to {{planned_end}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves a ServiceNow incident by number and returns status and priority.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number and returns status and priority."
  tags:
    - itsm
    - servicenow
    - incident
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Given a ServiceNow incident number, return status and priority."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "Incident number."
          call: servicenow.get-incident
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result[0].state"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

When an incident approaches SLA breach, pages on-call and notifies ops Slack.

naftiko: "0.5"
info:
  label: "ServiceNow SLA Breach Escalation"
  description: "When an incident approaches SLA breach, pages on-call and notifies ops Slack."
  tags:
    - itsm
    - servicenow
    - pagerduty
    - slack
    - sla
capability:
  exposes:
    - type: mcp
      namespace: sla-mgmt
      port: 8080
      tools:
        - name: escalate-sla
          description: "Given incident number, page on-call and notify ops."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "Incident number."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident
              with:
                incident_number: "{{incident_number}}"
            - name: page
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "{{get-incident.assignment_group}}"
                title: "SLA breach risk: {{incident_number}}"
                urgency: high
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "ops-escalations"
                text: "SLA breach imminent: {{incident_number}}. On-call paged."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          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

Searches SharePoint for documents matching keywords.

naftiko: "0.5"
info:
  label: "SharePoint Document Search"
  description: "Searches SharePoint for documents matching keywords."
  tags:
    - knowledge
    - sharepoint
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: documents
      port: 8080
      tools:
        - name: search-documents
          description: "Given keywords, return matching documents."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "Search keywords."
          call: sharepoint.search-docs
          with:
            search_query: "{{search_query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.value"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/sites/costco.sharepoint.com/drive/root/search(q='{{search_query}}')"
          inputParameters:
            - name: search_query
              in: query
          operations:
            - name: search-docs
              method: GET

Retrieves recent messages from a Slack channel.

naftiko: "0.5"
info:
  label: "Slack Channel History Lookup"
  description: "Retrieves recent messages from a Slack channel."
  tags:
    - communication
    - slack
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: messaging
      port: 8080
      tools:
        - name: get-channel-history
          description: "Given a Slack channel ID, return recent messages."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "Slack channel ID."
          call: slack.get-history
          with:
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: messages
              type: array
              mapping: "$.messages"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: conversations
          path: "/conversations.history?channel={{channel_id}}&limit=20"
          inputParameters:
            - name: channel_id
              in: query
          operations:
            - name: get-history
              method: GET

When Snowflake DQ checks fail, creates a Jira ticket and posts to data-ops Slack.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Alert to Jira"
  description: "When Snowflake DQ checks fail, creates a Jira ticket and posts to data-ops Slack."
  tags:
    - data-engineering
    - snowflake
    - jira
    - slack
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: handle-dq-failure
          description: "Given a table and check type, create ticket and notify."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Table name."
            - name: check_type
              in: body
              type: string
              description: "Check type."
          steps:
            - name: get-failures
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT check_name, actual_value FROM DATA_OPS.DQ_RESULTS WHERE table_name = '{{table_name}}' AND check_type = '{{check_type}}' AND status = 'FAIL' LIMIT 5"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: DATA
                issue_type: Bug
                summary: "DQ failure: {{check_type}} on {{table_name}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "data-ops-alerts"
                text: "DQ {{check_type}} failed on {{table_name}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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

Runs data quality checks in Snowflake, creates a Jira bug for failures, posts alerts to Slack, and logs the issue in ServiceNow.

naftiko: "0.5"
info:
  label: "Snowflake ETL Data Quality Pipeline"
  description: "Runs data quality checks in Snowflake, creates a Jira bug for failures, posts alerts to Slack, and logs the issue in ServiceNow."
  tags:
    - data-quality
    - snowflake
    - jira
    - slack
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: etl-data-quality
      port: 8080
      tools:
        - name: check-data-quality
          description: "Run data quality validation and alert on failures."
          inputParameters:
            - name: pipeline_name
              in: body
              type: string
              description: "ETL pipeline name."
            - name: run_id
              in: body
              type: string
              description: "Pipeline run ID."
          steps:
            - name: run-checks
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT check_name, status, row_count, failure_count FROM DATA_QUALITY.VALIDATION_RESULTS WHERE pipeline_name = '{{pipeline_name}}' AND run_id = '{{run_id}}' AND status = 'FAILED'"
            - name: create-bug
              type: call
              call: "jira.create-issue"
              with:
                project: "DATA"
                summary: "DQ failure: {{pipeline_name}} run {{run_id}}"
                description: "Failed checks: {{run-checks.row_count}}. Details: {{run-checks.results}}."
                issuetype: "Bug"
            - name: alert-team
              type: call
              call: "slack.post-message"
              with:
                channel: "data-engineering"
                text: "Data quality failure: {{pipeline_name}} run {{run_id}}. {{run-checks.row_count}} checks failed. Jira: {{create-bug.key}}."
            - name: log-incident
              type: call
              call: "servicenow.create-record"
              with:
                table: "incident"
                short_description: "ETL data quality failure: {{pipeline_name}}"
                description: "Run: {{run_id}}. Failed checks: {{run-checks.row_count}}. Jira: {{create-bug.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

When a Snowflake task fails, creates Jira ticket and alerts data-ops Slack.

naftiko: "0.5"
info:
  label: "Snowflake ETL Pipeline Failure Handler"
  description: "When a Snowflake task fails, creates Jira ticket and alerts data-ops Slack."
  tags:
    - data-engineering
    - snowflake
    - jira
    - slack
    - etl
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: handle-etl-failure
          description: "Given a task name, query failure details, create ticket, and notify."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "Snowflake task."
          steps:
            - name: get-error
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT error_code, error_message FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(TASK_NAME=>'{{task_name}}', RESULT_LIMIT=>1)) WHERE state = 'FAILED'"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: DATA
                issue_type: Bug
                summary: "ETL failure: {{task_name}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "data-ops-alerts"
                text: "ETL {{task_name}} failed. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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

Queries Snowflake for a member's recent purchase history including items, amounts, and warehouse locations.

naftiko: "0.5"
info:
  label: "Snowflake Member Purchase History"
  description: "Queries Snowflake for a member's recent purchase history including items, amounts, and warehouse locations."
  tags:
    - analytics
    - snowflake
    - membership
capability:
  exposes:
    - type: mcp
      namespace: member-purchases
      port: 8080
      tools:
        - name: get-purchase-history
          description: "Retrieve member purchase history from Snowflake."
          inputParameters:
            - name: member_id
              in: body
              type: string
              description: "Costco member ID."
            - name: days_back
              in: body
              type: number
              description: "Number of days to look back."
          call: "snowflake.execute-statement"
          with:
            statement: "SELECT transaction_date, item_description, quantity, amount, warehouse_name FROM RETAIL.MEMBER_TRANSACTIONS WHERE member_id = '{{member_id}}' AND transaction_date >= DATEADD(day, -{{days_back}}, CURRENT_DATE()) ORDER BY transaction_date DESC"
          outputParameters:
            - name: transactions
              type: array
              mapping: "$.data"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Validates freshness and completeness of Costco retail sales data in Snowflake and creates ServiceNow incidents for datasets that fail quality thresholds.

naftiko: "0.5"
info:
  label: "Snowflake Retail Analytics Data Quality Monitor"
  description: "Validates freshness and completeness of Costco retail sales data in Snowflake and creates ServiceNow incidents for datasets that fail quality thresholds."
  tags:
    - data
    - analytics
    - snowflake
    - servicenow
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: check-sales-data-quality
          description: "Given a Snowflake retail sales table and freshness threshold, validate data completeness and recency, and open a ServiceNow incident if checks fail."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name in DATABASE.SCHEMA.TABLE format."
            - name: freshness_hours
              in: body
              type: integer
              description: "Maximum acceptable data age in hours."
          steps:
            - name: get-table-metadata
              type: call
              call: "snowflake.get-table-info"
              with:
                tableName: "{{table_name}}"
            - name: create-dq-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Retail data quality failure: {{table_name}}"
                category: "data_pipeline"
                description: "Table {{table_name}} failed freshness check. Last updated: {{get-table-metadata.last_altered}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: tables
          path: "/databases/tables"
          inputParameters:
            - name: tableName
              in: query
          operations:
            - name: get-table-info
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Queries Snowflake for warehouse inventory levels by SKU.

naftiko: "0.5"
info:
  label: "Snowflake Warehouse Inventory Query"
  description: "Queries Snowflake for warehouse inventory levels by SKU."
  tags:
    - supply-chain
    - snowflake
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: inventory
      port: 8080
      tools:
        - name: query-warehouse-inventory
          description: "Given a SKU and warehouse ID, return on-hand quantity and days of supply."
          inputParameters:
            - name: sku
              in: body
              type: string
              description: "Product SKU."
            - name: warehouse_id
              in: body
              type: string
              description: "Warehouse ID."
          call: snowflake.execute-query
          with:
            statement: "SELECT sku, on_hand_qty, days_of_supply FROM SUPPLY_CHAIN.INVENTORY WHERE sku = '{{sku}}' AND warehouse_id = '{{warehouse_id}}'"
          outputParameters:
            - name: on_hand_qty
              type: integer
              mapping: "$.data[0][1]"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

When a warehouse reports IT outage, creates P1 ServiceNow incident, pages on-call, and notifies ops Slack.

naftiko: "0.5"
info:
  label: "Store IT Outage Response"
  description: "When a warehouse reports IT outage, creates P1 ServiceNow incident, pages on-call, and notifies ops Slack."
  tags:
    - operations
    - servicenow
    - pagerduty
    - slack
    - retail
capability:
  exposes:
    - type: mcp
      namespace: store-ops
      port: 8080
      tools:
        - name: handle-outage
          description: "Given warehouse number and system, create incident and page on-call."
          inputParameters:
            - name: warehouse_number
              in: body
              type: string
              description: "Warehouse number."
            - name: affected_system
              in: body
              type: string
              description: "Affected system."
            - name: impact
              in: body
              type: string
              description: "Impact."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: store_systems
                urgency: 1
                short_description: "[P1] Warehouse {{warehouse_number}} — {{affected_system}} outage"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: warehouse-systems
                title: "Warehouse {{warehouse_number}} {{affected_system}} outage"
                urgency: high
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "warehouse-ops-critical"
                text: "P1 at Warehouse {{warehouse_number}}: {{affected_system}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          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

Checks ServiceNow IT readiness, validates SAP inventory setup, verifies Okta access provisioning, and sends readiness report via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Store Opening Readiness Pipeline"
  description: "Checks ServiceNow IT readiness, validates SAP inventory setup, verifies Okta access provisioning, and sends readiness report via Microsoft Teams."
  tags:
    - store-operations
    - servicenow
    - sap
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: store-readiness
      port: 8080
      tools:
        - name: check-readiness
          description: "Orchestrate new store opening readiness checks."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "New store identifier."
            - name: opening_date
              in: body
              type: string
              description: "Planned opening date."
          steps:
            - name: check-it-readiness
              type: call
              call: "servicenow.get-checklist"
              with:
                store_id: "{{store_id}}"
                category: "IT_Readiness"
            - name: check-inventory
              type: call
              call: "sap.get-inventory-status"
              with:
                plant: "{{store_id}}"
            - name: check-access
              type: call
              call: "okta.get-group-members"
              with:
                group_name: "store-{{store_id}}-staff"
            - name: send-report
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.store_ops_channel"
                text: "Store {{store_id}} readiness: IT: {{check-it-readiness.complete_pct}}%. Inventory: {{check-inventory.status}}. Staff provisioned: {{check-access.member_count}}. Opening: {{opening_date}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: checklists
          path: "/table/sc_task"
          operations:
            - name: get-checklist
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/MM_INV_MGMT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inventory
          path: "/A_PlantInventory"
          operations:
            - name: get-inventory-status
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
      resources:
        - name: groups
          path: "/groups/{{group_name}}/users"
          inputParameters:
            - name: group_name
              in: path
          operations:
            - name: get-group-members
              method: GET
    - 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: post-channel-message
              method: POST

When a price change is approved in SAP, updates Snowflake catalog and notifies merchandising via Slack.

naftiko: "0.5"
info:
  label: "Store Price Change Propagation"
  description: "When a price change is approved in SAP, updates Snowflake catalog and notifies merchandising via Slack."
  tags:
    - merchandising
    - sap
    - snowflake
    - slack
    - pricing
capability:
  exposes:
    - type: mcp
      namespace: merchandising
      port: 8080
      tools:
        - name: propagate-price-change
          description: "Given a material number and new price, update catalog and notify."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
            - name: new_price
              in: body
              type: string
              description: "New price."
            - name: effective_date
              in: body
              type: string
              description: "Effective date."
          steps:
            - name: get-material
              type: call
              call: sap.get-material
              with:
                material_number: "{{material_number}}"
            - name: update-catalog
              type: call
              call: snowflake.execute-statement
              with:
                statement: "UPDATE RETAIL.PRODUCT_CATALOG SET retail_price = {{new_price}}, price_effective_date = '{{effective_date}}' WHERE material_number = '{{material_number}}'"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "merchandising-pricing"
                text: "Price change: {{get-material.description}} ({{material_number}}): ${{new_price}} effective {{effective_date}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: products
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              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

Logs a quality issue in SAP, creates a Jira investigation ticket, notifies the supplier via Salesforce case, and alerts the quality team in Slack.

naftiko: "0.5"
info:
  label: "Supplier Quality Issue Pipeline"
  description: "Logs a quality issue in SAP, creates a Jira investigation ticket, notifies the supplier via Salesforce case, and alerts the quality team in Slack."
  tags:
    - quality
    - sap
    - jira
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: supplier-quality
      port: 8080
      tools:
        - name: report-quality-issue
          description: "Orchestrate supplier quality issue reporting and tracking."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
            - name: supplier_name
              in: body
              type: string
              description: "Supplier name."
            - name: defect_description
              in: body
              type: string
              description: "Description of quality defect."
          steps:
            - name: log-in-sap
              type: call
              call: "sap.create-quality-notification"
              with:
                material: "{{material_number}}"
                notification_type: "Q2"
                description: "{{defect_description}}"
            - name: create-jira
              type: call
              call: "jira.create-issue"
              with:
                project: "QUALITY"
                summary: "Quality issue: {{material_number}} from {{supplier_name}}"
                description: "{{defect_description}}. SAP QN: {{log-in-sap.notification_number}}."
                issuetype: "Bug"
            - name: create-supplier-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Quality issue: {{material_number}}"
                account_name: "{{supplier_name}}"
                description: "{{defect_description}}"
            - name: notify-quality
              type: call
              call: "slack.post-message"
              with:
                channel: "quality-assurance"
                text: "Quality issue reported: {{material_number}} from {{supplier_name}}. SAP: {{log-in-sap.notification_number}}. Jira: {{create-jira.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/QM_NOTIFICATION_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: notifications
          path: "/A_QualityNotification"
          operations:
            - name: create-quality-notification
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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: salesforce
      baseUri: "https://costco.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: 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

When Snowflake stock forecasting detects a product approaching reorder threshold, creates a ServiceNow procurement request and notifies the buying team in Teams.

naftiko: "0.5"
info:
  label: "Supply Chain Replenishment Alert"
  description: "When Snowflake stock forecasting detects a product approaching reorder threshold, creates a ServiceNow procurement request and notifies the buying team in Teams."
  tags:
    - supply-chain
    - inventory
    - snowflake
    - servicenow
    - microsoft-teams
    - replenishment
capability:
  exposes:
    - type: mcp
      namespace: replenishment-ops
      port: 8080
      tools:
        - name: handle-reorder-alert
          description: "Given a product SKU and current stock level, query Snowflake demand forecast, create a ServiceNow procurement request, and alert the buying team in Teams."
          inputParameters:
            - name: sku
              in: body
              type: string
              description: "The Costco product SKU number."
            - name: current_stock
              in: body
              type: integer
              description: "The current on-hand inventory unit count."
            - name: warehouse_id
              in: body
              type: string
              description: "The warehouse or distribution center ID."
          steps:
            - name: get-demand-forecast
              type: call
              call: "snowflake.get-demand-forecast"
              with:
                sku: "{{sku}}"
                warehouseId: "{{warehouse_id}}"
            - name: create-procurement-request
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Reorder alert: SKU {{sku}} at {{current_stock}} units"
                category: "procurement"
                description: "SKU: {{sku}}\nWarehouse: {{warehouse_id}}\nCurrent stock: {{current_stock}}\nForecast demand: {{get-demand-forecast.forecastedDemand}}"
            - name: notify-buying-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channelId: "buying-team"
                message: "Reorder alert: SKU {{sku}} has {{current_stock}} units remaining. Forecasted demand: {{get-demand-forecast.forecastedDemand}}. ServiceNow: {{create-procurement-request.number}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: demand-forecast
          path: "/statements"
          operations:
            - name: get-demand-forecast
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/channels/{{channelId}}/messages"
          inputParameters:
            - name: channelId
              in: path
          operations:
            - name: post-channel-message
              method: POST

Triggers a Terraform Cloud workspace run to provision or update Costco cloud infrastructure and creates a ServiceNow change record.

naftiko: "0.5"
info:
  label: "Terraform Cloud Infrastructure Provisioning"
  description: "Triggers a Terraform Cloud workspace run to provision or update Costco cloud infrastructure and creates a ServiceNow change record."
  tags:
    - cloud
    - infrastructure
    - terraform
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: trigger-terraform-run
          description: "Given a Terraform Cloud workspace ID and change description, trigger a plan and apply run and create a ServiceNow change record."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Terraform Cloud workspace ID."
            - name: change_description
              in: body
              type: string
              description: "Description of the infrastructure change."
          steps:
            - name: create-run
              type: call
              call: "terraform.create-run"
              with:
                workspaceId: "{{workspace_id}}"
                message: "{{change_description}}"
            - name: create-change-record
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Terraform infra change: {{change_description}}"
                description: "Workspace: {{workspace_id}}\nRun ID: {{create-run.runId}}"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.snow_user"
        password: "$secrets.snow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Retrieves the current state and last run status of a Terraform Cloud workspace.

naftiko: "0.5"
info:
  label: "Terraform Cloud Workspace Status"
  description: "Retrieves the current state and last run status of a Terraform Cloud workspace."
  tags:
    - infrastructure
    - terraform
    - cloud-ops
capability:
  exposes:
    - type: mcp
      namespace: terraform-status
      port: 8080
      tools:
        - name: get-workspace-status
          description: "Look up Terraform workspace run status."
          inputParameters:
            - name: workspace_name
              in: body
              type: string
              description: "Terraform workspace name."
          call: "terraform.get-workspace"
          with:
            workspace_name: "{{workspace_name}}"
          outputParameters:
            - name: current_run_status
              type: string
              mapping: "$.data.attributes.current-run.status"
            - name: resource_count
              type: number
              mapping: "$.data.attributes.resource-count"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/organizations/costco/workspaces/{{workspace_name}}"
          inputParameters:
            - name: workspace_name
              in: path
          operations:
            - name: get-workspace
              method: GET

Detects Terraform drift, creates GitHub PR, and alerts platform engineering via Slack.

naftiko: "0.5"
info:
  label: "Terraform Drift Detection Remediation"
  description: "Detects Terraform drift, creates GitHub PR, and alerts platform engineering via Slack."
  tags:
    - infrastructure
    - terraform
    - github
    - slack
capability:
  exposes:
    - type: mcp
      namespace: platform-eng
      port: 8080
      tools:
        - name: handle-drift
          description: "Given workspace and drift details, create PR and notify."
          inputParameters:
            - name: workspace
              in: body
              type: string
              description: "Terraform workspace."
            - name: resource_address
              in: body
              type: string
              description: "Resource with drift."
            - name: drift_summary
              in: body
              type: string
              description: "Drift summary."
          steps:
            - name: create-pr
              type: call
              call: github.create-pr
              with:
                repo: "costco/infrastructure"
                head: "fix/drift-{{workspace}}"
                base: main
                title: "Fix drift: {{resource_address}}"
                body: "{{drift_summary}}"
            - name: notify
              type: call
              call: slack.post-message
              with:
                channel: "platform-engineering"
                text: "Terraform drift in {{workspace}}: {{resource_address}}. PR: {{create-pr.html_url}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pulls
          path: "/repos/{{repo}}/pulls"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: create-pr
              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

When a SAP invoice has a discrepancy, creates a Jira ticket and notifies the buyer via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vendor Invoice Discrepancy Handler"
  description: "When a SAP invoice has a discrepancy, creates a Jira ticket and notifies the buyer via Microsoft Teams."
  tags:
    - procurement
    - finance
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: handle-invoice-discrepancy
          description: "Given an invoice number, create Jira ticket and notify buyer."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "SAP invoice number."
            - name: buyer_email
              in: body
              type: string
              description: "Buyer email."
          steps:
            - name: get-invoice
              type: call
              call: sap.get-invoice
              with:
                invoice_number: "{{invoice_number}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: PROC
                issue_type: Task
                summary: "Invoice discrepancy: {{invoice_number}}"
            - name: notify-buyer
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{buyer_email}}"
                text: "Invoice {{invoice_number}} discrepancy: {{get-invoice.variance_amount}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://costco.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Compares SAP accounts payable with Snowflake payment records, creates a Jira ticket for discrepancies, and notifies finance via Slack.

naftiko: "0.5"
info:
  label: "Vendor Payment Reconciliation Pipeline"
  description: "Compares SAP accounts payable with Snowflake payment records, creates a Jira ticket for discrepancies, and notifies finance via Slack."
  tags:
    - finance
    - sap
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: payment-reconciliation
      port: 8080
      tools:
        - name: reconcile-payments
          description: "Compare payment records and flag discrepancies."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: period
              in: body
              type: string
              description: "Payment period."
          steps:
            - name: get-sap-payables
              type: call
              call: "sap.get-vendor-payables"
              with:
                vendor_id: "{{vendor_id}}"
                period: "{{period}}"
            - name: get-payment-records
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT invoice_number, amount, payment_date, status FROM FINANCE.VENDOR_PAYMENTS WHERE vendor_id = '{{vendor_id}}' AND period = '{{period}}'"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "FIN"
                summary: "Payment reconciliation: Vendor {{vendor_id}} - {{period}}"
                description: "SAP total: {{get-sap-payables.total}}. Payment records: {{get-payment-records.row_count}}."
                issuetype: "Task"
            - name: notify-finance
              type: call
              call: "slack.post-message"
              with:
                channel: "accounts-payable"
                text: "Reconciliation for vendor {{vendor_id}} ({{period}}): Jira {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/FI_VENDOR_LINE_ITEMS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: payables
          path: "/A_VendorLineItems"
          operations:
            - name: get-vendor-payables
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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 energy consumption data from Snowflake, compares against targets in Datadog, creates a Jira sustainability ticket, and reports to facilities via Slack.

naftiko: "0.5"
info:
  label: "Warehouse Energy Monitoring Pipeline"
  description: "Pulls energy consumption data from Snowflake, compares against targets in Datadog, creates a Jira sustainability ticket, and reports to facilities via Slack."
  tags:
    - sustainability
    - snowflake
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: energy-monitoring
      port: 8080
      tools:
        - name: check-energy-usage
          description: "Monitor warehouse energy consumption against sustainability targets."
          inputParameters:
            - name: warehouse_id
              in: body
              type: string
              description: "Warehouse ID."
            - name: month
              in: body
              type: string
              description: "Month in YYYY-MM format."
          steps:
            - name: get-consumption
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT total_kwh, target_kwh, variance_pct FROM SUSTAINABILITY.ENERGY_USAGE WHERE warehouse_id = '{{warehouse_id}}' AND month = '{{month}}'"
            - name: get-realtime
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:warehouse.energy.kwh{warehouse:{{warehouse_id}}}"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "GREEN"
                summary: "Energy review: Warehouse {{warehouse_id}} - {{month}}"
                description: "Consumption: {{get-consumption.results[0].total_kwh}} kWh. Target: {{get-consumption.results[0].target_kwh}} kWh. Variance: {{get-consumption.results[0].variance_pct}}%."
                issuetype: "Task"
            - name: notify-facilities
              type: call
              call: "slack.post-message"
              with:
                channel: "facilities-management"
                text: "Energy report: Warehouse {{warehouse_id}} ({{month}}). Variance: {{get-consumption.results[0].variance_pct}}%. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://costco.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

Creates a ServiceNow work order for equipment maintenance, schedules a vendor visit in SAP, and notifies the warehouse manager via Slack.

naftiko: "0.5"
info:
  label: "Warehouse Equipment Maintenance Pipeline"
  description: "Creates a ServiceNow work order for equipment maintenance, schedules a vendor visit in SAP, and notifies the warehouse manager via Slack."
  tags:
    - maintenance
    - servicenow
    - sap
    - slack
capability:
  exposes:
    - type: mcp
      namespace: equipment-maintenance
      port: 8080
      tools:
        - name: schedule-maintenance
          description: "Orchestrate equipment maintenance scheduling."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "Equipment asset ID."
            - name: warehouse_id
              in: body
              type: string
              description: "Warehouse ID."
            - name: issue_description
              in: body
              type: string
              description: "Maintenance issue description."
          steps:
            - name: create-work-order
              type: call
              call: "servicenow.create-record"
              with:
                table: "wm_order"
                short_description: "Maintenance: {{equipment_id}} at Warehouse {{warehouse_id}}"
                description: "{{issue_description}}"
            - name: schedule-vendor
              type: call
              call: "sap.create-maintenance-order"
              with:
                equipment: "{{equipment_id}}"
                plant: "{{warehouse_id}}"
                description: "{{issue_description}}"
            - name: notify-manager
              type: call
              call: "slack.post-message"
              with:
                channel: "warehouse-{{warehouse_id}}-ops"
                text: "Equipment maintenance scheduled: {{equipment_id}}. Work order: {{create-work-order.number}}. SAP order: {{schedule-vendor.order_number}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/PM_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: maintenance-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: create-maintenance-order
              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

Queries Snowflake for inventory discrepancies, creates a recount task in Jira, notifies warehouse managers via Slack, and updates SAP inventory records.

naftiko: "0.5"
info:
  label: "Warehouse Inventory Recount Pipeline"
  description: "Queries Snowflake for inventory discrepancies, creates a recount task in Jira, notifies warehouse managers via Slack, and updates SAP inventory records."
  tags:
    - inventory
    - snowflake
    - jira
    - slack
    - sap
capability:
  exposes:
    - type: mcp
      namespace: inventory-recount
      port: 8080
      tools:
        - name: trigger-recount
          description: "Orchestrate inventory recount for discrepant items."
          inputParameters:
            - name: warehouse_id
              in: body
              type: string
              description: "Warehouse ID."
            - name: threshold_pct
              in: body
              type: number
              description: "Discrepancy threshold percentage."
          steps:
            - name: find-discrepancies
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT sku, system_qty, physical_qty, ABS(system_qty - physical_qty)/system_qty*100 as variance_pct FROM INVENTORY.CYCLE_COUNT WHERE warehouse_id = '{{warehouse_id}}' AND variance_pct > {{threshold_pct}}"
            - name: create-task
              type: call
              call: "jira.create-issue"
              with:
                project: "WHSE"
                summary: "Inventory recount: Warehouse {{warehouse_id}} - {{find-discrepancies.row_count}} items"
                description: "Items exceeding {{threshold_pct}}% variance require recount."
                issuetype: "Task"
            - name: notify-manager
              type: call
              call: "slack.post-message"
              with:
                channel: "warehouse-{{warehouse_id}}-ops"
                text: "Recount required: {{find-discrepancies.row_count}} items above {{threshold_pct}}% variance. Jira: {{create-task.key}}"
            - name: flag-in-sap
              type: call
              call: "sap.update-inventory-flag"
              with:
                warehouse_id: "{{warehouse_id}}"
                flag: "recount_pending"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/MM_INV_MGMT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: inventory
          path: "/A_InventoryFlag"
          operations:
            - name: update-inventory-flag
              method: POST

Creates a safety incident in ServiceNow, files a Workday workers comp notification, notifies safety team via Slack, and creates a follow-up task in Jira.

naftiko: "0.5"
info:
  label: "Warehouse Safety Incident Pipeline"
  description: "Creates a safety incident in ServiceNow, files a Workday workers comp notification, notifies safety team via Slack, and creates a follow-up task in Jira."
  tags:
    - safety
    - servicenow
    - workday
    - slack
    - jira
capability:
  exposes:
    - type: mcp
      namespace: safety-incident
      port: 8080
      tools:
        - name: report-safety-incident
          description: "Orchestrate safety incident reporting and follow-up."
          inputParameters:
            - name: warehouse_id
              in: body
              type: string
              description: "Warehouse ID."
            - name: employee_id
              in: body
              type: string
              description: "Employee involved."
            - name: incident_description
              in: body
              type: string
              description: "Description of the incident."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_safety_incident"
                warehouse_id: "{{warehouse_id}}"
                employee_id: "{{employee_id}}"
                description: "{{incident_description}}"
                urgency: "1"
            - name: notify-workday
              type: call
              call: "workday.create-safety-event"
              with:
                employee_id: "{{employee_id}}"
                event_type: "workplace_incident"
                description: "{{incident_description}}"
            - name: alert-safety-team
              type: call
              call: "slack.post-message"
              with:
                channel: "safety-alerts"
                text: "SAFETY INCIDENT: Warehouse {{warehouse_id}}. Employee: {{employee_id}}. {{incident_description}}. ServiceNow: {{create-incident.number}}."
            - name: create-followup
              type: call
              call: "jira.create-issue"
              with:
                project: "SAFETY"
                summary: "Safety follow-up: Warehouse {{warehouse_id}} - {{create-incident.number}}"
                description: "{{incident_description}}. Root cause analysis required."
                issuetype: "Task"
                priority: "High"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: safety
          path: "/Safety/Safety_Event"
          operations:
            - name: create-safety-event
              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
    - type: http
      namespace: jira
      baseUri: "https://costco.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

Forecasts staffing needs from Snowflake demand data, creates Workday shift requests, posts schedules to Microsoft Teams, and logs in Jira.

naftiko: "0.5"
info:
  label: "Warehouse Staffing Adjustment Pipeline"
  description: "Forecasts staffing needs from Snowflake demand data, creates Workday shift requests, posts schedules to Microsoft Teams, and logs in Jira."
  tags:
    - workforce
    - snowflake
    - workday
    - microsoft-teams
    - jira
capability:
  exposes:
    - type: mcp
      namespace: staffing-adjustment
      port: 8080
      tools:
        - name: adjust-staffing
          description: "Orchestrate warehouse staffing adjustments based on demand forecasts."
          inputParameters:
            - name: warehouse_id
              in: body
              type: string
              description: "Warehouse ID."
            - name: week
              in: body
              type: string
              description: "Target week in YYYY-WNN format."
          steps:
            - name: get-forecast
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT day_of_week, predicted_traffic, recommended_staff FROM WORKFORCE.DEMAND_FORECAST WHERE warehouse_id = '{{warehouse_id}}' AND week = '{{week}}'"
            - name: create-shifts
              type: call
              call: "workday.create-schedule"
              with:
                warehouse_id: "{{warehouse_id}}"
                week: "{{week}}"
                schedule: "{{get-forecast.results}}"
            - name: post-schedule
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "$secrets.warehouse_{{warehouse_id}}_channel"
                text: "Updated staffing schedule for week {{week}}: {{get-forecast.row_count}} shift adjustments. Schedule: {{create-shifts.url}}."
            - name: track-change
              type: call
              call: "jira.create-issue"
              with:
                project: "WHSE"
                summary: "Staffing adjustment: Warehouse {{warehouse_id}} - {{week}}"
                description: "Demand-based adjustment. {{get-forecast.row_count}} days modified."
                issuetype: "Task"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: schedules
          path: "/Staffing/Schedule"
          operations:
            - name: create-schedule
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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

Queries Snowflake for weekly warehouse throughput metrics and posts digest to leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Weekly Warehouse Performance Digest"
  description: "Queries Snowflake for weekly warehouse throughput metrics and posts digest to leadership Microsoft Teams channel."
  tags:
    - analytics
    - retail
    - snowflake
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: warehouse-reporting
      port: 8080
      tools:
        - name: publish-warehouse-performance
          description: "Given a region and week ending date, query Snowflake and post digest."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Region code."
            - name: week_ending
              in: body
              type: string
              description: "Week ending date."
          steps:
            - name: query-performance
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT warehouse_id, SUM(net_sales) as total_sales, SUM(member_visits) as visits FROM RETAIL.WEEKLY_METRICS WHERE region = '{{region}}' AND week_ending = '{{week_ending}}' GROUP BY warehouse_id ORDER BY total_sales DESC"
            - name: post-digest
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "{{region}}-leadership"
                channel: performance
                text: "Weekly warehouse performance for {{region}} ending {{week_ending}}: {{query-performance.row_count}} locations reported."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Workday for employees with incomplete benefits enrollment and sends Teams reminders.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Queries Workday for employees with incomplete benefits enrollment and sends Teams reminders."
  tags:
    - hr
    - workday
    - microsoft-teams
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: send-reminders
          description: "Given a deadline, find incomplete enrollments and send reminders."
          inputParameters:
            - name: enrollment_deadline
              in: body
              type: string
              description: "Deadline YYYY-MM-DD."
          steps:
            - name: get-pending
              type: call
              call: workday.get-pending-enrollments
              with:
                deadline: "{{enrollment_deadline}}"
            - name: send
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-pending.employee_emails}}"
                text: "Reminder: Benefits enrollment due by {{enrollment_deadline}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/costco/benefits/pendingEnrollments"
          operations:
            - name: get-pending-enrollments
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves current benefits enrollment details for an employee from Workday.

naftiko: "0.5"
info:
  label: "Workday Employee Benefits Lookup"
  description: "Retrieves current benefits enrollment details for an employee from Workday."
  tags:
    - hr
    - workday
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: employee-benefits
      port: 8080
      tools:
        - name: get-benefits
          description: "Look up benefits enrollment for an employee."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: "workday.get-benefits"
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: plans
              type: array
              mapping: "$.Report_Entry[0].Benefit_Plans"
            - name: coverage_begin
              type: string
              mapping: "$.Report_Entry[0].Coverage_Begin_Date"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: benefits
          path: "/Benefits/Employee_Benefits/{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-benefits
              method: GET

Looks up a Workday employee by worker ID and returns name, department, and job title.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Looks up a Workday employee by worker ID and returns name, department, and job title."
  tags:
    - hr
    - workday
    - employee
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee
          description: "Given a Workday worker ID, return employee details. Use for HR inquiries."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          call: workday.get-worker
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.d.FullName"
            - name: department
              type: string
              mapping: "$.d.Department"
  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: "/costco/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Returns current active headcount by department and cost center from Workday for workforce planning and finance reporting.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot"
  description: "Returns current active headcount by department and cost center from Workday for workforce planning and finance reporting."
  tags:
    - hr
    - finance
    - workday
    - headcount
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-snapshot
          description: "Returns current active employee headcount grouped by department and cost center from Workday. Use for workforce planning, headcount budgeting, and finance period close."
          call: "workday.get-headcount"
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.id"
                - name: full_name
                  type: string
                  mapping: "$.name"
                - name: department
                  type: string
                  mapping: "$.department"
                - name: cost_center
                  type: string
                  mapping: "$.costCenter"
  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: "/costco/workers"
          operations:
            - name: get-headcount
              method: GET

When a requisition is created, validates SAP budget, creates ServiceNow approval, and notifies hiring manager.

naftiko: "0.5"
info:
  label: "Workday Job Requisition Approval"
  description: "When a requisition is created, validates SAP budget, creates ServiceNow approval, and notifies hiring manager."
  tags:
    - hr
    - workday
    - sap
    - servicenow
    - microsoft-teams
    - recruiting
capability:
  exposes:
    - type: mcp
      namespace: recruiting
      port: 8080
      tools:
        - name: process-requisition
          description: "Given a requisition ID, validate budget and create approval."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Requisition ID."
          steps:
            - name: get-req
              type: call
              call: workday.get-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: check-budget
              type: call
              call: sap.get-cost-center-budget
              with:
                cost_center: "{{get-req.cost_center}}"
            - name: create-approval
              type: call
              call: servicenow.create-request
              with:
                category: hr_recruiting
                short_description: "Requisition: {{get-req.job_title}}"
            - name: notify
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-req.hiring_manager_email}}"
                text: "Requisition for {{get-req.job_title}} submitted. Budget: {{check-budget.remaining}}. Ticket: {{create-approval.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: requisitions
          path: "/costco/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenter('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center-budget
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Pulls current period payroll totals from Workday for finance period close and compensation reporting.

naftiko: "0.5"
info:
  label: "Workday Payroll Results Export"
  description: "Pulls current period payroll totals from Workday for finance period close and compensation reporting."
  tags:
    - hr
    - finance
    - workday
    - payroll
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: payroll-reporting
      port: 8080
      tools:
        - name: get-payroll-results
          description: "Returns current period payroll totals grouped by department from Workday. Use for finance period close, compensation analysis, and headcount cost reporting."
          call: "workday.get-payroll-results"
          outputParameters:
            - name: total_gross_pay
              type: number
              mapping: "$.totals.grossPay"
            - name: total_employees
              type: number
              mapping: "$.totals.headcount"
            - name: pay_period
              type: string
              mapping: "$.payPeriod"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: payroll-results
          path: "/costco/payrollResults"
          operations:
            - name: get-payroll-results
              method: GET

Compares Workday payroll results with budgets in Snowflake and alerts payroll team via Teams.

naftiko: "0.5"
info:
  label: "Workday Payroll Variance Alert"
  description: "Compares Workday payroll results with budgets in Snowflake and alerts payroll team via Teams."
  tags:
    - finance
    - hr
    - workday
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payroll-ops
      port: 8080
      tools:
        - name: check-payroll-variance
          description: "Given a pay period, compare payroll with budgets and alert."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "Pay period."
          steps:
            - name: get-payroll
              type: call
              call: workday.get-payroll-results
              with:
                pay_period: "{{pay_period}}"
            - name: log-variance
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO FINANCE.PAYROLL_VARIANCE (pay_period, total_payroll) VALUES ('{{pay_period}}', {{get-payroll.total_amount}})"
            - name: alert
              type: call
              call: msteams.send-channel-message
              with:
                team_id: payroll-team
                channel: variance-alerts
                text: "Payroll variance for {{pay_period}}: ${{get-payroll.total_amount}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: payroll
          path: "/costco/payroll/results"
          operations:
            - name: get-payroll-results
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://costco.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Initiates performance review cycle in Workday, creates tracking tasks in Jira, sends reminders via Slack, and refreshes HR dashboards in Power BI.

naftiko: "0.5"
info:
  label: "Workday Performance Review Cycle Pipeline"
  description: "Initiates performance review cycle in Workday, creates tracking tasks in Jira, sends reminders via Slack, and refreshes HR dashboards in Power BI."
  tags:
    - hr
    - workday
    - jira
    - slack
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: performance-reviews
      port: 8080
      tools:
        - name: start-review-cycle
          description: "Orchestrate performance review cycle initiation."
          inputParameters:
            - name: review_period
              in: body
              type: string
              description: "Review period identifier."
            - name: department
              in: body
              type: string
              description: "Department name."
          steps:
            - name: initiate-reviews
              type: call
              call: "workday.create-review-cycle"
              with:
                period: "{{review_period}}"
                department: "{{department}}"
            - name: create-tracker
              type: call
              call: "jira.create-issue"
              with:
                project: "HR"
                summary: "Performance reviews: {{department}} - {{review_period}}"
                description: "Review cycle initiated. Employees: {{initiate-reviews.employee_count}}."
                issuetype: "Epic"
            - name: send-reminders
              type: call
              call: "slack.post-message"
              with:
                channel: "hr-{{department}}"
                text: "Performance review cycle started for {{review_period}}. {{initiate-reviews.employee_count}} reviews to complete. Tracker: {{create-tracker.key}}."
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "$secrets.powerbi_workspace_id"
                dataset_id: "$secrets.hr_dataset_id"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
      authentication:
        type: basic
        username: "$secrets.workday_user"
        password: "$secrets.workday_password"
      resources:
        - name: reviews
          path: "/Performance_Management/Review_Cycle"
          operations:
            - name: create-review-cycle
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://costco.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
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

When an employee is promoted in Workday, updates Okta groups and creates ServiceNow access request.

naftiko: "0.5"
info:
  label: "Workday Promotion to Okta Role Update"
  description: "When an employee is promoted in Workday, updates Okta groups and creates ServiceNow access request."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access-mgmt
      port: 8080
      tools:
        - name: sync-promotion-access
          description: "Given a worker ID, update Okta groups and create access request."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: update-okta
              type: call
              call: okta.update-groups
              with:
                user_login: "{{get-worker.work_email}}"
                new_groups: "{{get-worker.role_groups}}"
            - name: create-request
              type: call
              call: servicenow.create-request
              with:
                category: access_management
                short_description: "Access update: {{get-worker.full_name}} — {{get-worker.job_title}}"
  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: "/costco/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: groups
          path: "/users/{{user_login}}/groups"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: update-groups
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://costco.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Returns a stage-by-stage candidate summary for an open Workday job requisition for recruiting team oversight.

naftiko: "0.5"
info:
  label: "Workday Recruiting Pipeline Summary"
  description: "Returns a stage-by-stage candidate summary for an open Workday job requisition for recruiting team oversight."
  tags:
    - hr
    - recruiting
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: recruiting
      port: 8080
      tools:
        - name: get-requisition-pipeline
          description: "Given a Workday job requisition ID, return stage-by-stage candidate counts and the job title. Use to track open position pipeline health."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          call: "workday.get-job-requisition"
          with:
            requisitionId: "{{requisition_id}}"
          outputParameters:
            - name: job_title
              type: string
              mapping: "$.jobRequisition.jobTitle"
            - name: total_candidates
              type: number
              mapping: "$.jobRequisition.candidateCount"
            - name: open_since
              type: string
              mapping: "$.jobRequisition.openDate"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/costco/jobRequisitions/{{requisitionId}}"
          inputParameters:
            - name: requisitionId
              in: path
          operations:
            - name: get-job-requisition
              method: GET

When an employee's role changes in Workday, updates Okta group memberships to match the new role's access entitlements.

naftiko: "0.5"
info:
  label: "Workday Role Change Access Provisioning"
  description: "When an employee's role changes in Workday, updates Okta group memberships to match the new role's access entitlements."
  tags:
    - hr
    - identity
    - workday
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: hr-identity
      port: 8080
      tools:
        - name: sync-role-access
          description: "Given a Workday employee ID and new job profile, update Okta group memberships to reflect the new role's access entitlements."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID."
            - name: new_job_profile
              in: body
              type: string
              description: "The new Workday job profile name."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: assign-okta-group
              type: call
              call: "okta.add-user-to-group"
              with:
                userId: "{{get-worker.okta_user_id}}"
                groupProfile: "{{new_job_profile}}"
  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: "/costco/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{groupProfile}}/users/{{userId}}"
          inputParameters:
            - name: groupProfile
              in: path
            - name: userId
              in: path
          operations:
            - name: add-user-to-group
              method: PUT

When an employee is terminated in Workday, deactivates Okta account and creates a ServiceNow equipment retrieval ticket.

naftiko: "0.5"
info:
  label: "Workday Termination to Okta Deprovisioning"
  description: "When an employee is terminated in Workday, deactivates Okta account and creates a ServiceNow equipment retrieval ticket."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
    - offboarding
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: process-termination
          description: "Given a worker ID, deactivate Okta and open equipment ticket."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Workday worker ID."
            - name: termination_date
              in: body
              type: string
              description: "Termination date."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{worker_id}}"
            - name: deactivate-okta
              type: call
              call: okta.deactivate-user
              with:
                user_login: "{{get-worker.work_email}}"
            - name: open-ticket
              type: call
              call: servicenow.create-incident
              with:
                category: hr_offboarding
                short_description: "Equipment retrieval: {{get-worker.full_name}} — {{termination_date}}"
  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: "/costco/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://costco.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: users
          path: "/users/{{user_login}}/lifecycle/deactivate"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://costco.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

Retrieves PTO balance for a Costco employee.

naftiko: "0.5"
info:
  label: "Workday Time Off Balance Check"
  description: "Retrieves PTO balance for a Costco employee."
  tags:
    - hr
    - workday
    - time-off
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Given a worker ID, return PTO balance."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "Worker ID."
          call: workday-pto.get-balance
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: pto_balance
              type: number
              mapping: "$.timeOffBalance.ptoHours"
  consumes:
    - type: http
      namespace: workday-pto
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off
          path: "/costco/workers/{{worker_id}}/timeOffBalance"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-balance
              method: GET

Returns current vacation, PTO, and sick leave balances for a Costco employee from Workday for absence planning and manager approvals.

naftiko: "0.5"
info:
  label: "Workday Time-Off Balance Lookup"
  description: "Returns current vacation, PTO, and sick leave balances for a Costco employee from Workday for absence planning and manager approvals."
  tags:
    - hr
    - workday
    - absence-management
capability:
  exposes:
    - type: mcp
      namespace: hr-absence
      port: 8080
      tools:
        - name: get-time-off-balance
          description: "Given a Workday employee ID, return the employee's current accrued vacation, PTO, and sick leave balances. Use before approving a time-off request."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-leave-balance"
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: vacation_days
              type: number
              mapping: "$.leaveBalances.vacation"
            - name: pto_days
              type: number
              mapping: "$.leaveBalances.pto"
            - name: sick_days
              type: number
              mapping: "$.leaveBalances.sick"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: leave-balances
          path: "/costco/workers/{{worker_id}}/leaveBalance"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-leave-balance
              method: GET

Retrieves Zoom meeting details by ID.

naftiko: "0.5"
info:
  label: "Zoom Meeting Details Lookup"
  description: "Retrieves Zoom meeting details by ID."
  tags:
    - communication
    - zoom
    - meetings
capability:
  exposes:
    - type: mcp
      namespace: communication
      port: 8080
      tools:
        - name: get-meeting
          description: "Given a Zoom meeting ID, return topic and time."
          inputParameters:
            - name: meeting_id
              in: body
              type: string
              description: "Meeting ID."
          call: zoom.get-meeting
          with:
            meeting_id: "{{meeting_id}}"
          outputParameters:
            - name: topic
              type: string
              mapping: "$.topic"
  consumes:
    - type: http
      namespace: zoom
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/meetings/{{meeting_id}}"
          inputParameters:
            - name: meeting_id
              in: path
          operations:
            - name: get-meeting
              method: GET