Lowe's Capabilities

Naftiko 0.5 capability definitions for Lowe's - 105 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Retrieves product page performance metrics from Adobe Analytics, including views, add-to-cart rate, and conversion rate.

naftiko: "0.5"
info:
  label: "Adobe Analytics Product Page Performance"
  description: "Retrieves product page performance metrics from Adobe Analytics, including views, add-to-cart rate, and conversion rate."
  tags:
    - analytics
    - adobe-analytics
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-product-page-metrics
          description: "Fetch Adobe Analytics product page performance. Returns page views, add-to-cart rate, and conversion rate for a product category."
          inputParameters:
            - name: product_category
              type: string
              description: "Product category identifier (e.g., appliances, tools, lumber)."
          call: adobe.get-report
          with:
            product_category: "{{product_category}}"
          outputParameters:
            - name: page_views
              type: integer
              mapping: "$.rows[0].value"
            - name: add_to_cart_rate
              type: number
              mapping: "$.rows[0].addToCartRate"
            - name: conversion_rate
              type: number
              mapping: "$.rows[0].conversionRate"
  consumes:
    - type: http
      namespace: adobe
      baseUri: "https://analytics.adobe.io/api/lowes"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/reports"
          operations:
            - name: get-report
              method: POST

Uses Anthropic Claude to classify and summarize customer complaints from Salesforce Service Cloud, routing them to the appropriate ServiceNow queue based on category.

naftiko: "0.5"
info:
  label: "AI-Assisted Customer Complaint Triage"
  description: "Uses Anthropic Claude to classify and summarize customer complaints from Salesforce Service Cloud, routing them to the appropriate ServiceNow queue based on category."
  tags:
    - customer-support
    - ai
    - salesforce
    - servicenow
    - anthropic
capability:
  exposes:
    - type: mcp
      namespace: cx-triage
      port: 8080
      tools:
        - name: triage-customer-complaint
          description: "Given a Salesforce Service Cloud case ID, retrieve case details, classify and summarize using Anthropic Claude, and create a routed ServiceNow incident with the AI-generated summary."
          inputParameters:
            - name: case_id
              type: string
              description: "Salesforce Service Cloud case record ID."
          steps:
            - name: get-case
              type: call
              call: salesforce.get-case
              with:
                case_id: "{{case_id}}"
            - name: classify-complaint
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Classify severity and summarize this customer complaint: {{get-case.Description}}"
            - name: create-routed-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Customer complaint: {{get-case.Subject}}"
                description: "AI summary: {{classify-complaint.content}}"
                category: "customer_experience"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              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: servicenow
      baseUri: "https://lowes.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

Analyzes in-store aisle traffic by pulling sensor data from Snowflake, correlating with sales data in SAP, and generating insights in Confluence.

naftiko: "0.5"
info:
  label: "Aisle Traffic Analysis Pipeline"
  description: "Analyzes in-store aisle traffic by pulling sensor data from Snowflake, correlating with sales data in SAP, and generating insights in Confluence."
  tags:
    - store-ops
    - snowflake
    - sap
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: store-analytics
      port: 8080
      tools:
        - name: analyze-aisle-traffic
          description: "Given a store and date range, pull Snowflake traffic sensor data, correlate SAP aisle sales, and publish Confluence insights."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
            - name: start_date
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-traffic-data
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT aisle, avg_visitors, peak_hour FROM AISLE_TRAFFIC WHERE store='{{store_number}}' AND date BETWEEN '{{start_date}}' AND '{{end_date}}'"
            - name: get-aisle-sales
              type: call
              call: sap.get-sales-by-aisle
              with:
                plant: "{{store_number}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: publish-insights
              type: call
              call: confluence.create-page
              with:
                space: "STORE_ANALYTICS"
                title: "Aisle Traffic: Store {{store_number}} ({{start_date}} to {{end_date}})"
                body: "Top aisle: {{get-traffic-data.results[0].aisle}} with {{get-traffic-data.results[0].avg_visitors}} avg visitors."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://lowes-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
          path: "/A_SalesOrder"
          operations:
            - name: get-sales-by-aisle
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://lowes.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Monitors API gateway health by pulling Datadog latency metrics, New Relic error rates, and posting a consolidated dashboard summary to Teams.

naftiko: "0.5"
info:
  label: "API Gateway Health Dashboard"
  description: "Monitors API gateway health by pulling Datadog latency metrics, New Relic error rates, and posting a consolidated dashboard summary to Teams."
  tags:
    - infrastructure
    - datadog
    - new-relic
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: platform-ops
      port: 8080
      tools:
        - name: check-api-gateway-health
          description: "Pull Datadog latency metrics and New Relic error rates for the API gateway, then post a consolidated summary to Teams."
          inputParameters:
            - name: gateway_name
              type: string
              description: "API gateway identifier."
          steps:
            - name: get-latency
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "api-gw-{{gateway_name}}"
            - name: get-errors
              type: call
              call: newrelic.get-app-metrics
              with:
                app_id: "{{gateway_name}}"
            - name: post-summary
              type: call
              call: msteams.send-message
              with:
                channel_id: "platform-engineering"
                text: "API Gateway {{gateway_name}}: Latency={{get-latency.overall_state}}, Error rate={{get-errors.error_rate}}%, Throughput={{get-errors.throughput}} rpm"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: bearer
        token: "$secrets.newrelic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-metrics
              method: GET
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Coordinates appliance delivery by confirming the order in Salesforce, verifying warehouse stock in Oracle, and scheduling the delivery route via ServiceNow.

naftiko: "0.5"
info:
  label: "Appliance Delivery Coordination"
  description: "Coordinates appliance delivery by confirming the order in Salesforce, verifying warehouse stock in Oracle, and scheduling the delivery route via ServiceNow."
  tags:
    - e-commerce
    - salesforce
    - oracle
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: delivery-ops
      port: 8080
      tools:
        - name: coordinate-appliance-delivery
          description: "Given an order ID, confirm Salesforce order details, verify Oracle warehouse availability, and create a ServiceNow delivery work order."
          inputParameters:
            - name: order_id
              type: string
              description: "Salesforce order ID."
            - name: delivery_date
              type: string
              description: "Requested delivery date in YYYY-MM-DD format."
          steps:
            - name: get-order
              type: call
              call: salesforce.get-order
              with:
                order_id: "{{order_id}}"
            - name: verify-stock
              type: call
              call: oracle.get-onhand
              with:
                item_number: "{{get-order.product_sku}}"
                org_code: "{{get-order.fulfillment_center}}"
            - name: create-delivery-order
              type: call
              call: servicenow.create-work-order
              with:
                short_description: "Appliance delivery: {{get-order.product_name}} to {{get-order.shipping_address}}"
                scheduled_date: "{{delivery_date}}"
                assignment_group: "Delivery_Operations"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Order/{{order_id}}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: inventory
          path: "/inventoryBalances"
          operations:
            - name: get-onhand
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST

Tracks store associate certifications by pulling training records from Workday, checking expiration dates, and creating ServiceNow tasks for renewals due within 30 days.

naftiko: "0.5"
info:
  label: "Associate Certification Tracker"
  description: "Tracks store associate certifications by pulling training records from Workday, checking expiration dates, and creating ServiceNow tasks for renewals due within 30 days."
  tags:
    - store-ops
    - workday
    - servicenow
    - hr
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: check-certification-renewals
          description: "Given a store number, pull Workday training records, identify certifications expiring within 30 days, and create ServiceNow renewal tasks."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number to check."
          steps:
            - name: get-certifications
              type: call
              call: workday.get-certifications
              with:
                store: "{{store_number}}"
                expiring_within_days: "30"
            - name: create-renewal-tasks
              type: call
              call: servicenow.create-task
              with:
                short_description: "Certification renewal required — Store {{store_number}}"
                description: "{{get-certifications.count}} certifications expiring within 30 days"
                assignment_group: "Store_Training"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                channel_id: "store-{{store_number}}-ops"
                text: "{{get-certifications.count}} associate certifications expiring within 30 days at Store {{store_number}}. Task: {{create-renewal-tasks.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: certifications
          path: "/lowes/certifications"
          operations:
            - name: get-certifications
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Retrieves the latest build status from Azure DevOps for a given pipeline, returning result, duration, and triggered-by.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Status"
  description: "Retrieves the latest build status from Azure DevOps for a given pipeline, returning result, duration, and triggered-by."
  tags:
    - devops
    - azure-devops
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-build-status
          description: "Check the latest Azure DevOps build status for a pipeline. Returns build result, duration, and requestor."
          inputParameters:
            - name: pipeline_id
              type: string
              description: "Azure DevOps pipeline definition ID."
          call: azuredevops.get-build
          with:
            pipeline_id: "{{pipeline_id}}"
          outputParameters:
            - name: result
              type: string
              mapping: "$.value[0].result"
            - name: status
              type: string
              mapping: "$.value[0].status"
            - name: finish_time
              type: string
              mapping: "$.value[0].finishTime"
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/lowes"
      authentication:
        type: bearer
        token: "$secrets.azure_devops_pat"
      resources:
        - name: builds
          path: "/_apis/build/builds?definitions={{pipeline_id}}&$top=1&api-version=7.0"
          inputParameters:
            - name: pipeline_id
              in: query
          operations:
            - name: get-build
              method: GET

Retrieves a product listing from the BigCommerce catalog by SKU, returning price, availability, and images.

naftiko: "0.5"
info:
  label: "BigCommerce Product Listing Lookup"
  description: "Retrieves a product listing from the BigCommerce catalog by SKU, returning price, availability, and images."
  tags:
    - e-commerce
    - bigcommerce
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: ecommerce
      port: 8080
      tools:
        - name: get-product-listing
          description: "Look up a BigCommerce product by SKU. Returns name, price, stock level, and primary image URL."
          inputParameters:
            - name: sku
              type: string
              description: "Product SKU identifier."
          call: bigcommerce.get-product
          with:
            sku: "{{sku}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.data.name"
            - name: price
              type: number
              mapping: "$.data.price"
            - name: inventory_level
              type: integer
              mapping: "$.data.inventory_level"
  consumes:
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: products
          path: "/v3/catalog/products?sku={{sku}}"
          inputParameters:
            - name: sku
              in: query
          operations:
            - name: get-product
              method: GET

Orchestrates Buy Online Pick Up In Store orders by verifying BigCommerce order status, confirming SAP store-level inventory, and notifying the store associate via Teams.

naftiko: "0.5"
info:
  label: "BOPIS Order Fulfillment Orchestrator"
  description: "Orchestrates Buy Online Pick Up In Store orders by verifying BigCommerce order status, confirming SAP store-level inventory, and notifying the store associate via Teams."
  tags:
    - e-commerce
    - bigcommerce
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ecommerce-ops
      port: 8080
      tools:
        - name: fulfill-bopis-order
          description: "Given a BOPIS order number, verify BigCommerce order, confirm SAP store inventory, and notify the fulfillment associate via Teams."
          inputParameters:
            - name: order_number
              type: string
              description: "BigCommerce BOPIS order number."
            - name: store_number
              type: string
              description: "Pickup store number."
          steps:
            - name: get-order
              type: call
              call: bigcommerce.get-order
              with:
                order_number: "{{order_number}}"
            - name: check-store-stock
              type: call
              call: sap.get-stock-level
              with:
                material_number: "{{get-order.line_items[0].sku}}"
                plant: "{{store_number}}"
            - name: notify-associate
              type: call
              call: msteams.send-message
              with:
                channel_id: "store-{{store_number}}-fulfillment"
                text: "BOPIS order {{order_number}} ready for pick: {{get-order.line_items[0].name}} (Qty: {{get-order.line_items[0].quantity}}). Aisle location: {{check-store-stock.bin_location}}"
  consumes:
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: orders
          path: "/v2/orders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://lowes-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"
          operations:
            - name: get-stock-level
              method: GET
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Retrieves a document from Box by file ID, returning file metadata including name, size, and shared link.

naftiko: "0.5"
info:
  label: "Box Document Retrieval"
  description: "Retrieves a document from Box by file ID, returning file metadata including name, size, and shared link."
  tags:
    - document-management
    - box
    - store-ops
capability:
  exposes:
    - type: mcp
      namespace: documents
      port: 8080
      tools:
        - name: get-document
          description: "Retrieve a Box file by ID. Returns file name, size, last modified date, and download URL."
          inputParameters:
            - name: file_id
              type: string
              description: "Box file ID."
          call: box.get-file
          with:
            file_id: "{{file_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: size
              type: integer
              mapping: "$.size"
            - name: modified_at
              type: string
              mapping: "$.modified_at"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET

On a GitHub Actions pipeline failure, creates a Jira bug, posts a Datadog event marker, and alerts the engineering Teams channel.

naftiko: "0.5"
info:
  label: "CI/CD Pipeline Failure Triage"
  description: "On a GitHub Actions pipeline failure, creates a Jira bug, posts a Datadog event marker, and alerts the engineering Teams channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions pipeline failure, create a Jira bug in the engineering project, post a Datadog deployment event, and alert the engineering Teams channel with context."
          inputParameters:
            - name: repo
              type: string
              description: "GitHub repository full name (org/repo)."
            - name: branch
              type: string
              description: "Branch name where the failure occurred."
            - name: workflow_run_id
              type: string
              description: "GitHub Actions workflow run ID."
            - name: commit_sha
              type: string
              description: "Git commit SHA that triggered the run."
          steps:
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{repo}} / {{branch}}"
                description: "Workflow run {{workflow_run_id}} failed on commit {{commit_sha}}"
            - name: post-event
              type: call
              call: datadog.create-event
              with:
                title: "CI failure: {{repo}}"
                text: "Branch {{branch}} pipeline failed. Jira: {{create-bug.key}}"
                alert_type: "error"
            - name: alert-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "engineering-alerts"
                text: "Pipeline failure: {{repo}} | Branch: {{branch}} | Jira: {{create-bug.key}} | Run: {{workflow_run_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://lowes.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/engineering/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries AWS Cost Explorer for account-level spend anomalies and creates a Jira cost-tracking task with a Datadog event when thresholds are breached.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Alert"
  description: "Queries AWS Cost Explorer for account-level spend anomalies and creates a Jira cost-tracking task with a Datadog event when thresholds are breached."
  tags:
    - cloud
    - finops
    - aws
    - datadog
    - jira
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: handle-cloud-cost-anomaly
          description: "Given an AWS account ID and spend threshold, detect anomalies via Cost Explorer, create a Jira ticket, and post a Datadog warning event for tracking. Use when AWS budget alerts fire."
          inputParameters:
            - name: account_id
              type: string
              description: "AWS account ID to analyze for cost anomalies."
            - name: threshold_usd
              type: number
              description: "Anomaly threshold in USD."
            - name: date_from
              type: string
              description: "Start date for anomaly lookback in YYYY-MM-DD format."
          steps:
            - name: get-anomalies
              type: call
              call: aws-cost.get-anomalies
              with:
                accountId: "{{account_id}}"
                threshold: "{{threshold_usd}}"
                startDate: "{{date_from}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "CLOUD"
                issuetype: "Task"
                summary: "AWS cost anomaly detected: account {{account_id}}"
                description: "{{get-anomalies.summary}} — threshold {{threshold_usd}} USD exceeded"
            - name: post-event
              type: call
              call: datadog.create-event
              with:
                title: "AWS cost anomaly: {{account_id}}"
                text: "Threshold {{threshold_usd}} USD exceeded. Jira: {{create-task.key}}"
                alert_type: "warning"
  consumes:
    - type: http
      namespace: aws-cost
      baseUri: "https://ce.us-east-1.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_cost_explorer_token"
      resources:
        - name: anomalies
          path: "/GetAnomalies"
          operations:
            - name: get-anomalies
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lowes.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

Searches the Confluence knowledge base for articles matching a query string within the store operations space.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Article Search"
  description: "Searches the Confluence knowledge base for articles matching a query string within the store operations space."
  tags:
    - knowledge
    - confluence
    - store-ops
capability:
  exposes:
    - type: mcp
      namespace: knowledge
      port: 8080
      tools:
        - name: search-articles
          description: "Search Confluence for knowledge articles by keyword. Returns matching article titles, URLs, and last modified dates."
          inputParameters:
            - name: query
              type: string
              description: "Search query string."
          call: confluence.search
          with:
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.results"
            - name: total_size
              type: integer
              mapping: "$.totalSize"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://lowes.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content/search"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search
              method: GET

Verifies contractor licenses by pulling Pro account data from Salesforce, checking compliance documents in Box, and updating verification status in Snowflake.

naftiko: "0.5"
info:
  label: "Contractor License Verification"
  description: "Verifies contractor licenses by pulling Pro account data from Salesforce, checking compliance documents in Box, and updating verification status in Snowflake."
  tags:
    - loyalty
    - salesforce
    - box
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: pro-services
      port: 8080
      tools:
        - name: verify-contractor-license
          description: "Given a Pro account ID, pull Salesforce data, check Box license documents, and update Snowflake verification status."
          inputParameters:
            - name: account_id
              type: string
              description: "Salesforce Pro account ID."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: check-documents
              type: call
              call: box.get-folder-items
              with:
                folder_id: "{{get-account.license_folder_id}}"
            - name: update-status
              type: call
              call: snowflake.run-query
              with:
                statement: "UPDATE PRO_ACCOUNTS SET license_verified=TRUE, doc_count={{check-documents.total_count}} WHERE account_id='{{account_id}}'"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders/{{folder_id}}/items"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: get-folder-items
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Generates a project quote for Pro contractors by pulling product pricing from BigCommerce, checking bulk availability in Oracle, and creating the quote in Salesforce.

naftiko: "0.5"
info:
  label: "Contractor Project Quote Generator"
  description: "Generates a project quote for Pro contractors by pulling product pricing from BigCommerce, checking bulk availability in Oracle, and creating the quote in Salesforce."
  tags:
    - e-commerce
    - bigcommerce
    - oracle
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: pro-services
      port: 8080
      tools:
        - name: generate-project-quote
          description: "Given a list of SKUs and quantities, fetch BigCommerce pricing, check Oracle bulk availability, and create a Salesforce quote."
          inputParameters:
            - name: account_id
              type: string
              description: "Salesforce Pro account ID."
            - name: sku_list
              type: string
              description: "Comma-separated list of product SKUs."
            - name: quantities
              type: string
              description: "Comma-separated quantities matching SKU list."
          steps:
            - name: get-pricing
              type: call
              call: bigcommerce.get-bulk-pricing
              with:
                skus: "{{sku_list}}"
            - name: check-availability
              type: call
              call: oracle.get-bulk-onhand
              with:
                items: "{{sku_list}}"
                org_code: "DC01"
            - name: create-quote
              type: call
              call: salesforce.create-quote
              with:
                account_id: "{{account_id}}"
                line_items: "{{get-pricing.items}}"
                availability: "{{check-availability.results}}"
  consumes:
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: pricing
          path: "/v3/catalog/products"
          operations:
            - name: get-bulk-pricing
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: inventory
          path: "/inventoryBalances"
          operations:
            - name: get-bulk-onhand
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: quotes
          path: "/sobjects/Quote"
          operations:
            - name: create-quote
              method: POST

Manages cross-dock replenishment by checking store inventory levels in SAP, creating transfer orders in Oracle, and notifying the logistics team via Teams.

naftiko: "0.5"
info:
  label: "Cross-Dock Replenishment Orchestrator"
  description: "Manages cross-dock replenishment by checking store inventory levels in SAP, creating transfer orders in Oracle, and notifying the logistics team via Teams."
  tags:
    - supply-chain
    - sap
    - oracle
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: trigger-cross-dock-replenishment
          description: "Given a store and material, check SAP stock levels, create Oracle transfer orders for low-stock items, and notify logistics."
          inputParameters:
            - name: store_number
              type: string
              description: "Destination store number."
            - name: material_number
              type: string
              description: "SAP material number."
          steps:
            - name: check-stock
              type: call
              call: sap.get-stock-level
              with:
                material_number: "{{material_number}}"
                plant: "{{store_number}}"
            - name: create-transfer
              type: call
              call: oracle.create-transfer-order
              with:
                item: "{{material_number}}"
                from_org: "DC_CENTRAL"
                to_org: "{{store_number}}"
                quantity: "{{check-stock.reorder_quantity}}"
            - name: notify-logistics
              type: call
              call: msteams.send-message
              with:
                channel_id: "logistics-ops"
                text: "Cross-dock replenishment initiated: {{material_number}} qty {{check-stock.reorder_quantity}} to Store {{store_number}}. Transfer: {{create-transfer.order_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-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"
          operations:
            - name: get-stock-level
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: transfers
          path: "/transferOrders"
          operations:
            - name: create-transfer-order
              method: POST
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Manages curbside pickup by monitoring BigCommerce order status, sending customer notifications via HubSpot, and logging fulfillment metrics in Snowflake.

naftiko: "0.5"
info:
  label: "Curbside Pickup Notification Pipeline"
  description: "Manages curbside pickup by monitoring BigCommerce order status, sending customer notifications via HubSpot, and logging fulfillment metrics in Snowflake."
  tags:
    - e-commerce
    - bigcommerce
    - hubspot
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: ecommerce-ops
      port: 8080
      tools:
        - name: notify-curbside-pickup
          description: "Given an order number, check BigCommerce fulfillment status, send HubSpot notification to customer, and log in Snowflake."
          inputParameters:
            - name: order_number
              type: string
              description: "BigCommerce order number."
            - name: store_number
              type: string
              description: "Pickup store number."
          steps:
            - name: get-order
              type: call
              call: bigcommerce.get-order
              with:
                order_number: "{{order_number}}"
            - name: send-notification
              type: call
              call: hubspot.send-email
              with:
                to: "{{get-order.billing_address.email}}"
                template_id: "curbside-ready"
            - name: log-fulfillment
              type: call
              call: snowflake.run-query
              with:
                statement: "INSERT INTO CURBSIDE_FULFILLMENT VALUES ('{{order_number}}', '{{store_number}}', CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: orders
          path: "/v2/orders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: emails
          path: "/marketing/v3/transactional/single-email/send"
          operations:
            - name: send-email
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Escalates customer complaints by looking up the Salesforce case, pulling order details from BigCommerce, and creating a high-priority ServiceNow ticket for resolution.

naftiko: "0.5"
info:
  label: "Customer Complaint Escalation Workflow"
  description: "Escalates customer complaints by looking up the Salesforce case, pulling order details from BigCommerce, and creating a high-priority ServiceNow ticket for resolution."
  tags:
    - e-commerce
    - salesforce
    - bigcommerce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: customer-service
      port: 8080
      tools:
        - name: escalate-complaint
          description: "Given a Salesforce case ID, pull case and order details, and create a priority ServiceNow resolution ticket."
          inputParameters:
            - name: case_id
              type: string
              description: "Salesforce case ID."
          steps:
            - name: get-case
              type: call
              call: salesforce.get-case
              with:
                case_id: "{{case_id}}"
            - name: get-order
              type: call
              call: bigcommerce.get-order
              with:
                order_number: "{{get-case.order_number}}"
            - name: create-escalation
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Escalated complaint: {{get-case.subject}}"
                category: "customer_service"
                priority: "2"
                description: "Order: {{get-case.order_number}}, Total: ${{get-order.total_inc_tax}}, Customer: {{get-case.contact_email}}"
                assignment_group: "Customer_Resolution"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: orders
          path: "/v2/orders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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

Processes customer returns by looking up the order in BigCommerce, issuing a refund via Salesforce, and updating inventory in SAP.

naftiko: "0.5"
info:
  label: "Customer Return Processing Workflow"
  description: "Processes customer returns by looking up the order in BigCommerce, issuing a refund via Salesforce, and updating inventory in SAP."
  tags:
    - e-commerce
    - bigcommerce
    - salesforce
    - sap
capability:
  exposes:
    - type: mcp
      namespace: returns-ops
      port: 8080
      tools:
        - name: process-customer-return
          description: "Given an order number and return reason, look up BigCommerce order, create Salesforce refund case, and adjust SAP inventory."
          inputParameters:
            - name: order_number
              type: string
              description: "Original order number."
            - name: return_reason
              type: string
              description: "Reason for return."
            - name: sku
              type: string
              description: "Product SKU being returned."
          steps:
            - name: get-order
              type: call
              call: bigcommerce.get-order
              with:
                order_number: "{{order_number}}"
            - name: create-refund-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Return: Order {{order_number}} — {{return_reason}}"
                customer_email: "{{get-order.billing_address.email}}"
                amount: "{{get-order.total_inc_tax}}"
            - name: adjust-inventory
              type: call
              call: sap.post-goods-receipt
              with:
                material_number: "{{sku}}"
                quantity: "1"
                movement_type: "651"
  consumes:
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: orders
          path: "/v2/orders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.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: sap
      baseUri: "https://lowes-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"
          operations:
            - name: post-goods-receipt
              method: POST

Remediates database performance issues by pulling Dynatrace metrics, analyzing slow queries in Splunk, and creating a ServiceNow change request for optimization.

naftiko: "0.5"
info:
  label: "Database Performance Remediation"
  description: "Remediates database performance issues by pulling Dynatrace metrics, analyzing slow queries in Splunk, and creating a ServiceNow change request for optimization."
  tags:
    - infrastructure
    - dynatrace
    - splunk
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: dba-ops
      port: 8080
      tools:
        - name: remediate-db-performance
          description: "Given a database host ID, pull Dynatrace metrics, find Splunk slow queries, and create ServiceNow change request."
          inputParameters:
            - name: host_id
              type: string
              description: "Dynatrace host entity ID for the database server."
          steps:
            - name: get-db-metrics
              type: call
              call: dynatrace.get-host
              with:
                host_id: "{{host_id}}"
            - name: find-slow-queries
              type: call
              call: splunk.run-search
              with:
                query: "index=database host={{host_id}} duration>5000 | top query_text"
                time_range: "-24h"
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "DB optimization: {{get-db-metrics.display_name}}"
                description: "CPU: {{get-db-metrics.cpu_usage}}%, Top slow queries: {{find-slow-queries.event_count}}"
                assignment_group: "Database_Administration"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://lowes.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: entities
          path: "/entities/{{host_id}}"
          inputParameters:
            - name: host_id
              in: path
          operations:
            - name: get-host
              method: GET
    - type: http
      namespace: splunk
      baseUri: "https://lowes-splunk.splunkcloud.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: searches
          path: "/search/jobs"
          operations:
            - name: run-search
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

Fetches SLO compliance data from Datadog for all production services and posts a weekly summary to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Datadog SLO Weekly Compliance Report"
  description: "Fetches SLO compliance data from Datadog for all production services and posts a weekly summary to the engineering Teams channel."
  tags:
    - observability
    - slo
    - datadog
    - reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: slo-reporting
      port: 8080
      tools:
        - name: publish-slo-compliance
          description: "Fetch weekly SLO compliance metrics for all production services from Datadog and post a summary to the engineering Teams channel. Use every Monday for the weekly ops review."
          inputParameters:
            - name: teams_channel_id
              type: string
              description: "Teams channel ID for engineering operations reporting."
          steps:
            - name: get-slos
              type: call
              call: datadog.list-slos
              with:
                tags: "env:production"
            - name: post-report
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Weekly SLO Report: {{get-slos.complianceCount}} services meeting targets out of {{get-slos.totalCount}} total."
  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: slos
          path: "/slo"
          inputParameters:
            - name: tags
              in: query
          operations:
            - name: list-slos
              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/engineering/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a Datadog monitor fires for a store infrastructure resource, creates a ServiceNow incident and pages the on-call store operations engineer.

naftiko: "0.5"
info:
  label: "Datadog Store Infrastructure Alert"
  description: "When a Datadog monitor fires for a store infrastructure resource, creates a ServiceNow incident and pages the on-call store operations engineer."
  tags:
    - itsm
    - observability
    - datadog
    - servicenow
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: store-ops
      port: 8080
      tools:
        - name: handle-store-infrastructure-alert
          description: "Given a Datadog alert for a store infrastructure issue, create a ServiceNow incident with store details and alert the store operations Teams channel."
          inputParameters:
            - name: monitor_id
              type: string
              description: "Datadog monitor ID that triggered the alert."
            - name: store_number
              type: string
              description: "Lowe's store number affected by the alert."
            - name: severity
              type: string
              description: "Alert severity: critical, warning, or info."
          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: "Store {{store_number}} infrastructure alert — {{severity}}"
                urgency: "1"
                impact: "1"
                description: "Monitor {{monitor_id}}: {{get-monitor.message}}"
            - name: notify-ops
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "store-ops-alerts"
                text: "Store {{store_number}} alert ({{severity}}): {{get-monitor.name}} | ServiceNow: {{create-incident.number}}"
  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://lowes.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/store-ops/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks the status of a Datadog synthetic monitor for store POS system uptime by monitor ID.

naftiko: "0.5"
info:
  label: "Datadog Store POS Monitor Status"
  description: "Checks the status of a Datadog synthetic monitor for store POS system uptime by monitor ID."
  tags:
    - monitoring
    - datadog
    - store-ops
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-pos-monitor
          description: "Check Datadog POS monitor status by monitor ID. Returns overall status, last triggered time, and affected stores."
          inputParameters:
            - name: monitor_id
              type: string
              description: "Datadog monitor ID."
          call: datadog.get-monitor
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: overall_state
              type: string
              mapping: "$.overall_state"
            - name: name
              type: string
              mapping: "$.name"
            - name: last_triggered
              type: string
              mapping: "$.overall_state_modified"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Tracks outbound distribution center shipments by pulling Oracle shipping data, verifying SAP delivery documents, and posting status updates to Teams.

naftiko: "0.5"
info:
  label: "DC Outbound Shipment Tracker"
  description: "Tracks outbound distribution center shipments by pulling Oracle shipping data, verifying SAP delivery documents, and posting status updates to Teams."
  tags:
    - supply-chain
    - oracle
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: track-dc-shipment
          description: "Given a shipment ID, pull Oracle shipping data, verify SAP delivery document, and post Teams status update."
          inputParameters:
            - name: shipment_id
              type: string
              description: "Oracle shipment ID."
            - name: delivery_number
              type: string
              description: "SAP delivery document number."
          steps:
            - name: get-shipment
              type: call
              call: oracle.get-shipment
              with:
                shipment_id: "{{shipment_id}}"
            - name: verify-delivery
              type: call
              call: sap.get-delivery
              with:
                delivery_number: "{{delivery_number}}"
            - name: post-status
              type: call
              call: msteams.send-message
              with:
                channel_id: "dc-operations"
                text: "Shipment {{shipment_id}}: {{get-shipment.status}}. SAP delivery {{delivery_number}} to Store {{verify-delivery.ship_to_plant}}. ETA: {{get-shipment.eta}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: shipments
          path: "/shipments/{{shipment_id}}"
          inputParameters:
            - name: shipment_id
              in: path
          operations:
            - name: get-shipment
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV_V2"
      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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Tracks marketing campaign ROI by pulling Adobe Analytics conversion data, HubSpot email metrics, and publishing the report to a Snowflake analytics table.

naftiko: "0.5"
info:
  label: "Digital Marketing Campaign ROI Tracker"
  description: "Tracks marketing campaign ROI by pulling Adobe Analytics conversion data, HubSpot email metrics, and publishing the report to a Snowflake analytics table."
  tags:
    - marketing
    - adobe-analytics
    - hubspot
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: marketing-ops
      port: 8080
      tools:
        - name: track-campaign-roi
          description: "Given a campaign ID and date range, pull Adobe Analytics conversions, HubSpot email performance, and store ROI metrics in Snowflake."
          inputParameters:
            - name: campaign_id
              type: string
              description: "Marketing campaign ID."
            - name: start_date
              type: string
              description: "Campaign start date in YYYY-MM-DD format."
            - name: end_date
              type: string
              description: "Campaign end date in YYYY-MM-DD format."
          steps:
            - name: get-conversions
              type: call
              call: adobe.get-report
              with:
                campaign_id: "{{campaign_id}}"
                date_range: "{{start_date}}/{{end_date}}"
            - name: get-email-metrics
              type: call
              call: hubspot.get-campaign-metrics
              with:
                campaign_id: "{{campaign_id}}"
            - name: store-roi
              type: call
              call: snowflake.run-query
              with:
                statement: "INSERT INTO CAMPAIGN_ROI VALUES ('{{campaign_id}}', {{get-conversions.revenue}}, {{get-email-metrics.open_rate}}, {{get-email-metrics.click_rate}}, CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: adobe
      baseUri: "https://analytics.adobe.io/api/lowes"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/reports"
          operations:
            - name: get-report
              method: POST
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: campaigns
          path: "/marketing/v3/campaigns/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-metrics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Checks the health status of a monitored host in Dynatrace by host ID, returning availability and CPU metrics.

naftiko: "0.5"
info:
  label: "Dynatrace Host Health Check"
  description: "Checks the health status of a monitored host in Dynatrace by host ID, returning availability and CPU metrics."
  tags:
    - monitoring
    - dynatrace
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-host-health
          description: "Check Dynatrace host health by host ID. Returns availability state, CPU usage percentage, and memory usage."
          inputParameters:
            - name: host_id
              type: string
              description: "Dynatrace host entity ID."
          call: dynatrace.get-host
          with:
            host_id: "{{host_id}}"
          outputParameters:
            - name: display_name
              type: string
              mapping: "$.displayName"
            - name: state
              type: string
              mapping: "$.availabilityState"
            - name: cpu_usage
              type: number
              mapping: "$.cpuUsagePercent"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://lowes.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: hosts
          path: "/entities/{{host_id}}"
          inputParameters:
            - name: host_id
              in: path
          operations:
            - name: get-host
              method: GET

Tracks an online order by looking up the order in BigCommerce, checking warehouse inventory in Oracle, and sending a fulfillment status update to the customer via Salesforce.

naftiko: "0.5"
info:
  label: "E-Commerce Order Fulfillment Tracker"
  description: "Tracks an online order by looking up the order in BigCommerce, checking warehouse inventory in Oracle, and sending a fulfillment status update to the customer via Salesforce."
  tags:
    - e-commerce
    - bigcommerce
    - oracle
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: ecommerce-ops
      port: 8080
      tools:
        - name: track-order-fulfillment
          description: "Given an order number, look up BigCommerce order details, check Oracle warehouse stock, and update the Salesforce case with fulfillment status."
          inputParameters:
            - name: order_number
              type: string
              description: "BigCommerce order number."
            - name: case_id
              type: string
              description: "Salesforce case ID for customer inquiry."
          steps:
            - name: get-order
              type: call
              call: bigcommerce.get-order
              with:
                order_number: "{{order_number}}"
            - name: check-stock
              type: call
              call: oracle.get-onhand
              with:
                item_number: "{{get-order.line_items[0].sku}}"
                org_code: "DC01"
            - name: update-case
              type: call
              call: salesforce.update-case
              with:
                case_id: "{{case_id}}"
                status: "In Progress"
                comment: "Order {{order_number}} stock confirmed: {{check-stock.on_hand}} units at DC01. Shipping initiated."
  consumes:
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: orders
          path: "/v2/orders/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: inventory
          path: "/inventoryBalances"
          operations:
            - name: get-onhand
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: update-case
              method: PATCH

Tunes e-commerce search relevance by pulling Adobe Analytics search data, analyzing click-through rates in Snowflake, and updating BigCommerce search weights.

naftiko: "0.5"
info:
  label: "E-Commerce Search Relevance Tuning"
  description: "Tunes e-commerce search relevance by pulling Adobe Analytics search data, analyzing click-through rates in Snowflake, and updating BigCommerce search weights."
  tags:
    - e-commerce
    - adobe-analytics
    - snowflake
    - bigcommerce
capability:
  exposes:
    - type: mcp
      namespace: ecommerce-ops
      port: 8080
      tools:
        - name: tune-search-relevance
          description: "Given a search term, pull Adobe Analytics CTR data, analyze Snowflake conversion funnel, and update BigCommerce search weights."
          inputParameters:
            - name: search_term
              type: string
              description: "Search term to optimize."
          steps:
            - name: get-search-analytics
              type: call
              call: adobe.get-report
              with:
                search_term: "{{search_term}}"
                metric: "click_through_rate"
            - name: analyze-funnel
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT result_position, click_count, conversion_count FROM SEARCH_FUNNEL WHERE term='{{search_term}}' AND date > DATEADD(day, -30, CURRENT_DATE())"
            - name: update-weights
              type: call
              call: bigcommerce.update-search-config
              with:
                term: "{{search_term}}"
                boost_skus: "{{analyze-funnel.results}}"
  consumes:
    - type: http
      namespace: adobe
      baseUri: "https://analytics.adobe.io/api/lowes"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/reports"
          operations:
            - name: get-report
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: search-config
          path: "/v3/catalog/search"
          operations:
            - name: update-search-config
              method: PUT

Prepares performance review packages by pulling Workday employee data, Snowflake sales metrics, and creating a Confluence review page for the manager.

naftiko: "0.5"
info:
  label: "Employee Performance Review Pipeline"
  description: "Prepares performance review packages by pulling Workday employee data, Snowflake sales metrics, and creating a Confluence review page for the manager."
  tags:
    - hr
    - workday
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: prepare-performance-review
          description: "Given a worker ID and review period, pull Workday profile, Snowflake sales performance data, and create a Confluence review page."
          inputParameters:
            - name: worker_id
              type: string
              description: "Workday worker ID."
            - name: review_period
              type: string
              description: "Review period (e.g., 2025-H2)."
          steps:
            - name: get-employee
              type: call
              call: workday.get-worker-profile
              with:
                worker_id: "{{worker_id}}"
            - name: get-performance
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT total_sales, customer_satisfaction, tasks_completed FROM ASSOCIATE_PERFORMANCE WHERE worker_id='{{worker_id}}' AND period='{{review_period}}'"
            - name: create-review-page
              type: call
              call: confluence.create-page
              with:
                space: "HR_REVIEWS"
                title: "Performance Review: {{get-employee.full_name}} — {{review_period}}"
                body: "Sales: {{get-performance.results[0].total_sales}}, CSAT: {{get-performance.results[0].customer_satisfaction}}"
  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: "/lowes/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker-profile
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://lowes.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

Processes time-off requests by verifying Workday balances, checking staffing coverage in Snowflake, and notifying the manager via Teams.

naftiko: "0.5"
info:
  label: "Employee Time-Off Approval Pipeline"
  description: "Processes time-off requests by verifying Workday balances, checking staffing coverage in Snowflake, and notifying the manager via Teams."
  tags:
    - hr
    - workday
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-ops
      port: 8080
      tools:
        - name: process-time-off-request
          description: "Given a worker ID and requested dates, verify Workday PTO balance, check Snowflake staffing coverage, and notify the manager."
          inputParameters:
            - name: worker_id
              type: string
              description: "Workday worker ID."
            - name: start_date
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: check-balance
              type: call
              call: workday.get-time-off-balance
              with:
                worker_id: "{{worker_id}}"
            - name: check-coverage
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT scheduled_count, minimum_required FROM STAFFING_COVERAGE WHERE store=(SELECT store FROM ASSOCIATES WHERE worker_id='{{worker_id}}') AND date BETWEEN '{{start_date}}' AND '{{end_date}}'"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                channel_id: "{{check-balance.manager_channel}}"
                text: "Time-off request: {{check-balance.employee_name}} ({{start_date}} to {{end_date}}). PTO balance: {{check-balance.remaining_hours}}h. Coverage: {{check-coverage.results[0].scheduled_count}}/{{check-coverage.results[0].minimum_required}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off
          path: "/lowes/workers/{{worker_id}}/timeOffBalance"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-time-off-balance
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Monitors store energy consumption by pulling utility data from Snowflake, comparing against targets in SAP, and creating ServiceNow alerts for anomalies.

naftiko: "0.5"
info:
  label: "Energy Management Monitoring Pipeline"
  description: "Monitors store energy consumption by pulling utility data from Snowflake, comparing against targets in SAP, and creating ServiceNow alerts for anomalies."
  tags:
    - store-ops
    - snowflake
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: facilities
      port: 8080
      tools:
        - name: monitor-energy-consumption
          description: "Given a store number and date, pull Snowflake energy data, compare SAP targets, and create ServiceNow alerts for overages."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
            - name: date
              type: string
              description: "Date in YYYY-MM-DD format."
          steps:
            - name: get-usage
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT kwh_consumed, cost, peak_demand FROM ENERGY_USAGE WHERE store='{{store_number}}' AND date='{{date}}'"
            - name: get-target
              type: call
              call: sap.get-cost-center
              with:
                plant: "{{store_number}}"
                account: "energy_budget"
            - name: create-alert
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Energy anomaly: Store {{store_number}} — {{date}}"
                category: "facilities"
                assignment_group: "Energy_Management"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://lowes-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"
          operations:
            - name: get-cost-center
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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

Detects potential gift card fraud by analyzing transaction patterns in Splunk, creating a ServiceNow investigation case, and freezing the card via the payment gateway.

naftiko: "0.5"
info:
  label: "Gift Card Fraud Detection Workflow"
  description: "Detects potential gift card fraud by analyzing transaction patterns in Splunk, creating a ServiceNow investigation case, and freezing the card via the payment gateway."
  tags:
    - security
    - splunk
    - servicenow
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: fraud-ops
      port: 8080
      tools:
        - name: investigate-gift-card-fraud
          description: "Given a gift card number, pull Splunk transaction patterns, create a ServiceNow fraud case, and freeze the card."
          inputParameters:
            - name: card_number
              type: string
              description: "Gift card number (masked)."
            - name: store_number
              type: string
              description: "Store where suspicious activity detected."
          steps:
            - name: analyze-transactions
              type: call
              call: splunk.run-search
              with:
                query: "index=pos gift_card={{card_number}} | stats count by transaction_type, amount"
                time_range: "-7d"
            - name: create-case
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Gift card fraud alert: {{card_number}} — Store {{store_number}}"
                category: "fraud"
                priority: "1"
                assignment_group: "Loss_Prevention"
            - name: freeze-card
              type: call
              call: salesforce.update-gift-card
              with:
                card_id: "{{card_number}}"
                status: "frozen"
                reason: "Fraud investigation: {{create-case.number}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://lowes-splunk.splunkcloud.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: searches
          path: "/search/jobs"
          operations:
            - name: run-search
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: gift-cards
          path: "/sobjects/GiftCard__c/{{card_id}}"
          inputParameters:
            - name: card_id
              in: path
          operations:
            - name: update-gift-card
              method: PATCH

When a GitHub release is tagged, generates release notes with Anthropic Claude and posts them to Confluence and the engineering Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Release Notes Publisher"
  description: "When a GitHub release is tagged, generates release notes with Anthropic Claude and posts them to Confluence and the engineering Teams channel."
  tags:
    - devops
    - github
    - anthropic
    - confluence
    - release-management
capability:
  exposes:
    - type: mcp
      namespace: release-ops
      port: 8080
      tools:
        - name: publish-release-notes
          description: "Given a GitHub repository and release tag, retrieve the release body, generate polished release notes with Anthropic Claude, publish to Confluence, and announce in the engineering Teams channel."
          inputParameters:
            - name: repo_owner
              type: string
              description: "GitHub organization or owner name."
            - name: repo_name
              type: string
              description: "GitHub repository name."
            - name: tag
              type: string
              description: "Release tag name (e.g., v2.1.0)."
            - name: teams_channel_id
              type: string
              description: "Teams channel ID for engineering announcements."
          steps:
            - name: get-release
              type: call
              call: github.get-release
              with:
                owner: "{{repo_owner}}"
                repo: "{{repo_name}}"
                tag: "{{tag}}"
            - name: generate-notes
              type: call
              call: anthropic.create-message
              with:
                model: "claude-3-5-sonnet-20241022"
                prompt: "Write professional release notes for an internal engineering audience based on: {{get-release.body}}"
            - name: publish-confluence
              type: call
              call: confluence.create-page
              with:
                space_key: "ENG"
                title: "Release {{tag}} — {{repo_name}}"
                content: "{{generate-notes.content}}"
            - name: announce-teams
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Release {{tag}} published for {{repo_name}}. Confluence: {{publish-confluence.url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: releases
          path: "/repos/{{owner}}/{{repo}}/releases/tags/{{tag}}"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release
              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: confluence
      baseUri: "https://lowes.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              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/engineering/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves branch protection rules for a GitHub repository, returning required reviews and status checks.

naftiko: "0.5"
info:
  label: "GitHub Repository Branch Protection"
  description: "Retrieves branch protection rules for a GitHub repository, returning required reviews and status checks."
  tags:
    - devops
    - github
    - security
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-branch-protection
          description: "Look up GitHub branch protection rules for a repository and branch. Returns required review count and status check requirements."
          inputParameters:
            - name: repo_name
              type: string
              description: "GitHub repository name (org/repo format)."
            - name: branch
              type: string
              description: "Branch name (e.g., main)."
          call: github.get-protection
          with:
            repo_name: "{{repo_name}}"
            branch: "{{branch}}"
          outputParameters:
            - name: required_reviews
              type: integer
              mapping: "$.required_pull_request_reviews.required_approving_review_count"
            - name: enforce_admins
              type: boolean
              mapping: "$.enforce_admins.enabled"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/{{repo_name}}/branches/{{branch}}/protection"
          inputParameters:
            - name: repo_name
              in: path
            - name: branch
              in: path
          operations:
            - name: get-protection
              method: GET

Retrieves critical Dependabot alerts from GitHub for all production repositories and creates Jira security issues for each critical finding.

naftiko: "0.5"
info:
  label: "GitHub Security Vulnerability Scan"
  description: "Retrieves critical Dependabot alerts from GitHub for all production repositories and creates Jira security issues for each critical finding."
  tags:
    - security
    - devops
    - github
    - jira
    - vulnerability-management
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: scan-repo-vulnerabilities
          description: "Given a GitHub repository owner and name, retrieve all critical Dependabot alerts and create a Jira security issue for each. Use during weekly security scanning cycles."
          inputParameters:
            - name: repo_owner
              type: string
              description: "GitHub organization or owner name."
            - name: repo_name
              type: string
              description: "GitHub repository name."
          steps:
            - name: get-alerts
              type: call
              call: github.list-dependabot-alerts
              with:
                owner: "{{repo_owner}}"
                repo: "{{repo_name}}"
                severity: "critical"
            - name: create-security-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Critical vulnerabilities: {{repo_owner}}/{{repo_name}}"
                description: "{{get-alerts.count}} critical Dependabot alerts found. Repo: https://github.com/{{repo_owner}}/{{repo_name}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alerts
          path: "/repos/{{owner}}/{{repo}}/dependabot/alerts"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
            - name: severity
              in: query
          operations:
            - name: list-dependabot-alerts
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lowes.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

Fetches web traffic metrics from Google Analytics for the Lowes.com storefront by date range.

naftiko: "0.5"
info:
  label: "Google Analytics Store Traffic"
  description: "Fetches web traffic metrics from Google Analytics for the Lowes.com storefront by date range."
  tags:
    - analytics
    - google-analytics
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-store-traffic
          description: "Retrieve Google Analytics traffic metrics for lowes.com. Returns sessions, page views, and bounce rate for the specified period."
          inputParameters:
            - name: start_date
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              type: string
              description: "End date in YYYY-MM-DD format."
          call: ga.get-report
          with:
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: sessions
              type: integer
              mapping: "$.reports[0].data.totals[0].values[0]"
            - name: pageviews
              type: integer
              mapping: "$.reports[0].data.totals[0].values[1]"
            - name: bounce_rate
              type: number
              mapping: "$.reports[0].data.totals[0].values[2]"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/lowes:runReport"
          operations:
            - name: get-report
              method: POST

Looks up a HubSpot contact by email address, returning contact properties and lifecycle stage.

naftiko: "0.5"
info:
  label: "HubSpot Contact Lookup"
  description: "Looks up a HubSpot contact by email address, returning contact properties and lifecycle stage."
  tags:
    - marketing
    - hubspot
    - crm
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-contact
          description: "Look up a HubSpot contact by email. Returns name, lifecycle stage, and last activity date."
          inputParameters:
            - name: email
              type: string
              description: "Contact email address."
          call: hubspot.get-contact
          with:
            email: "{{email}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.properties.firstname"
            - name: lifecycle_stage
              type: string
              mapping: "$.properties.lifecyclestage"
            - name: last_activity
              type: string
              mapping: "$.properties.lastactivitydate"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com/crm/v3"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/objects/contacts/{{email}}?idProperty=email"
          inputParameters:
            - name: email
              in: path
          operations:
            - name: get-contact
              method: GET

Handles infrastructure scaling alerts by checking Datadog metrics, triggering Azure auto-scaling, and logging the event in ServiceNow.

naftiko: "0.5"
info:
  label: "Infrastructure Scaling Alert Handler"
  description: "Handles infrastructure scaling alerts by checking Datadog metrics, triggering Azure auto-scaling, and logging the event in ServiceNow."
  tags:
    - infrastructure
    - datadog
    - microsoft-azure
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: platform-ops
      port: 8080
      tools:
        - name: handle-scaling-alert
          description: "Given a Datadog alert ID, check metrics, trigger Azure scale-out, and log the scaling event in ServiceNow."
          inputParameters:
            - name: alert_id
              type: string
              description: "Datadog alert ID."
            - name: resource_group
              type: string
              description: "Azure resource group name."
          steps:
            - name: get-metrics
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "{{alert_id}}"
            - name: scale-resources
              type: call
              call: azure.scale-vmss
              with:
                resource_group: "{{resource_group}}"
                target_capacity: "{{get-metrics.recommended_capacity}}"
            - name: log-event
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Auto-scale triggered: {{resource_group}} — capacity {{scale-resources.new_capacity}}"
                category: "infrastructure"
                assignment_group: "Cloud_Platform"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com/subscriptions/{{subscription_id}}"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: vmss
          path: "/resourceGroups/{{resource_group}}/providers/Microsoft.Compute/virtualMachineScaleSets"
          operations:
            - name: scale-vmss
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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

Manages installation service appointments by looking up the customer order in Salesforce, checking contractor availability in Workday, and confirming the appointment via HubSpot email.

naftiko: "0.5"
info:
  label: "Installation Services Scheduling Pipeline"
  description: "Manages installation service appointments by looking up the customer order in Salesforce, checking contractor availability in Workday, and confirming the appointment via HubSpot email."
  tags:
    - e-commerce
    - salesforce
    - workday
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: install-services
      port: 8080
      tools:
        - name: schedule-installation
          description: "Given an order ID and preferred date, look up the Salesforce order, find available Workday contractors, and send HubSpot confirmation email."
          inputParameters:
            - name: order_id
              type: string
              description: "Salesforce order ID."
            - name: preferred_date
              type: string
              description: "Preferred installation date in YYYY-MM-DD format."
            - name: service_type
              type: string
              description: "Installation service type (flooring, appliance, roofing, fencing)."
          steps:
            - name: get-order
              type: call
              call: salesforce.get-order
              with:
                order_id: "{{order_id}}"
            - name: find-contractor
              type: call
              call: workday.find-available-worker
              with:
                skill: "{{service_type}}"
                date: "{{preferred_date}}"
                region: "{{get-order.shipping_region}}"
            - name: send-confirmation
              type: call
              call: hubspot.send-email
              with:
                to: "{{get-order.customer_email}}"
                template_id: "installation-confirmation"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Order/{{order_id}}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET
    - 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: "/lowes/workers"
          operations:
            - name: find-available-worker
              method: GET
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: emails
          path: "/marketing/v3/transactional/single-email/send"
          operations:
            - name: send-email
              method: POST

Optimizes inventory reorder points by analyzing Snowflake demand patterns, updating SAP safety stock levels, and creating Oracle replenishment orders.

naftiko: "0.5"
info:
  label: "Inventory Reorder Point Optimization"
  description: "Optimizes inventory reorder points by analyzing Snowflake demand patterns, updating SAP safety stock levels, and creating Oracle replenishment orders."
  tags:
    - inventory
    - snowflake
    - sap
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: inventory-ops
      port: 8080
      tools:
        - name: optimize-reorder-points
          description: "Given a product category, analyze Snowflake demand, update SAP safety stock, and trigger Oracle replenishment."
          inputParameters:
            - name: category_code
              type: string
              description: "Product category code."
            - name: service_level
              type: number
              description: "Target service level (e.g., 0.95)."
          steps:
            - name: analyze-demand
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT sku, avg_daily_demand, demand_std_dev FROM DEMAND_ANALYSIS WHERE category='{{category_code}}'"
            - name: update-safety-stock
              type: call
              call: sap.update-mrp
              with:
                category: "{{category_code}}"
                service_level: "{{service_level}}"
                demand_data: "{{analyze-demand.results}}"
            - name: create-replenishment
              type: call
              call: oracle.create-replenishment
              with:
                category: "{{category_code}}"
                items: "{{analyze-demand.results}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV_01"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: mrp
          path: "/A_MRPMaterial"
          operations:
            - name: update-mrp
              method: PATCH
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: replenishment
          path: "/replenishmentOrders"
          operations:
            - name: create-replenishment
              method: POST

Manages IT asset lifecycle by tracking assets in ServiceNow, verifying warranty status in Oracle, and scheduling replacement procurement in SAP.

naftiko: "0.5"
info:
  label: "IT Asset Lifecycle Management"
  description: "Manages IT asset lifecycle by tracking assets in ServiceNow, verifying warranty status in Oracle, and scheduling replacement procurement in SAP."
  tags:
    - infrastructure
    - servicenow
    - oracle
    - sap
capability:
  exposes:
    - type: mcp
      namespace: it-ops
      port: 8080
      tools:
        - name: manage-asset-lifecycle
          description: "Given an asset tag, check ServiceNow asset record, verify Oracle warranty, and create SAP procurement request if replacement needed."
          inputParameters:
            - name: asset_tag
              type: string
              description: "IT asset tag identifier."
            - name: store_number
              type: string
              description: "Store where asset is located."
          steps:
            - name: get-asset
              type: call
              call: servicenow.get-asset
              with:
                asset_tag: "{{asset_tag}}"
            - name: check-warranty
              type: call
              call: oracle.get-warranty
              with:
                serial_number: "{{get-asset.serial_number}}"
            - name: create-requisition
              type: call
              call: sap.create-requisition
              with:
                material: "{{get-asset.model_category}}"
                plant: "{{store_number}}"
                justification: "Warranty expires {{check-warranty.expiry_date}} for {{get-asset.display_name}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: assets
          path: "/table/alm_asset?sysparm_query=asset_tag={{asset_tag}}"
          inputParameters:
            - name: asset_tag
              in: query
          operations:
            - name: get-asset
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: warranties
          path: "/warranties"
          operations:
            - name: get-warranty
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PURCHASEREQ_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: requisitions
          path: "/A_PurchaseRequisitionHeader"
          operations:
            - name: create-requisition
              method: POST

Fetches completed Jira sprint issues and story points and posts a velocity digest to the engineering Teams channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Summary"
  description: "Fetches completed Jira sprint issues and story points and posts a velocity digest to the engineering Teams channel."
  tags:
    - devops
    - project-management
    - jira
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: agile-reporting
      port: 8080
      tools:
        - name: digest-sprint-velocity
          description: "Given a Jira board ID and sprint ID, fetch completed issues and total story points, then post a velocity summary to the engineering Teams channel."
          inputParameters:
            - name: board_id
              type: string
              description: "Jira board ID."
            - name: sprint_id
              type: string
              description: "Jira sprint ID to summarize."
            - name: teams_channel_id
              type: string
              description: "Teams channel ID for the engineering team."
          steps:
            - name: get-sprint-issues
              type: call
              call: jira.get-sprint-issues
              with:
                boardId: "{{board_id}}"
                sprintId: "{{sprint_id}}"
            - name: post-digest
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Sprint {{sprint_id}} closed — {{get-sprint-issues.totalPoints}} story points delivered across {{get-sprint-issues.issueCount}} issues."
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://lowes.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/engineering/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When a new Pro customer enrolls in the loyalty program via Salesforce, provisions their rewards account, syncs to Snowflake analytics, and sends a welcome email via HubSpot.

naftiko: "0.5"
info:
  label: "Loyalty Pro Rewards Enrollment Pipeline"
  description: "When a new Pro customer enrolls in the loyalty program via Salesforce, provisions their rewards account, syncs to Snowflake analytics, and sends a welcome email via HubSpot."
  tags:
    - loyalty
    - salesforce
    - snowflake
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: loyalty-ops
      port: 8080
      tools:
        - name: enroll-pro-rewards
          description: "Given a Salesforce contact ID, create the Pro rewards profile, sync enrollment data to Snowflake, and trigger a HubSpot welcome email."
          inputParameters:
            - name: contact_id
              type: string
              description: "Salesforce contact ID for the Pro customer."
            - name: rewards_tier
              type: string
              description: "Initial rewards tier (silver, gold, platinum)."
          steps:
            - name: get-contact
              type: call
              call: salesforce.get-contact
              with:
                contact_id: "{{contact_id}}"
            - name: sync-enrollment
              type: call
              call: snowflake.run-query
              with:
                statement: "INSERT INTO PRO_REWARDS_ENROLLMENTS VALUES ('{{contact_id}}', '{{get-contact.email}}', '{{rewards_tier}}', CURRENT_TIMESTAMP())"
            - name: send-welcome
              type: call
              call: hubspot.send-email
              with:
                to: "{{get-contact.email}}"
                template_id: "pro-rewards-welcome"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: emails
          path: "/marketing/v3/transactional/single-email/send"
          operations:
            - name: send-email
              method: POST

Automates seasonal markdown pricing by analyzing sell-through rates in Snowflake, updating product prices in BigCommerce, and logging the price changes in SAP.

naftiko: "0.5"
info:
  label: "Markdown Clearance Automation"
  description: "Automates seasonal markdown pricing by analyzing sell-through rates in Snowflake, updating product prices in BigCommerce, and logging the price changes in SAP."
  tags:
    - e-commerce
    - snowflake
    - bigcommerce
    - sap
capability:
  exposes:
    - type: mcp
      namespace: pricing-ops
      port: 8080
      tools:
        - name: run-markdown-clearance
          description: "Given a product category and target sell-through rate, analyze Snowflake inventory velocity, compute markdowns, update BigCommerce prices, and log in SAP."
          inputParameters:
            - name: category_code
              type: string
              description: "Product category for markdown."
            - name: target_sell_through
              type: number
              description: "Target sell-through percentage (e.g., 0.85)."
          steps:
            - name: analyze-velocity
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT sku, current_price, weeks_of_supply, sell_through_rate FROM INVENTORY_VELOCITY WHERE category='{{category_code}}' AND sell_through_rate < {{target_sell_through}}"
            - name: update-prices
              type: call
              call: bigcommerce.batch-update-prices
              with:
                items: "{{analyze-velocity.results}}"
                markdown_pct: "25"
            - name: log-changes
              type: call
              call: sap.post-price-change
              with:
                category: "{{category_code}}"
                changes: "{{update-prices.updated_items}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: products
          path: "/v3/catalog/products"
          operations:
            - name: batch-update-prices
              method: PUT
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_SLSPRICINGCONDITIONRECORD_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: conditions
          path: "/A_SlsPrcgCndnRecdValidity"
          operations:
            - name: post-price-change
              method: POST

When a new associate is created in Workday, opens a ServiceNow onboarding ticket, provisions an Active Directory account via Microsoft Graph, and sends a Teams welcome message.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "When a new associate is created in Workday, opens a ServiceNow onboarding ticket, provisions an Active Directory account via Microsoft Graph, and sends a Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and store number, orchestrate the full onboarding sequence: create a ServiceNow IT ticket, provision a Microsoft 365 account, and send a Teams welcome to the new associate."
          inputParameters:
            - name: employee_id
              type: string
              description: "Workday worker ID for the new associate."
            - name: store_number
              type: string
              description: "Lowe's store number the associate is assigned to."
            - name: start_date
              type: string
              description: "Employment start date in YYYY-MM-DD format."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: create-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "New associate onboarding: {{get-worker.full_name}} — Store {{store_number}}"
                category: "hr_onboarding"
                assignment_group: "Store_IT"
            - name: provision-account
              type: call
              call: msgraph.create-user
              with:
                displayName: "{{get-worker.full_name}}"
                mail: "{{get-worker.work_email}}"
                officeLocation: "Store {{store_number}}"
            - name: send-welcome
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Lowe's, {{get-worker.first_name}}! Your onboarding ticket is {{create-ticket.number}}. Start date: {{start_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: "/lowes/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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: msgraph
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      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: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Manages new product introductions by creating the material master in SAP, publishing the product listing on BigCommerce, and notifying merchandising via Teams.

naftiko: "0.5"
info:
  label: "New Product Introduction Workflow"
  description: "Manages new product introductions by creating the material master in SAP, publishing the product listing on BigCommerce, and notifying merchandising via Teams."
  tags:
    - inventory
    - sap
    - bigcommerce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: merchandising
      port: 8080
      tools:
        - name: introduce-new-product
          description: "Given product details, create SAP material master, publish BigCommerce listing, and notify the merchandising team."
          inputParameters:
            - name: product_name
              type: string
              description: "New product name."
            - name: category_code
              type: string
              description: "Product category code."
            - name: price
              type: number
              description: "Retail price in USD."
          steps:
            - name: create-material
              type: call
              call: sap.create-material
              with:
                description: "{{product_name}}"
                category: "{{category_code}}"
            - name: create-listing
              type: call
              call: bigcommerce.create-product
              with:
                name: "{{product_name}}"
                sku: "{{create-material.material_number}}"
                price: "{{price}}"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "merchandising-new-products"
                text: "New product launched: {{product_name}} (SKU: {{create-material.material_number}}) at ${{price}}. BigCommerce listing: {{create-listing.url}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product"
          operations:
            - name: create-material
              method: POST
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: products
          path: "/v3/catalog/products"
          operations:
            - name: create-product
              method: POST
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Fetches the current error rate for a New Relic application by app ID, returning error percentage and throughput.

naftiko: "0.5"
info:
  label: "New Relic Application Error Rate"
  description: "Fetches the current error rate for a New Relic application by app ID, returning error percentage and throughput."
  tags:
    - monitoring
    - new-relic
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-app-error-rate
          description: "Retrieve the current error rate for a New Relic application. Returns error percentage and requests per minute."
          inputParameters:
            - name: app_id
              type: string
              description: "New Relic application ID."
          call: newrelic.get-app-metrics
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: error_rate
              type: number
              mapping: "$.application.error_rate"
            - name: throughput
              type: number
              mapping: "$.application.throughput"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: bearer
        token: "$secrets.newrelic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-metrics
              method: GET

When a ServiceNow access request is approved, provisions the user's Okta group membership and updates the ticket to resolved.

naftiko: "0.5"
info:
  label: "Okta Access Request Fulfillment"
  description: "When a ServiceNow access request is approved, provisions the user's Okta group membership and updates the ticket to resolved."
  tags:
    - identity
    - security
    - okta
    - servicenow
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: fulfill-access-request
          description: "Given an approved ServiceNow access request ticket, assign the user to the appropriate Okta group and mark the ticket resolved. Sends a confirmation via Teams."
          inputParameters:
            - name: snow_ticket_id
              type: string
              description: "ServiceNow access request sys_id."
            - name: user_email
              type: string
              description: "User email address to provision access for."
            - name: okta_group_id
              type: string
              description: "Okta group ID to assign the user to."
          steps:
            - name: add-to-group
              type: call
              call: okta.add-user-to-group
              with:
                groupId: "{{okta_group_id}}"
                userId: "{{user_email}}"
            - name: resolve-ticket
              type: call
              call: servicenow.update-request
              with:
                sys_id: "{{snow_ticket_id}}"
                state: "3"
                close_notes: "Access provisioned to Okta group {{okta_group_id}}"
            - name: confirm-user
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{user_email}}"
                text: "Your access request has been fulfilled. You have been added to the requested system (group: {{okta_group_id}})."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://lowes.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{groupId}}/users/{{userId}}"
          inputParameters:
            - name: groupId
              in: path
            - name: userId
              in: path
          operations:
            - name: add-user-to-group
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request/{{sys_id}}"
          inputParameters:
            - name: sys_id
              in: path
          operations:
            - name: update-request
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Builds a customer 360 view by pulling Salesforce account data, BigCommerce order history, and Google Analytics engagement metrics into a unified Snowflake profile.

naftiko: "0.5"
info:
  label: "Omnichannel Customer 360 Pipeline"
  description: "Builds a customer 360 view by pulling Salesforce account data, BigCommerce order history, and Google Analytics engagement metrics into a unified Snowflake profile."
  tags:
    - e-commerce
    - salesforce
    - bigcommerce
    - google-analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: customer-analytics
      port: 8080
      tools:
        - name: build-customer-360
          description: "Given a customer email, pull Salesforce profile, BigCommerce order history, Google Analytics behavior, and merge into Snowflake."
          inputParameters:
            - name: customer_email
              type: string
              description: "Customer email address."
          steps:
            - name: get-sf-profile
              type: call
              call: salesforce.get-contact-by-email
              with:
                email: "{{customer_email}}"
            - name: get-orders
              type: call
              call: bigcommerce.get-customer-orders
              with:
                email: "{{customer_email}}"
            - name: get-behavior
              type: call
              call: ga.get-user-report
              with:
                user_id: "{{customer_email}}"
            - name: merge-profile
              type: call
              call: snowflake.run-query
              with:
                statement: "MERGE INTO CUSTOMER_360 USING (SELECT '{{customer_email}}' as email, '{{get-sf-profile.account_id}}' as sf_id, {{get-orders.total_orders}} as order_count, {{get-behavior.sessions}} as web_sessions)"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/parameterizedSearch/?q={{email}}&sobject=Contact"
          operations:
            - name: get-contact-by-email
              method: GET
    - type: http
      namespace: bigcommerce
      baseUri: "https://api.bigcommerce.com/stores/lowes"
      authentication:
        type: bearer
        token: "$secrets.bigcommerce_token"
      resources:
        - name: customers
          path: "/v3/customers/orders"
          operations:
            - name: get-customer-orders
              method: GET
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/lowes:runReport"
          operations:
            - name: get-user-report
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Queries Oracle EBS for current inventory balance by item number and organization, returning on-hand and reserved quantities.

naftiko: "0.5"
info:
  label: "Oracle Inventory Balance Query"
  description: "Queries Oracle EBS for current inventory balance by item number and organization, returning on-hand and reserved quantities."
  tags:
    - inventory
    - oracle
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: inventory
      port: 8080
      tools:
        - name: get-inventory-balance
          description: "Query Oracle EBS inventory balance by item and org. Returns on-hand quantity, reserved quantity, and available-to-promise."
          inputParameters:
            - name: item_number
              type: string
              description: "Oracle item number."
            - name: org_code
              type: string
              description: "Inventory organization code."
          call: oracle.get-onhand
          with:
            item_number: "{{item_number}}"
            org_code: "{{org_code}}"
          outputParameters:
            - name: on_hand
              type: number
              mapping: "$.items[0].onHandQuantity"
            - name: reserved
              type: number
              mapping: "$.items[0].reservedQuantity"
            - name: atp
              type: number
              mapping: "$.items[0].availableToPromise"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: inventory
          path: "/inventoryBalances?q=ItemNumber={{item_number}};OrganizationCode={{org_code}}"
          inputParameters:
            - name: item_number
              in: query
            - name: org_code
              in: query
          operations:
            - name: get-onhand
              method: GET

Looks up a firewall security rule in Palo Alto Networks Panorama by rule name, returning action, source, and destination zones.

naftiko: "0.5"
info:
  label: "Palo Alto Firewall Rule Lookup"
  description: "Looks up a firewall security rule in Palo Alto Networks Panorama by rule name, returning action, source, and destination zones."
  tags:
    - security
    - palo-alto
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: get-firewall-rule
          description: "Look up a Palo Alto firewall rule by name. Returns action, source zone, destination zone, and application filters."
          inputParameters:
            - name: rule_name
              type: string
              description: "Firewall security rule name."
          call: paloalto.get-rule
          with:
            rule_name: "{{rule_name}}"
          outputParameters:
            - name: action
              type: string
              mapping: "$.result.entry.action"
            - name: source_zone
              type: array
              mapping: "$.result.entry.from.member"
            - name: destination_zone
              type: array
              mapping: "$.result.entry.to.member"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://lowes-panorama.paloaltonetworks.com/restapi/v10.2"
      authentication:
        type: bearer
        token: "$secrets.paloalto_api_key"
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules?name={{rule_name}}"
          inputParameters:
            - name: rule_name
              in: query
          operations:
            - name: get-rule
              method: GET

Retrieves headcount by department and cost center from Workday for payroll planning and workforce analytics.

naftiko: "0.5"
info:
  label: "Payroll Headcount Snapshot"
  description: "Retrieves headcount by department and cost center from Workday for payroll planning and workforce analytics."
  tags:
    - hr
    - finance
    - payroll
    - workday
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: hr-finance
      port: 8080
      tools:
        - name: get-headcount-by-department
          description: "Returns active employees grouped by department and cost center. Use for workforce planning, payroll cost analysis, and headcount reporting."
          call: workday.headcount-export
          outputParameters:
            - name: employees
              type: array
              mapping: "$.data"
              items:
                - name: employee_id
                  type: string
                  mapping: "$.id"
                - name: full_name
                  type: string
                  mapping: "$.fullName"
                - 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-export
          path: "/lowes/workers"
          operations:
            - name: headcount-export
              method: GET

Triggers a Power BI dataset refresh for the retail sales dashboard and notifies the merchandising team 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 merchandising team when complete."
  tags:
    - data
    - analytics
    - power-bi
    - reporting
    - retail
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: refresh-retail-dashboard
          description: "Trigger a Power BI dataset refresh for the retail sales dashboard workspace and dataset, then notify the merchandising Teams channel on completion."
          inputParameters:
            - name: workspace_id
              type: string
              description: "Power BI workspace ID containing the retail dashboard."
            - name: dataset_id
              type: string
              description: "Power BI dataset ID for the retail sales dataset."
            - name: teams_channel_id
              type: string
              description: "Merchandising Teams channel ID for completion notification."
          steps:
            - name: trigger-refresh
              type: call
              call: powerbi.trigger-refresh
              with:
                workspaceId: "{{workspace_id}}"
                datasetId: "{{dataset_id}}"
            - name: notify-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Retail sales dashboard refresh triggered for dataset {{dataset_id}}. Latest data will be available shortly."
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-refreshes
          path: "/groups/{{workspaceId}}/datasets/{{datasetId}}/refreshes"
          inputParameters:
            - name: workspaceId
              in: path
            - name: datasetId
              in: path
          operations:
            - name: trigger-refresh
              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/merchandising/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Generates Pro account spend analysis by pulling Salesforce account data, Snowflake purchase history, and delivering the report via HubSpot email.

naftiko: "0.5"
info:
  label: "Pro Account Spend Analysis"
  description: "Generates Pro account spend analysis by pulling Salesforce account data, Snowflake purchase history, and delivering the report via HubSpot email."
  tags:
    - loyalty
    - salesforce
    - snowflake
    - hubspot
capability:
  exposes:
    - type: mcp
      namespace: pro-services
      port: 8080
      tools:
        - name: generate-spend-analysis
          description: "Given a Pro account ID and period, pull Salesforce account, Snowflake spending data, and email the report via HubSpot."
          inputParameters:
            - name: account_id
              type: string
              description: "Salesforce Pro account ID."
            - name: period
              type: string
              description: "Analysis period (e.g., 2026-Q1)."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: get-spending
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT category, total_spend, order_count FROM PRO_SPEND WHERE account_id='{{account_id}}' AND period='{{period}}'"
            - name: send-report
              type: call
              call: hubspot.send-email
              with:
                to: "{{get-account.email}}"
                template_id: "pro-spend-report"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: emails
          path: "/marketing/v3/transactional/single-email/send"
          operations:
            - name: send-email
              method: POST

Processes a Pro customer credit application by verifying identity in Salesforce, running a credit check, and provisioning the account in SAP with the approved credit limit.

naftiko: "0.5"
info:
  label: "Pro Customer Credit Application Workflow"
  description: "Processes a Pro customer credit application by verifying identity in Salesforce, running a credit check, and provisioning the account in SAP with the approved credit limit."
  tags:
    - loyalty
    - salesforce
    - sap
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: pro-services
      port: 8080
      tools:
        - name: process-credit-application
          description: "Given a Salesforce account ID and requested credit limit, verify the customer, run credit evaluation, and provision SAP credit account."
          inputParameters:
            - name: account_id
              type: string
              description: "Salesforce account ID."
            - name: requested_limit
              type: number
              description: "Requested credit limit in USD."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: check-credit
              type: call
              call: sap.check-credit
              with:
                customer_name: "{{get-account.name}}"
                tax_id: "{{get-account.tax_id}}"
                requested_amount: "{{requested_limit}}"
            - name: update-salesforce
              type: call
              call: salesforce.update-account
              with:
                account_id: "{{account_id}}"
                credit_status: "{{check-credit.decision}}"
                approved_limit: "{{check-credit.approved_amount}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
            - name: update-account
              method: PATCH
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_CREDIT_MGMT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: credit-checks
          path: "/A_CreditManagement"
          operations:
            - name: check-credit
              method: POST

When a product recall is issued, identifies affected inventory in SAP, pulls impacted customer orders from Snowflake, and triggers recall notifications through Salesforce.

naftiko: "0.5"
info:
  label: "Product Recall Notification Pipeline"
  description: "When a product recall is issued, identifies affected inventory in SAP, pulls impacted customer orders from Snowflake, and triggers recall notifications through Salesforce."
  tags:
    - inventory
    - sap
    - snowflake
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: product-safety
      port: 8080
      tools:
        - name: process-product-recall
          description: "Given a material number and recall reason, identify SAP inventory, find affected Snowflake customer orders, and send Salesforce notifications."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number being recalled."
            - name: recall_reason
              type: string
              description: "Reason for the product recall."
          steps:
            - name: get-inventory
              type: call
              call: sap.get-material
              with:
                material_number: "{{material_number}}"
            - name: find-affected-orders
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT order_id, customer_email FROM ORDERS WHERE sku='{{material_number}}' AND ship_date > DATEADD(day, -90, CURRENT_DATE())"
            - name: send-notifications
              type: call
              call: salesforce.create-campaign
              with:
                name: "Recall: {{get-inventory.description}}"
                description: "{{recall_reason}}"
                affected_count: "{{find-affected-orders.row_count}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.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

Manages quarterly access recertification by pulling SailPoint identity entitlements, cross-referencing Workday active employees, and creating ServiceNow remediation tasks.

naftiko: "0.5"
info:
  label: "SailPoint Access Recertification Workflow"
  description: "Manages quarterly access recertification by pulling SailPoint identity entitlements, cross-referencing Workday active employees, and creating ServiceNow remediation tasks."
  tags:
    - security
    - sailpoint
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: identity-ops
      port: 8080
      tools:
        - name: run-access-recertification
          description: "Given a department, pull SailPoint entitlements, check Workday active status, and create ServiceNow tasks for orphaned access."
          inputParameters:
            - name: department
              type: string
              description: "Department to recertify."
          steps:
            - name: get-entitlements
              type: call
              call: sailpoint.get-department-access
              with:
                department: "{{department}}"
            - name: check-active-employees
              type: call
              call: workday.get-active-workers
              with:
                department: "{{department}}"
            - name: create-remediation
              type: call
              call: servicenow.create-task
              with:
                short_description: "Access recertification: {{department}} — orphaned accounts found"
                assignment_group: "Identity_Governance"
  consumes:
    - type: http
      namespace: sailpoint
      baseUri: "https://lowes.api.identitynow.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sailpoint_token"
      resources:
        - name: access
          path: "/search/entitlements"
          operations:
            - name: get-department-access
              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: workers
          path: "/lowes/workers"
          operations:
            - name: get-active-workers
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Retrieves current access entitlements for an identity in SailPoint IdentityNow by employee ID.

naftiko: "0.5"
info:
  label: "SailPoint Identity Access Review"
  description: "Retrieves current access entitlements for an identity in SailPoint IdentityNow by employee ID."
  tags:
    - security
    - sailpoint
    - identity
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: get-identity-access
          description: "Look up SailPoint identity entitlements by employee ID. Returns active roles, entitlements, and access profiles."
          inputParameters:
            - name: employee_id
              type: string
              description: "Employee ID to look up."
          call: sailpoint.get-identity
          with:
            employee_id: "{{employee_id}}"
          outputParameters:
            - name: display_name
              type: string
              mapping: "$.displayName"
            - name: roles
              type: array
              mapping: "$.roles"
            - name: entitlements
              type: array
              mapping: "$.entitlements"
  consumes:
    - type: http
      namespace: sailpoint
      baseUri: "https://lowes.api.identitynow.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sailpoint_token"
      resources:
        - name: identities
          path: "/search/identities?query=employeeNumber:{{employee_id}}"
          inputParameters:
            - name: employee_id
              in: query
          operations:
            - name: get-identity
              method: GET

When a new B2B customer account is created in Salesforce, creates the corresponding account in SAP S/4HANA and confirms via Teams.

naftiko: "0.5"
info:
  label: "Salesforce Customer Account Sync"
  description: "When a new B2B customer account is created in Salesforce, creates the corresponding account in SAP S/4HANA and confirms via Teams."
  tags:
    - crm
    - sales
    - salesforce
    - sap
capability:
  exposes:
    - type: mcp
      namespace: crm-ops
      port: 8080
      tools:
        - name: sync-new-account
          description: "Given a Salesforce account ID, retrieve account details and create the corresponding customer master record in SAP S/4HANA, then notify the sales team via Teams."
          inputParameters:
            - name: account_id
              type: string
              description: "Salesforce account record ID."
            - name: teams_channel_id
              type: string
              description: "Teams channel ID for the sales team notification."
          steps:
            - name: get-account
              type: call
              call: salesforce.get-account
              with:
                account_id: "{{account_id}}"
            - name: create-customer
              type: call
              call: sap.create-customer
              with:
                customerName: "{{get-account.Name}}"
                country: "{{get-account.BillingCountry}}"
                salesforceId: "{{account_id}}"
            - name: notify-sales
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "New B2B account synced: {{get-account.Name}} — SAP customer {{create-customer.customerId}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: customers
          path: "/A_Customer"
          operations:
            - name: create-customer
              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/sales/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Looks up a Salesforce lead by ID, returning current status, lead source, and assigned owner.

naftiko: "0.5"
info:
  label: "Salesforce Lead Status Lookup"
  description: "Looks up a Salesforce lead by ID, returning current status, lead source, and assigned owner."
  tags:
    - sales
    - salesforce
    - crm
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-lead-status
          description: "Look up a Salesforce lead record by lead ID. Returns status, source, and owner name."
          inputParameters:
            - name: lead_id
              type: string
              description: "Salesforce lead record ID."
          call: salesforce.get-lead
          with:
            lead_id: "{{lead_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.Status"
            - name: lead_source
              type: string
              mapping: "$.LeadSource"
            - name: owner_name
              type: string
              mapping: "$.Owner.Name"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET

Enriches new Salesforce pro contractor leads with company firmographic data from ZoomInfo and updates the lead record.

naftiko: "0.5"
info:
  label: "Salesforce Pro Contractor Lead Enrichment"
  description: "Enriches new Salesforce pro contractor leads with company firmographic data from ZoomInfo and updates the lead record."
  tags:
    - crm
    - sales
    - salesforce
    - zoominfo
    - lead-enrichment
capability:
  exposes:
    - type: mcp
      namespace: pro-sales
      port: 8080
      tools:
        - name: enrich-pro-lead
          description: "Given a Salesforce lead ID for a pro contractor account, fetch firmographic data from ZoomInfo and update the lead with employee count, revenue, and industry classification."
          inputParameters:
            - name: lead_id
              type: string
              description: "Salesforce lead record ID (18-character)."
          steps:
            - name: get-lead
              type: call
              call: salesforce.get-lead
              with:
                lead_id: "{{lead_id}}"
            - name: enrich-company
              type: call
              call: zoominfo.search-company
              with:
                company_name: "{{get-lead.Company}}"
                domain: "{{get-lead.Website}}"
            - name: update-lead
              type: call
              call: salesforce-update.update-lead
              with:
                lead_id: "{{lead_id}}"
                NumberOfEmployees: "{{enrich-company.employeeCount}}"
                AnnualRevenue: "{{enrich-company.revenue}}"
                Industry: "{{enrich-company.industry}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/company"
          operations:
            - name: search-company
              method: POST
    - type: http
      namespace: salesforce-update
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: update-lead
              method: PATCH

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

naftiko: "0.5"
info:
  label: "SAP Ariba Supplier Onboarding"
  description: "Registers a new supplier in SAP Ariba and creates the corresponding vendor master record in SAP S/4HANA, notifying the procurement team via Teams."
  tags:
    - procurement
    - sap-ariba
    - sap
    - supplier-management
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: onboard-supplier
          description: "Given supplier name and country, register the supplier in SAP Ariba, create the SAP vendor master record, and notify the procurement manager via Teams."
          inputParameters:
            - name: supplier_name
              type: string
              description: "Legal name of the supplier."
            - name: supplier_country
              type: string
              description: "Two-letter ISO country code for the supplier."
            - name: procurement_manager_upn
              type: string
              description: "UPN of the procurement manager for notification."
          steps:
            - name: register-ariba
              type: call
              call: sap-ariba.create-supplier
              with:
                supplierName: "{{supplier_name}}"
                country: "{{supplier_country}}"
            - name: create-vendor
              type: call
              call: sap.create-vendor
              with:
                vendorName: "{{supplier_name}}"
                country: "{{supplier_country}}"
                aribaId: "{{register-ariba.supplierId}}"
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{procurement_manager_upn}}"
                text: "Supplier {{supplier_name}} onboarded. Ariba ID: {{register-ariba.supplierId}}, SAP Vendor: {{create-vendor.vendorId}}"
  consumes:
    - type: http
      namespace: sap-ariba
      baseUri: "https://openapi.ariba.com/api/supplier/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers"
          operations:
            - name: create-supplier
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://lowes-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_Supplier"
          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: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Extracts cost center budget vs. actuals from SAP S/4HANA and pushes the variance data to Power BI for retail finance reporting.

naftiko: "0.5"
info:
  label: "SAP Budget vs Actuals Reporting"
  description: "Extracts cost center budget vs. actuals from SAP S/4HANA and pushes the variance data to Power BI for retail finance reporting."
  tags:
    - finance
    - erp
    - sap
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: finance-reporting
      port: 8080
      tools:
        - name: publish-budget-variance
          description: "Given a fiscal period and cost center, extract budget vs. actuals from SAP S/4HANA and push rows to the Power BI finance dashboard dataset."
          inputParameters:
            - name: fiscal_period
              type: string
              description: "Fiscal period in YYYYMM format (e.g., 202603)."
            - name: cost_center
              type: string
              description: "SAP cost center code."
          steps:
            - name: get-actuals
              type: call
              call: sap.get-cost-center-actuals
              with:
                fiscalPeriod: "{{fiscal_period}}"
                costCenter: "{{cost_center}}"
            - name: push-to-powerbi
              type: call
              call: powerbi.push-rows
              with:
                datasetId: "$secrets.powerbi_finance_dataset_id"
                tableName: "BudgetVariance"
                rows: "{{get-actuals.rows}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/YY1_COSTCENTERACTUALS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-center-actuals
          path: "/CostCenterActuals"
          inputParameters:
            - name: fiscalPeriod
              in: query
            - name: costCenter
              in: query
          operations:
            - name: get-cost-center-actuals
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: dataset-rows
          path: "/datasets/{{datasetId}}/tables/{{tableName}}/rows"
          inputParameters:
            - name: datasetId
              in: path
            - name: tableName
              in: path
          operations:
            - name: push-rows
              method: POST

Retrieves pending expense reports from SAP Concur for a cost center and routes high-value reports to the manager for approval via Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Review"
  description: "Retrieves pending expense reports from SAP Concur for a cost center and routes high-value reports to the manager for approval via Teams."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: expense-ops
      port: 8080
      tools:
        - name: review-pending-expenses
          description: "Retrieve pending expense reports from SAP Concur for a given cost center. Flag reports above the policy threshold and send approval requests to the submitter's manager via Teams."
          inputParameters:
            - name: cost_center
              type: string
              description: "Cost center code to retrieve pending expense reports for."
            - name: threshold_usd
              type: number
              description: "Policy threshold in USD above which manager approval is required."
          steps:
            - name: get-reports
              type: call
              call: concur.list-expense-reports
              with:
                costCenter: "{{cost_center}}"
                approvalStatus: "pending"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-reports.managerEmail}}"
                text: "Expense reports pending approval for cost center {{cost_center}} — reports above ${{threshold_usd}} require your review."
  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"
          inputParameters:
            - name: costCenter
              in: query
            - name: approvalStatus
              in: query
          operations:
            - name: list-expense-reports
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Generates general ledger balance reports by pulling SAP GL data, enriching with Snowflake cost allocations, and publishing to SharePoint.

naftiko: "0.5"
info:
  label: "SAP GL Account Balance Report"
  description: "Generates general ledger balance reports by pulling SAP GL data, enriching with Snowflake cost allocations, and publishing to SharePoint."
  tags:
    - procurement
    - sap
    - snowflake
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: generate-gl-report
          description: "Given a company code and period, pull SAP GL balances, enrich with Snowflake allocations, and upload to SharePoint."
          inputParameters:
            - name: company_code
              type: string
              description: "SAP company code."
            - name: fiscal_period
              type: string
              description: "Fiscal period (e.g., 2026-03)."
          steps:
            - name: get-gl-balances
              type: call
              call: sap.get-gl-balances
              with:
                company_code: "{{company_code}}"
                period: "{{fiscal_period}}"
            - name: get-allocations
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT gl_account, allocation_pct, cost_center FROM COST_ALLOCATIONS WHERE company='{{company_code}}' AND period='{{fiscal_period}}'"
            - name: upload-report
              type: call
              call: sharepoint.upload-file
              with:
                folder: "/Finance Reports/GL/{{fiscal_period}}"
                filename: "{{company_code}}_gl_report.xlsx"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-balances
          path: "/A_GLAccountBalance"
          operations:
            - name: get-gl-balances
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/lowes.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive
          path: "/drive/root:/{{folder}}/{{filename}}:/content"
          operations:
            - name: upload-file
              method: PUT

Posts goods receipts in SAP by verifying the purchase order, creating the material document, and notifying accounts payable via Teams.

naftiko: "0.5"
info:
  label: "SAP Goods Receipt Posting"
  description: "Posts goods receipts in SAP by verifying the purchase order, creating the material document, and notifying accounts payable via Teams."
  tags:
    - supply-chain
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: post-goods-receipt
          description: "Given a PO number and received quantities, verify the SAP PO, post the goods receipt, and notify AP."
          inputParameters:
            - name: po_number
              type: string
              description: "SAP purchase order number."
            - name: received_qty
              type: integer
              description: "Total received quantity."
          steps:
            - name: verify-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{po_number}}"
            - name: post-receipt
              type: call
              call: sap.post-goods-receipt
              with:
                po_number: "{{po_number}}"
                quantity: "{{received_qty}}"
                movement_type: "101"
            - name: notify-ap
              type: call
              call: msteams.send-message
              with:
                channel_id: "accounts-payable"
                text: "Goods receipt posted: PO {{po_number}} from {{verify-po.vendor}}, Qty {{received_qty}}. Doc: {{post-receipt.document_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_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
        - name: material-documents
          path: "/A_MaterialDocumentHeader"
          operations:
            - name: post-goods-receipt
              method: POST
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and inventory category.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and inventory category."
  tags:
    - inventory
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-material-master
          description: "Look up an SAP material master record by material number. Returns description, base unit of measure, and material group."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number (18-character alphanumeric)."
          call: sap.get-material
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.MaterialDescription"
            - name: base_uom
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.MaterialGroup"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Looks up a purchase order in SAP S/4HANA by PO number and returns current approval status, vendor, and line-item totals.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status Lookup"
  description: "Looks up a purchase order in SAP S/4HANA by PO number and returns current approval status, vendor, and line-item totals."
  tags:
    - finance
    - procurement
    - sap
    - erp
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up an SAP purchase order by PO number. Returns header status, vendor name, total amount, and currency. Use for procurement approval workflows and spend tracking."
          inputParameters:
            - name: po_number
              type: string
              description: "SAP purchase order number (10-digit numeric string)."
          call: sap.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
      baseUri: "https://lowes-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 vendor master data from SAP by vendor number, returning company name, payment terms, and purchasing group.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP by vendor number, returning company name, payment terms, and purchasing group."
  tags:
    - procurement
    - sap
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: erp
      port: 8080
      tools:
        - name: get-vendor-master
          description: "Look up SAP vendor master by vendor number. Returns vendor name, payment terms, and purchasing organization."
          inputParameters:
            - name: vendor_number
              type: string
              description: "SAP vendor account number."
          call: sap.get-vendor
          with:
            vendor_number: "{{vendor_number}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
            - name: purchasing_org
              type: string
              mapping: "$.d.PurchasingOrganization"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-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('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET

Pulls historical sales data from Snowflake, runs a demand forecast via Azure Machine Learning, and updates SAP material requirements planning with projected quantities.

naftiko: "0.5"
info:
  label: "Seasonal Demand Forecast Pipeline"
  description: "Pulls historical sales data from Snowflake, runs a demand forecast via Azure Machine Learning, and updates SAP material requirements planning with projected quantities."
  tags:
    - supply-chain
    - snowflake
    - azure-machine-learning
    - sap
capability:
  exposes:
    - type: mcp
      namespace: demand-planning
      port: 8080
      tools:
        - name: run-seasonal-forecast
          description: "Given a product category and forecast horizon, pull historical data from Snowflake, generate Azure ML predictions, and update SAP MRP."
          inputParameters:
            - name: category_code
              type: string
              description: "Product category code for forecasting."
            - name: horizon_weeks
              type: integer
              description: "Number of weeks to forecast."
          steps:
            - name: get-history
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT week, units_sold FROM SALES_HISTORY WHERE category='{{category_code}}' ORDER BY week DESC LIMIT 104"
            - name: run-forecast
              type: call
              call: azureml.invoke-endpoint
              with:
                endpoint: "demand-forecast-v2"
                payload: "{{get-history.results}}"
                horizon: "{{horizon_weeks}}"
            - name: update-mrp
              type: call
              call: sap.update-forecast
              with:
                category: "{{category_code}}"
                forecast_data: "{{run-forecast.predictions}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: azureml
      baseUri: "https://lowes-ml.westus2.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: endpoints
          path: "/score"
          operations:
            - name: invoke-endpoint
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV_01"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: forecasts
          path: "/A_MRPMaterial"
          operations:
            - name: update-forecast
              method: PATCH

Creates a ServiceNow change request for a planned system change, routes to the CAB for approval, and notifies the requester via Teams.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Approval"
  description: "Creates a ServiceNow change request for a planned system change, routes to the CAB for approval, and notifies the requester via Teams."
  tags:
    - itsm
    - change-management
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given a change description, risk level, and planned date, create a ServiceNow change request assigned to the Change Advisory Board and notify the requester via Teams."
          inputParameters:
            - name: short_description
              type: string
              description: "Brief description of the planned change."
            - name: risk
              type: string
              description: "Risk level: low, medium, or high."
            - name: implementation_date
              type: string
              description: "Planned implementation date in YYYY-MM-DD format."
            - name: requester_upn
              type: string
              description: "UPN of the change requester."
          steps:
            - name: create-change
              type: call
              call: servicenow.create-change
              with:
                short_description: "{{short_description}}"
                risk: "{{risk}}"
                start_date: "{{implementation_date}}"
                assignment_group: "CAB"
            - name: notify-requester
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{requester_upn}}"
                text: "Change request {{create-change.number}} submitted and assigned to CAB. Risk: {{risk}}, Planned date: {{implementation_date}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          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: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Retrieves the current status and priority of a ServiceNow incident by incident number.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves the current status and priority of a ServiceNow incident by incident number."
  tags:
    - itsm
    - servicenow
    - store-ops
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident-status
          description: "Look up a ServiceNow incident by number. Returns state, priority, assigned group, and short description."
          inputParameters:
            - name: incident_number
              type: string
              description: "ServiceNow incident number (e.g., INC0012345)."
          call: servicenow.get-incident
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assignment_group
              type: string
              mapping: "$.result.assignment_group.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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

Searches SharePoint Online for store operations documents matching a keyword query.

naftiko: "0.5"
info:
  label: "SharePoint Store Document Search"
  description: "Searches SharePoint Online for store operations documents matching a keyword query."
  tags:
    - document-management
    - sharepoint
    - store-ops
capability:
  exposes:
    - type: mcp
      namespace: documents
      port: 8080
      tools:
        - name: search-store-docs
          description: "Search SharePoint for store operations documents by keyword. Returns matching file names, URLs, and authors."
          inputParameters:
            - name: query
              type: string
              description: "Search keyword or phrase."
          call: sharepoint.search
          with:
            query: "{{query}}"
          outputParameters:
            - name: results
              type: array
              mapping: "$.value"
            - name: total_count
              type: integer
              mapping: "$.totalCount"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/lowes.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: search
          path: "/drive/root/search(q='{{query}}')"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: search
              method: GET

Monitors Snowflake data pipeline task completion for retail analytics and opens a Jira issue when failures exceed threshold.

naftiko: "0.5"
info:
  label: "Snowflake Retail Data Pipeline Health"
  description: "Monitors Snowflake data pipeline task completion for retail analytics and opens a Jira issue when failures exceed threshold."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-retail-pipeline-health
          description: "Query Snowflake for failed pipeline tasks in the retail analytics database over the past N hours. Create a Jira issue and alert the data engineering Teams channel if failures exceed the threshold."
          inputParameters:
            - name: database
              type: string
              description: "Snowflake database name to monitor (e.g., RETAIL_ANALYTICS)."
            - name: hours_back
              type: integer
              description: "Number of hours to look back for failures."
            - name: failure_threshold
              type: integer
              description: "Failure count above which an alert is triggered."
          steps:
            - name: get-task-history
              type: call
              call: snowflake.query-task-history
              with:
                database: "{{database}}"
                hoursBack: "{{hours_back}}"
            - name: create-issue
              type: call
              call: jira.create-issue
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Snowflake pipeline failures in {{database}}"
                description: "{{get-task-history.failureCount}} failures in last {{hours_back}}h"
            - name: alert-team
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "data-engineering"
                text: "Pipeline alert: {{get-task-history.failureCount}} failures in {{database}} (last {{hours_back}}h). Jira: {{create-issue.key}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{{database}}/schemas/information_schema/tasks"
          inputParameters:
            - name: database
              in: path
          operations:
            - name: query-task-history
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://lowes.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/data/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Queries the Snowflake data warehouse for daily sales totals by store number and date range.

naftiko: "0.5"
info:
  label: "Snowflake Store Sales Query"
  description: "Queries the Snowflake data warehouse for daily sales totals by store number and date range."
  tags:
    - analytics
    - snowflake
    - store-ops
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: query-store-sales
          description: "Query daily sales totals from Snowflake for a given store and date range. Returns gross sales, net sales, and transaction count."
          inputParameters:
            - name: store_number
              type: string
              description: "Lowe's store number."
            - name: start_date
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              type: string
              description: "End date in YYYY-MM-DD format."
          call: snowflake.run-query
          with:
            store_number: "{{store_number}}"
            start_date: "{{start_date}}"
            end_date: "{{end_date}}"
          outputParameters:
            - name: gross_sales
              type: number
              mapping: "$.data[0].GROSS_SALES"
            - name: net_sales
              type: number
              mapping: "$.data[0].NET_SALES"
            - name: transaction_count
              type: integer
              mapping: "$.data[0].TXN_COUNT"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: queries
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Monitors social media engagement by pulling HubSpot campaign data, Google Analytics referral traffic, and storing engagement metrics in Snowflake for trend analysis.

naftiko: "0.5"
info:
  label: "Social Media Engagement Pipeline"
  description: "Monitors social media engagement by pulling HubSpot campaign data, Google Analytics referral traffic, and storing engagement metrics in Snowflake for trend analysis."
  tags:
    - marketing
    - hubspot
    - google-analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: marketing-ops
      port: 8080
      tools:
        - name: track-social-engagement
          description: "Given a campaign ID, pull HubSpot social metrics, Google Analytics referral data, and persist in Snowflake."
          inputParameters:
            - name: campaign_id
              type: string
              description: "Marketing campaign ID."
            - name: platform
              type: string
              description: "Social platform (facebook, instagram, twitter)."
          steps:
            - name: get-campaign-data
              type: call
              call: hubspot.get-campaign-metrics
              with:
                campaign_id: "{{campaign_id}}"
            - name: get-referrals
              type: call
              call: ga.get-report
              with:
                source: "{{platform}}"
                campaign: "{{campaign_id}}"
            - name: store-metrics
              type: call
              call: snowflake.run-query
              with:
                statement: "INSERT INTO SOCIAL_ENGAGEMENT VALUES ('{{campaign_id}}', '{{platform}}', {{get-campaign-data.impressions}}, {{get-referrals.sessions}}, CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: campaigns
          path: "/marketing/v3/campaigns/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-metrics
              method: GET
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/lowes:runReport"
          operations:
            - name: get-report
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Runs a saved search in Splunk to retrieve recent security events filtered by severity level.

naftiko: "0.5"
info:
  label: "Splunk Security Event Search"
  description: "Runs a saved search in Splunk to retrieve recent security events filtered by severity level."
  tags:
    - security
    - splunk
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: search-security-events
          description: "Execute a Splunk saved search for security events by severity. Returns event count, top source IPs, and event types."
          inputParameters:
            - name: severity
              type: string
              description: "Severity level filter (critical, high, medium, low)."
            - name: time_range
              type: string
              description: "Time range for the search (e.g., -24h, -7d)."
          call: splunk.run-search
          with:
            severity: "{{severity}}"
            time_range: "{{time_range}}"
          outputParameters:
            - name: event_count
              type: integer
              mapping: "$.results.count"
            - name: top_sources
              type: array
              mapping: "$.results.top_sources"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://lowes-splunk.splunkcloud.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: searches
          path: "/search/jobs"
          operations:
            - name: run-search
              method: POST

When an associate separation is recorded in Workday, deactivates Okta access, disables the Microsoft 365 account, and notifies the store manager via Teams.

naftiko: "0.5"
info:
  label: "Store Associate Offboarding"
  description: "When an associate separation is recorded in Workday, deactivates Okta access, disables the Microsoft 365 account, and notifies the store manager via Teams."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID, revoke Okta SSO access, disable Microsoft 365 account, and notify the store manager via Teams on completion."
          inputParameters:
            - name: employee_id
              type: string
              description: "Workday worker ID of the departing associate."
            - name: last_day
              type: string
              description: "Last working day 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:
                userId: "{{get-worker.work_email}}"
            - name: disable-m365
              type: call
              call: msgraph.update-user
              with:
                user_id: "{{get-worker.work_email}}"
                accountEnabled: "false"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.manager_email}}"
                text: "Offboarding complete for {{get-worker.full_name}} (last day {{last_day}}). System access has been revoked."
  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: "/lowes/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://lowes.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{userId}}/lifecycle/deactivate"
          inputParameters:
            - name: userId
              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/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: update-user
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Orchestrates store compliance audits by pulling the checklist from Confluence, creating ServiceNow audit tasks, and uploading findings to SharePoint.

naftiko: "0.5"
info:
  label: "Store Compliance Audit Orchestrator"
  description: "Orchestrates store compliance audits by pulling the checklist from Confluence, creating ServiceNow audit tasks, and uploading findings to SharePoint."
  tags:
    - store-ops
    - confluence
    - servicenow
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: run-compliance-audit
          description: "Given a store number and audit type, fetch Confluence checklist, create ServiceNow audit tasks, and upload findings to SharePoint."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
            - name: audit_type
              type: string
              description: "Audit type (safety, operational, financial)."
          steps:
            - name: get-checklist
              type: call
              call: confluence.get-page
              with:
                title: "{{audit_type}}_audit_checklist"
                space: "COMPLIANCE"
            - name: create-audit-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "{{audit_type}} compliance audit — Store {{store_number}}"
                assignment_group: "Compliance_Auditors"
            - name: upload-findings
              type: call
              call: sharepoint.upload-file
              with:
                folder: "/Audit Reports/Store_{{store_number}}"
                filename: "{{audit_type}}_audit_report.pdf"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://lowes.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: get-page
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/lowes.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive
          path: "/drive/root:/{{folder}}/{{filename}}:/content"
          operations:
            - name: upload-file
              method: PUT

Reconciles daily store sales by comparing Snowflake POS transaction totals against SAP financial postings and flagging discrepancies in ServiceNow.

naftiko: "0.5"
info:
  label: "Store Daily Sales Reconciliation"
  description: "Reconciles daily store sales by comparing Snowflake POS transaction totals against SAP financial postings and flagging discrepancies in ServiceNow."
  tags:
    - store-ops
    - snowflake
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: reconcile-daily-sales
          description: "Given a store number and date, compare Snowflake POS totals with SAP financial postings and create ServiceNow tickets for variances."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
            - name: date
              type: string
              description: "Business date in YYYY-MM-DD format."
          steps:
            - name: get-pos-totals
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT SUM(amount) as pos_total, COUNT(*) as txn_count FROM POS_TRANSACTIONS WHERE store='{{store_number}}' AND business_date='{{date}}'"
            - name: get-sap-postings
              type: call
              call: sap.get-journal-entries
              with:
                plant: "{{store_number}}"
                posting_date: "{{date}}"
            - name: flag-variance
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Sales reconciliation variance: Store {{store_number}} — {{date}}"
                description: "POS total: {{get-pos-totals.results[0].pos_total}}, SAP total: {{get-sap-postings.total}}"
                category: "finance"
                assignment_group: "Store_Accounting"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: journal-entries
          path: "/A_JournalEntryItemBasic"
          operations:
            - name: get-journal-entries
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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

Activates the emergency contact tree by pulling store associate lists from Workday, sending mass Teams notifications, and creating a ServiceNow incident record.

naftiko: "0.5"
info:
  label: "Store Emergency Contact Tree Activation"
  description: "Activates the emergency contact tree by pulling store associate lists from Workday, sending mass Teams notifications, and creating a ServiceNow incident record."
  tags:
    - store-ops
    - workday
    - microsoft-teams
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: emergency-ops
      port: 8080
      tools:
        - name: activate-contact-tree
          description: "Given a store number and emergency type, pull Workday associate list, send Teams notifications, and create ServiceNow record."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
            - name: emergency_type
              type: string
              description: "Emergency type (fire, medical, security, weather)."
            - name: message
              type: string
              description: "Emergency notification message."
          steps:
            - name: get-associates
              type: call
              call: workday.get-store-roster
              with:
                store: "{{store_number}}"
            - name: send-notifications
              type: call
              call: msteams.send-message
              with:
                channel_id: "store-{{store_number}}-emergency"
                text: "EMERGENCY ({{emergency_type}}): {{message}}. All associates at Store {{store_number}} please acknowledge."
            - name: create-record
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Emergency: {{emergency_type}} — Store {{store_number}}"
                category: "emergency"
                priority: "1"
                assignment_group: "Store_Management"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: rosters
          path: "/lowes/workers"
          operations:
            - name: get-store-roster
              method: GET
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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

Schedules preventive maintenance for store equipment by querying the asset registry in ServiceNow, creating work orders, and notifying the facilities team via Teams.

naftiko: "0.5"
info:
  label: "Store Equipment Maintenance Scheduler"
  description: "Schedules preventive maintenance for store equipment by querying the asset registry in ServiceNow, creating work orders, and notifying the facilities team via Teams."
  tags:
    - store-ops
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: facilities
      port: 8080
      tools:
        - name: schedule-equipment-maintenance
          description: "Given a store number and equipment type, look up ServiceNow assets due for maintenance, create work orders, and notify the facilities team."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
            - name: equipment_type
              type: string
              description: "Equipment type (forklift, hvac, compressor, lighting)."
          steps:
            - name: get-assets
              type: call
              call: servicenow.get-assets
              with:
                store: "{{store_number}}"
                type: "{{equipment_type}}"
                maintenance_due: "true"
            - name: create-work-order
              type: call
              call: servicenow.create-work-order
              with:
                short_description: "Preventive maintenance: {{equipment_type}} — Store {{store_number}}"
                asset_list: "{{get-assets.results}}"
                assignment_group: "Facilities_Maintenance"
            - name: notify-facilities
              type: call
              call: msteams.send-message
              with:
                channel_id: "facilities-maintenance"
                text: "Maintenance scheduled for {{get-assets.count}} {{equipment_type}} units at Store {{store_number}}. Work order: {{create-work-order.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: assets
          path: "/table/alm_asset"
          operations:
            - name: get-assets
              method: GET
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

When a cycle count discrepancy is detected in SAP, creates a ServiceNow investigation ticket, notifies the store manager via Teams, and updates the inventory adjustment log in Snowflake.

naftiko: "0.5"
info:
  label: "Store Inventory Cycle Count Orchestrator"
  description: "When a cycle count discrepancy is detected in SAP, creates a ServiceNow investigation ticket, notifies the store manager via Teams, and updates the inventory adjustment log in Snowflake."
  tags:
    - inventory
    - sap
    - servicenow
    - microsoft-teams
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: inventory-ops
      port: 8080
      tools:
        - name: handle-cycle-count-discrepancy
          description: "Given an SAP material number and store, orchestrate discrepancy resolution: look up SAP inventory, create a ServiceNow ticket, notify the store manager via Teams, and log the adjustment in Snowflake."
          inputParameters:
            - name: material_number
              type: string
              description: "SAP material number with discrepancy."
            - name: store_number
              type: string
              description: "Store where discrepancy was found."
            - name: expected_qty
              type: integer
              description: "Expected quantity from system."
            - name: actual_qty
              type: integer
              description: "Actual counted quantity."
          steps:
            - name: get-material
              type: call
              call: sap.get-material
              with:
                material_number: "{{material_number}}"
            - name: create-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Cycle count discrepancy: {{get-material.description}} — Store {{store_number}}"
                category: "inventory"
                assignment_group: "Store_Inventory"
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                channel_id: "store-{{store_number}}-ops"
                text: "Inventory discrepancy for {{get-material.description}}: expected {{expected_qty}}, counted {{actual_qty}}. Ticket: {{create-ticket.number}}"
            - name: log-adjustment
              type: call
              call: snowflake.run-query
              with:
                statement: "INSERT INTO INVENTORY_ADJUSTMENTS VALUES ('{{material_number}}', '{{store_number}}', {{expected_qty}}, {{actual_qty}}, CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: materials
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

Optimizes store labor scheduling by pulling traffic forecasts from Google Analytics, sales projections from Snowflake, and updating shift plans in Workday.

naftiko: "0.5"
info:
  label: "Store Labor Forecast Optimizer"
  description: "Optimizes store labor scheduling by pulling traffic forecasts from Google Analytics, sales projections from Snowflake, and updating shift plans in Workday."
  tags:
    - store-ops
    - google-analytics
    - snowflake
    - workday
capability:
  exposes:
    - type: mcp
      namespace: workforce
      port: 8080
      tools:
        - name: optimize-labor-schedule
          description: "Given a store and week, pull Google Analytics traffic forecast, Snowflake sales projections, and update Workday shift schedules."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
            - name: week_start
              type: string
              description: "Week start date in YYYY-MM-DD format."
          steps:
            - name: get-traffic-forecast
              type: call
              call: ga.get-report
              with:
                store: "{{store_number}}"
                start_date: "{{week_start}}"
            - name: get-sales-projection
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT day_of_week, projected_sales, projected_transactions FROM LABOR_FORECAST WHERE store='{{store_number}}' AND week_start='{{week_start}}'"
            - name: update-schedule
              type: call
              call: workday.update-schedule
              with:
                store: "{{store_number}}"
                week: "{{week_start}}"
                traffic_data: "{{get-traffic-forecast.sessions}}"
                sales_data: "{{get-sales-projection.results}}"
  consumes:
    - type: http
      namespace: ga
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/lowes:runReport"
          operations:
            - name: get-report
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              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: schedules
          path: "/lowes/schedules"
          operations:
            - name: update-schedule
              method: PUT

Responds to store network outages by checking Datadog network monitors, creating a priority ServiceNow incident, and escalating to the NOC via Teams.

naftiko: "0.5"
info:
  label: "Store Network Outage Response"
  description: "Responds to store network outages by checking Datadog network monitors, creating a priority ServiceNow incident, and escalating to the NOC via Teams."
  tags:
    - infrastructure
    - datadog
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: network-ops
      port: 8080
      tools:
        - name: handle-network-outage
          description: "Given a store number and alert, check Datadog network health, create ServiceNow P1 incident, and escalate to NOC."
          inputParameters:
            - name: store_number
              type: string
              description: "Affected store number."
            - name: alert_id
              type: string
              description: "Datadog alert ID."
          steps:
            - name: get-network-status
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "{{alert_id}}"
            - name: create-p1
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Network outage: Store {{store_number}}"
                category: "network"
                priority: "1"
                assignment_group: "Network_Operations"
            - name: escalate-noc
              type: call
              call: msteams.send-message
              with:
                channel_id: "noc-critical"
                text: "P1 Network outage at Store {{store_number}}. Status: {{get-network-status.overall_state}}. Ticket: {{create-p1.number}}. Immediate attention required."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      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://lowes.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Automates the daily store opening process by verifying POS system health in Datadog, confirming associate schedules in Workday, and posting the opening status to Teams.

naftiko: "0.5"
info:
  label: "Store Opening Checklist Orchestrator"
  description: "Automates the daily store opening process by verifying POS system health in Datadog, confirming associate schedules in Workday, and posting the opening status to Teams."
  tags:
    - store-ops
    - datadog
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: store-ops
      port: 8080
      tools:
        - name: run-opening-checklist
          description: "Given a store number, verify Datadog POS monitor health, check Workday scheduled associates, and post opening readiness to Teams."
          inputParameters:
            - name: store_number
              type: string
              description: "Lowe's store number."
            - name: date
              type: string
              description: "Opening date in YYYY-MM-DD format."
          steps:
            - name: check-pos
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "pos-store-{{store_number}}"
            - name: get-schedule
              type: call
              call: workday.get-schedule
              with:
                store_number: "{{store_number}}"
                date: "{{date}}"
            - name: post-status
              type: call
              call: msteams.send-message
              with:
                channel_id: "store-{{store_number}}-ops"
                text: "Store {{store_number}} opening checklist: POS status={{check-pos.overall_state}}, Scheduled associates={{get-schedule.headcount}}. Ready to open."
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: schedules
          path: "/lowes/schedules"
          operations:
            - name: get-schedule
              method: GET
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Verifies planogram compliance by pulling the expected layout from SharePoint, comparing against current inventory positions in SAP, and logging deviations in ServiceNow.

naftiko: "0.5"
info:
  label: "Store Planogram Compliance Check"
  description: "Verifies planogram compliance by pulling the expected layout from SharePoint, comparing against current inventory positions in SAP, and logging deviations in ServiceNow."
  tags:
    - store-ops
    - sharepoint
    - sap
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: merchandising
      port: 8080
      tools:
        - name: check-planogram-compliance
          description: "Given a store and aisle, retrieve the SharePoint planogram, compare SAP inventory positions, and create ServiceNow tasks for deviations."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
            - name: aisle_id
              type: string
              description: "Aisle identifier."
          steps:
            - name: get-planogram
              type: call
              call: sharepoint.get-file
              with:
                path: "/Planograms/Store_{{store_number}}/{{aisle_id}}.json"
            - name: get-positions
              type: call
              call: sap.get-bin-positions
              with:
                plant: "{{store_number}}"
                aisle: "{{aisle_id}}"
            - name: log-deviations
              type: call
              call: servicenow.create-task
              with:
                short_description: "Planogram deviation: Store {{store_number}} Aisle {{aisle_id}}"
                assignment_group: "Merchandising_Ops"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/lowes.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/drive/root:/{{path}}:/content"
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_WAREHOUSE_MGMT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: bins
          path: "/A_WarehouseBin"
          operations:
            - name: get-bin-positions
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Tracks store remodel projects by pulling project milestones from ServiceNow, budget data from SAP, and posting progress reports to Confluence.

naftiko: "0.5"
info:
  label: "Store Remodel Project Tracker"
  description: "Tracks store remodel projects by pulling project milestones from ServiceNow, budget data from SAP, and posting progress reports to Confluence."
  tags:
    - store-ops
    - servicenow
    - sap
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: construction
      port: 8080
      tools:
        - name: track-remodel-project
          description: "Given a project ID and store number, pull ServiceNow milestones, SAP budget status, and post a Confluence progress report."
          inputParameters:
            - name: project_id
              type: string
              description: "ServiceNow project ID."
            - name: store_number
              type: string
              description: "Store being remodeled."
          steps:
            - name: get-milestones
              type: call
              call: servicenow.get-project
              with:
                project_id: "{{project_id}}"
            - name: get-budget
              type: call
              call: sap.get-project-budget
              with:
                project: "{{project_id}}"
                plant: "{{store_number}}"
            - name: post-report
              type: call
              call: confluence.create-page
              with:
                space: "STORE_REMODELS"
                title: "Remodel Progress: Store {{store_number}} — {{get-milestones.current_phase}}"
                body: "Budget spent: {{get-budget.actual}} of {{get-budget.planned}}. Completion: {{get-milestones.percent_complete}}%."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: projects
          path: "/table/pm_project/{{project_id}}"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PROJECT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: projects
          path: "/A_Project"
          operations:
            - name: get-project-budget
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://lowes.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: content
          path: "/content"
          operations:
            - name: create-page
              method: POST

When a safety incident is reported, creates a ServiceNow incident, notifies the district safety manager via Teams, and logs the event in Workday for the affected associate.

naftiko: "0.5"
info:
  label: "Store Safety Incident Response"
  description: "When a safety incident is reported, creates a ServiceNow incident, notifies the district safety manager via Teams, and logs the event in Workday for the affected associate."
  tags:
    - store-ops
    - servicenow
    - microsoft-teams
    - workday
capability:
  exposes:
    - type: mcp
      namespace: safety-ops
      port: 8080
      tools:
        - name: handle-safety-incident
          description: "Given incident details and employee ID, create a ServiceNow safety ticket, send Teams notification to safety team, and log the incident in Workday."
          inputParameters:
            - name: employee_id
              type: string
              description: "Workday worker ID of affected associate."
            - name: store_number
              type: string
              description: "Store number where incident occurred."
            - name: incident_description
              type: string
              description: "Description of the safety incident."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: create-safety-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Safety incident: {{incident_description}} — Store {{store_number}}"
                category: "safety"
                priority: "1"
                assignment_group: "EHS_Safety"
            - name: notify-safety-manager
              type: call
              call: msteams.send-message
              with:
                channel_id: "district-safety"
                text: "Safety incident at Store {{store_number}} involving {{get-worker.full_name}}: {{incident_description}}. Ticket: {{create-safety-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: "/lowes/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Responds to security camera alerts by creating a ServiceNow security incident, pulling Splunk access logs, and notifying store asset protection via Teams.

naftiko: "0.5"
info:
  label: "Store Security Camera Alert Response"
  description: "Responds to security camera alerts by creating a ServiceNow security incident, pulling Splunk access logs, and notifying store asset protection via Teams."
  tags:
    - security
    - servicenow
    - splunk
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: handle-camera-alert
          description: "Given a store number and camera zone, create a ServiceNow security incident, pull Splunk access logs, and notify asset protection."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
            - name: camera_zone
              type: string
              description: "Camera zone identifier."
            - name: alert_type
              type: string
              description: "Alert type (motion, tamper, offline)."
          steps:
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Camera alert: {{alert_type}} — Store {{store_number}} Zone {{camera_zone}}"
                category: "security"
                priority: "2"
                assignment_group: "Asset_Protection"
            - name: get-access-logs
              type: call
              call: splunk.run-search
              with:
                query: "index=security store={{store_number}} zone={{camera_zone}}"
                time_range: "-1h"
            - name: notify-ap
              type: call
              call: msteams.send-message
              with:
                channel_id: "asset-protection-alerts"
                text: "Camera {{alert_type}} alert at Store {{store_number}} Zone {{camera_zone}}. {{get-access-logs.event_count}} related security events. Ticket: {{create-incident.number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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: splunk
      baseUri: "https://lowes-splunk.splunkcloud.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: searches
          path: "/search/jobs"
          operations:
            - name: run-search
              method: POST
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Initiates a shrinkage investigation by pulling loss data from Snowflake, creating a ServiceNow case, and uploading evidence documents to Box.

naftiko: "0.5"
info:
  label: "Store Shrinkage Investigation Workflow"
  description: "Initiates a shrinkage investigation by pulling loss data from Snowflake, creating a ServiceNow case, and uploading evidence documents to Box."
  tags:
    - store-ops
    - snowflake
    - servicenow
    - box
capability:
  exposes:
    - type: mcp
      namespace: loss-prevention
      port: 8080
      tools:
        - name: open-shrinkage-investigation
          description: "Given a store number and department, pull Snowflake loss metrics, create a ServiceNow investigation case, and prepare a Box evidence folder."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
            - name: department
              type: string
              description: "Department with elevated shrinkage."
            - name: period
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
          steps:
            - name: get-loss-data
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT category, total_loss, shrink_rate FROM SHRINKAGE_METRICS WHERE store='{{store_number}}' AND dept='{{department}}' AND period='{{period}}'"
            - name: create-case
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Shrinkage investigation: Store {{store_number}} — {{department}}"
                category: "loss_prevention"
                assignment_group: "Asset_Protection"
            - name: create-folder
              type: call
              call: box.create-folder
              with:
                name: "Investigation_{{store_number}}_{{department}}_{{period}}"
                parent_id: "shrinkage_investigations"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders"
          operations:
            - name: create-folder
              method: POST

Manages store signage updates by pulling promotional details from Salesforce, generating print requests in ServiceNow, and notifying visual merchandising via Teams.

naftiko: "0.5"
info:
  label: "Store Signage Update Workflow"
  description: "Manages store signage updates by pulling promotional details from Salesforce, generating print requests in ServiceNow, and notifying visual merchandising via Teams."
  tags:
    - store-ops
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: merchandising
      port: 8080
      tools:
        - name: update-store-signage
          description: "Given a promotion ID and store list, pull Salesforce promo details, create ServiceNow print requests, and notify merchandising."
          inputParameters:
            - name: promotion_id
              type: string
              description: "Salesforce promotion ID."
            - name: store_list
              type: string
              description: "Comma-separated store numbers."
          steps:
            - name: get-promotion
              type: call
              call: salesforce.get-promotion
              with:
                promotion_id: "{{promotion_id}}"
            - name: create-print-request
              type: call
              call: servicenow.create-task
              with:
                short_description: "Signage update: {{get-promotion.name}}"
                description: "Stores: {{store_list}}. Start: {{get-promotion.start_date}}, End: {{get-promotion.end_date}}"
                assignment_group: "Visual_Merchandising"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "visual-merchandising"
                text: "New signage request: {{get-promotion.name}} for stores {{store_list}}. Task: {{create-print-request.number}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: promotions
          path: "/sobjects/Promotion__c/{{promotion_id}}"
          inputParameters:
            - name: promotion_id
              in: path
          operations:
            - name: get-promotion
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Responds to severe weather events by checking affected store inventory in SAP, adjusting staffing in Workday, and posting operational alerts to Teams.

naftiko: "0.5"
info:
  label: "Store Weather Impact Response"
  description: "Responds to severe weather events by checking affected store inventory in SAP, adjusting staffing in Workday, and posting operational alerts to Teams."
  tags:
    - store-ops
    - sap
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: emergency-ops
      port: 8080
      tools:
        - name: respond-weather-impact
          description: "Given a region and weather event type, check SAP emergency inventory, adjust Workday staffing, and post Teams alerts."
          inputParameters:
            - name: region
              type: string
              description: "Affected geographic region."
            - name: event_type
              type: string
              description: "Weather event (hurricane, blizzard, flood, tornado)."
            - name: affected_stores
              type: string
              description: "Comma-separated store numbers."
          steps:
            - name: check-emergency-stock
              type: call
              call: sap.get-emergency-inventory
              with:
                region: "{{region}}"
                category: "emergency_supplies"
            - name: adjust-staffing
              type: call
              call: workday.update-schedule
              with:
                stores: "{{affected_stores}}"
                mode: "emergency"
            - name: post-alert
              type: call
              call: msteams.send-message
              with:
                channel_id: "operations-emergency"
                text: "Weather alert ({{event_type}}): {{region}}. Affected stores: {{affected_stores}}. Emergency stock: {{check-emergency-stock.available_units}} units. Staffing adjusted."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-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"
          operations:
            - name: get-emergency-inventory
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: schedules
          path: "/lowes/schedules"
          operations:
            - name: update-schedule
              method: PUT
    - 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/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Monitors store WiFi performance by pulling Datadog network metrics, correlating with Dynatrace application health, and creating ServiceNow tickets for degradation.

naftiko: "0.5"
info:
  label: "Store WiFi Performance Monitoring"
  description: "Monitors store WiFi performance by pulling Datadog network metrics, correlating with Dynatrace application health, and creating ServiceNow tickets for degradation."
  tags:
    - infrastructure
    - datadog
    - dynatrace
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: network-ops
      port: 8080
      tools:
        - name: monitor-wifi-performance
          description: "Given a store number, check Datadog WiFi metrics, correlate Dynatrace app impact, and create ServiceNow tickets."
          inputParameters:
            - name: store_number
              type: string
              description: "Store number."
          steps:
            - name: get-wifi-metrics
              type: call
              call: datadog.get-monitor
              with:
                monitor_id: "wifi-store-{{store_number}}"
            - name: check-app-impact
              type: call
              call: dynatrace.get-host
              with:
                host_id: "pos-store-{{store_number}}"
            - name: create-ticket
              type: call
              call: servicenow.create-incident
              with:
                short_description: "WiFi degradation: Store {{store_number}}"
                description: "WiFi status: {{get-wifi-metrics.overall_state}}, POS health: {{check-app-impact.state}}"
                category: "network"
                assignment_group: "Store_IT"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: dynatrace
      baseUri: "https://lowes.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: entities
          path: "/entities/{{host_id}}"
          inputParameters:
            - name: host_id
              in: path
          operations:
            - name: get-host
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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

Reconciles supplier payments by matching SAP invoices against Oracle payment records and posting discrepancies to Snowflake for audit review.

naftiko: "0.5"
info:
  label: "Supplier Payment Reconciliation"
  description: "Reconciles supplier payments by matching SAP invoices against Oracle payment records and posting discrepancies to Snowflake for audit review."
  tags:
    - procurement
    - sap
    - oracle
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: finance-ops
      port: 8080
      tools:
        - name: reconcile-supplier-payments
          description: "Given a vendor number and period, match SAP invoices against Oracle payments and log discrepancies in Snowflake."
          inputParameters:
            - name: vendor_number
              type: string
              description: "SAP vendor number."
            - name: period
              type: string
              description: "Fiscal period (e.g., 2026-03)."
          steps:
            - name: get-invoices
              type: call
              call: sap.get-invoices
              with:
                vendor: "{{vendor_number}}"
                period: "{{period}}"
            - name: get-payments
              type: call
              call: oracle.get-payments
              with:
                supplier_id: "{{vendor_number}}"
                period: "{{period}}"
            - name: log-discrepancies
              type: call
              call: snowflake.run-query
              with:
                statement: "INSERT INTO PAYMENT_RECONCILIATION SELECT * FROM TABLE(RESULT_SCAN('{{get-invoices.query_id}}')) EXCEPT SELECT * FROM TABLE(RESULT_SCAN('{{get-payments.query_id}}'))"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-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"
          operations:
            - name: get-invoices
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: payments
          path: "/payablesPayments"
          operations:
            - name: get-payments
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST

When a shipment delay is detected in Oracle, retrieves vendor details from SAP, creates a ServiceNow problem ticket, and notifies the supply chain team via Teams.

naftiko: "0.5"
info:
  label: "Supply Chain Shipment Delay Escalation"
  description: "When a shipment delay is detected in Oracle, retrieves vendor details from SAP, creates a ServiceNow problem ticket, and notifies the supply chain team via Teams."
  tags:
    - supply-chain
    - oracle
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supply-chain-ops
      port: 8080
      tools:
        - name: escalate-shipment-delay
          description: "Given a purchase order and shipment ID, look up Oracle shipment status, get SAP vendor info, create a ServiceNow escalation ticket, and notify the supply chain channel."
          inputParameters:
            - name: po_number
              type: string
              description: "SAP purchase order number."
            - name: shipment_id
              type: string
              description: "Oracle shipment tracking ID."
          steps:
            - name: get-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{po_number}}"
            - name: get-shipment
              type: call
              call: oracle.get-shipment
              with:
                shipment_id: "{{shipment_id}}"
            - name: create-problem
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Shipment delay: PO {{po_number}} from {{get-po.vendor}} — ETA slipped"
                category: "supply_chain"
                priority: "2"
                assignment_group: "Supply_Chain_Ops"
            - name: notify-team
              type: call
              call: msteams.send-message
              with:
                channel_id: "supply-chain-alerts"
                text: "Shipment {{shipment_id}} for PO {{po_number}} ({{get-po.vendor}}) is delayed. Ticket: {{create-problem.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-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
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: shipments
          path: "/shipments/{{shipment_id}}"
          inputParameters:
            - name: shipment_id
              in: path
          operations:
            - name: get-shipment
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channels
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          operations:
            - name: send-message
              method: POST

Queries Teradata for inventory aging data by product category, returning stock age buckets and total on-hand units.

naftiko: "0.5"
info:
  label: "Teradata Inventory Aging Report"
  description: "Queries Teradata for inventory aging data by product category, returning stock age buckets and total on-hand units."
  tags:
    - inventory
    - teradata
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-inventory-aging
          description: "Query Teradata for inventory aging breakdown by category. Returns on-hand quantity and age distribution buckets."
          inputParameters:
            - name: category_code
              type: string
              description: "Product category code."
          call: teradata.run-query
          with:
            category_code: "{{category_code}}"
          outputParameters:
            - name: total_on_hand
              type: integer
              mapping: "$.results[0].total_on_hand"
            - name: aging_buckets
              type: object
              mapping: "$.results[0].age_distribution"
  consumes:
    - type: http
      namespace: teradata
      baseUri: "https://lowes-teradata.teradata.com/api/query/v1"
      authentication:
        type: basic
        username: "$secrets.teradata_user"
        password: "$secrets.teradata_password"
      resources:
        - name: queries
          path: "/systems/lowes_edw/queries"
          operations:
            - name: run-query
              method: POST

Triggers a Terraform Cloud workspace run to provision retail store infrastructure, creates a Jira tracking task, and notifies the DevOps team via Teams.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Provisioning"
  description: "Triggers a Terraform Cloud workspace run to provision retail store infrastructure, creates a Jira tracking task, and notifies the DevOps team via Teams."
  tags:
    - cloud
    - devops
    - terraform
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-provisioning
      port: 8080
      tools:
        - name: provision-store-infrastructure
          description: "Given a Terraform Cloud workspace and change description, trigger an infrastructure run, create a Jira task to track it, and post status to the DevOps Teams channel."
          inputParameters:
            - name: workspace_id
              type: string
              description: "Terraform Cloud workspace ID for the store infrastructure."
            - name: change_description
              type: string
              description: "Description of the infrastructure change being applied."
            - name: teams_channel_id
              type: string
              description: "DevOps Teams channel ID for status updates."
          steps:
            - name: create-run
              type: call
              call: terraform.create-run
              with:
                workspaceId: "{{workspace_id}}"
                message: "{{change_description}}"
            - name: create-task
              type: call
              call: jira.create-issue
              with:
                project_key: "INFRA"
                issuetype: "Task"
                summary: "Terraform: {{change_description}}"
                description: "Workspace: {{workspace_id}} | Run: {{create-run.runId}}"
            - name: notify-devops
              type: call
              call: msteams.post-channel-message
              with:
                channel_id: "{{teams_channel_id}}"
                text: "Infrastructure run triggered: {{change_description}} | Workspace: {{workspace_id}} | Jira: {{create-task.key}}"
  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: jira
      baseUri: "https://lowes.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/devops/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Validates a vendor invoice against the SAP purchase order and goods receipt, then routes discrepancies to an approver via ServiceNow and Teams.

naftiko: "0.5"
info:
  label: "Vendor Invoice Three-Way Match"
  description: "Validates a vendor invoice against the SAP purchase order and goods receipt, then routes discrepancies to an approver via ServiceNow and Teams."
  tags:
    - finance
    - procurement
    - sap
    - servicenow
    - approval
capability:
  exposes:
    - type: mcp
      namespace: ap-ops
      port: 8080
      tools:
        - name: validate-invoice
          description: "Given a vendor invoice number and SAP PO number, perform three-way match in SAP, create a ServiceNow task for any discrepancy, and notify the AP manager via Teams."
          inputParameters:
            - name: invoice_number
              type: string
              description: "Vendor invoice number."
            - name: po_number
              type: string
              description: "Associated SAP purchase order number."
            - name: ap_manager_upn
              type: string
              description: "UPN of the accounts payable manager for escalation."
          steps:
            - name: get-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{po_number}}"
            - name: create-discrepancy-task
              type: call
              call: servicenow.create-task
              with:
                short_description: "Invoice discrepancy: {{invoice_number}} vs PO {{po_number}}"
                assigned_to: "{{ap_manager_upn}}"
                description: "PO status: {{get-po.status}}, PO amount: {{get-po.total_value}} {{get-po.currency}}"
            - name: notify-ap-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{ap_manager_upn}}"
                text: "Invoice {{invoice_number}} requires review — PO {{po_number}} has discrepancies. ServiceNow: {{create-discrepancy-task.number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-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
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST

Onboards new vendors by creating the vendor master in SAP, verifying compliance documents in Box, and provisioning vendor portal access via SailPoint.

naftiko: "0.5"
info:
  label: "Vendor Onboarding Compliance Pipeline"
  description: "Onboards new vendors by creating the vendor master in SAP, verifying compliance documents in Box, and provisioning vendor portal access via SailPoint."
  tags:
    - supply-chain
    - sap
    - box
    - sailpoint
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: onboard-vendor
          description: "Given vendor details, create SAP vendor master, verify Box compliance documents, and provision SailPoint portal access."
          inputParameters:
            - name: vendor_name
              type: string
              description: "Vendor company name."
            - name: tax_id
              type: string
              description: "Vendor tax identification number."
            - name: compliance_folder_id
              type: string
              description: "Box folder ID containing compliance documents."
          steps:
            - name: create-vendor
              type: call
              call: sap.create-vendor
              with:
                name: "{{vendor_name}}"
                tax_id: "{{tax_id}}"
            - name: verify-docs
              type: call
              call: box.get-folder-items
              with:
                folder_id: "{{compliance_folder_id}}"
            - name: provision-access
              type: call
              call: sailpoint.create-identity
              with:
                display_name: "{{vendor_name}}"
                type: "vendor"
                vendor_id: "{{create-vendor.vendor_number}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-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: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: folders
          path: "/folders/{{folder_id}}/items"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: get-folder-items
              method: GET
    - type: http
      namespace: sailpoint
      baseUri: "https://lowes.api.identitynow.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sailpoint_token"
      resources:
        - name: identities
          path: "/accounts"
          operations:
            - name: create-identity
              method: POST

Generates a vendor performance scorecard by pulling delivery metrics from SAP, quality data from Snowflake, and publishing the report to SharePoint.

naftiko: "0.5"
info:
  label: "Vendor Performance Scorecard Generator"
  description: "Generates a vendor performance scorecard by pulling delivery metrics from SAP, quality data from Snowflake, and publishing the report to SharePoint."
  tags:
    - supply-chain
    - sap
    - snowflake
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: generate-vendor-scorecard
          description: "Given a vendor number and period, compile delivery metrics from SAP, quality scores from Snowflake, and publish a scorecard to SharePoint."
          inputParameters:
            - name: vendor_number
              type: string
              description: "SAP vendor number."
            - name: period
              type: string
              description: "Reporting period (e.g., 2026-Q1)."
          steps:
            - name: get-vendor
              type: call
              call: sap.get-vendor
              with:
                vendor_number: "{{vendor_number}}"
            - name: get-delivery-metrics
              type: call
              call: snowflake.run-query
              with:
                statement: "SELECT on_time_rate, fill_rate, defect_rate FROM VENDOR_METRICS WHERE vendor_id='{{vendor_number}}' AND period='{{period}}'"
            - name: upload-scorecard
              type: call
              call: sharepoint.upload-file
              with:
                folder: "/Shared Documents/Vendor Scorecards"
                filename: "{{get-vendor.vendor_name}}_{{period}}_scorecard.pdf"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-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('{{vendor_number}}')"
          inputParameters:
            - name: vendor_number
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://lowes.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites/lowes.sharepoint.com"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive
          path: "/drive/root:/{{folder}}/{{filename}}:/content"
          operations:
            - name: upload-file
              method: PUT

Verifies incoming shipments at the warehouse by matching the SAP purchase order against Oracle receiving records and creating discrepancy tickets in ServiceNow.

naftiko: "0.5"
info:
  label: "Warehouse Receiving Verification"
  description: "Verifies incoming shipments at the warehouse by matching the SAP purchase order against Oracle receiving records and creating discrepancy tickets in ServiceNow."
  tags:
    - supply-chain
    - sap
    - oracle
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: warehouse-ops
      port: 8080
      tools:
        - name: verify-receiving
          description: "Given a PO number and receiving document, compare SAP PO quantities with Oracle receiving records and create ServiceNow tickets for discrepancies."
          inputParameters:
            - name: po_number
              type: string
              description: "SAP purchase order number."
            - name: receiving_doc
              type: string
              description: "Oracle receiving document number."
          steps:
            - name: get-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{po_number}}"
            - name: get-receipt
              type: call
              call: oracle.get-receipt
              with:
                doc_number: "{{receiving_doc}}"
            - name: create-discrepancy
              type: call
              call: servicenow.create-incident
              with:
                short_description: "Receiving discrepancy: PO {{po_number}} vs Receipt {{receiving_doc}}"
                category: "warehouse"
                assignment_group: "Warehouse_Receiving"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://lowes-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
    - type: http
      namespace: oracle
      baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: receipts
          path: "/receivingTransactions/{{doc_number}}"
          inputParameters:
            - name: doc_number
              in: path
          operations:
            - name: get-receipt
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://lowes.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 an employee profile from Workday by worker ID, returning name, department, job title, and location.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by worker ID, returning name, department, job title, and location."
  tags:
    - hr
    - workday
    - store-ops
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up a Workday employee profile by worker ID. Returns full name, job title, department, and supervisory org."
          inputParameters:
            - name: worker_id
              type: string
              description: "Workday worker ID."
          call: workday.get-worker-profile
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.name.formatted"
            - name: job_title
              type: string
              mapping: "$.worker.position.title"
            - name: department
              type: string
              mapping: "$.worker.organization.name"
  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: "/lowes/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker-profile
              method: GET

Creates a job requisition in Workday when headcount is approved and opens a Jira ticket in the talent acquisition board.

naftiko: "0.5"
info:
  label: "Workday Open Position Requisition"
  description: "Creates a job requisition in Workday when headcount is approved and opens a Jira ticket in the talent acquisition board."
  tags:
    - hr
    - recruiting
    - workday
    - jira
capability:
  exposes:
    - type: mcp
      namespace: talent-acquisition
      port: 8080
      tools:
        - name: open-job-requisition
          description: "Given a job title, department, and hiring manager Workday ID, create a job requisition in Workday and a corresponding Jira ticket in the TA project for sourcing tracking."
          inputParameters:
            - name: job_title
              type: string
              description: "Job title for the open position."
            - name: department
              type: string
              description: "Department requesting the headcount."
            - name: hiring_manager_id
              type: string
              description: "Workday worker ID of the hiring manager."
          steps:
            - name: create-requisition
              type: call
              call: workday.create-job-requisition
              with:
                jobTitle: "{{job_title}}"
                department: "{{department}}"
                hiringManagerId: "{{hiring_manager_id}}"
            - name: create-ta-ticket
              type: call
              call: jira.create-issue
              with:
                project_key: "TA"
                issuetype: "Task"
                summary: "Recruit: {{job_title}} — {{department}}"
                description: "Workday requisition: {{create-requisition.requisitionId}}"
  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: "/lowes/jobRequisitions"
          operations:
            - name: create-job-requisition
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://lowes.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

When an employee changes roles in Workday, updates Okta group assignments and notifies the employee and new manager via Teams.

naftiko: "0.5"
info:
  label: "Workday Role Change Access Sync"
  description: "When an employee changes roles in Workday, updates Okta group assignments and notifies the employee and new manager via Teams."
  tags:
    - hr
    - identity
    - workday
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: hr-identity
      port: 8080
      tools:
        - name: sync-role-change
          description: "Given a Workday employee ID and new/old Okta group IDs, remove the user from the old role group, add them to the new role group, and send a Teams notification to the employee."
          inputParameters:
            - name: employee_id
              type: string
              description: "Workday worker ID of the employee changing roles."
            - name: new_role
              type: string
              description: "New job role or title."
            - name: okta_new_group_id
              type: string
              description: "Okta group ID for the new role."
            - name: okta_old_group_id
              type: string
              description: "Okta group ID for the previous role."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{employee_id}}"
            - name: remove-old-group
              type: call
              call: okta.remove-user-from-group
              with:
                groupId: "{{okta_old_group_id}}"
                userId: "{{get-worker.work_email}}"
            - name: add-new-group
              type: call
              call: okta.add-user-to-group
              with:
                groupId: "{{okta_new_group_id}}"
                userId: "{{get-worker.work_email}}"
            - name: notify-employee
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Your role has been updated to {{new_role}}. System access has been adjusted to reflect your new responsibilities."
  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: "/lowes/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://lowes.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{groupId}}/users/{{userId}}"
          inputParameters:
            - name: groupId
              in: path
            - name: userId
              in: path
          operations:
            - name: remove-user-from-group
              method: DELETE
            - name: add-user-to-group
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/chats"
          operations:
            - name: send-message
              method: POST