Walmart Capabilities

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

Sort
Expand

When ad spend exceeds budget threshold, fetches Google Analytics campaign data, logs the anomaly in Snowflake, and alerts the marketing team via Slack.

naftiko: "0.5"
info:
  label: "Ad Campaign Spend Anomaly Responder"
  description: "When ad spend exceeds budget threshold, fetches Google Analytics campaign data, logs the anomaly in Snowflake, and alerts the marketing team via Slack."
  tags:
    - marketing
    - google-analytics
    - snowflake
    - slack
    - advertising
capability:
  exposes:
    - type: mcp
      namespace: ad-ops
      port: 8080
      tools:
        - name: handle-spend-anomaly
          description: "Given a campaign ID and current spend, check against budget threshold, log anomaly, and notify marketing. Use when automated spend monitoring detects overruns."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "Ad campaign identifier."
            - name: current_spend
              in: body
              type: string
              description: "Current spend amount."
            - name: budget_limit
              in: body
              type: string
              description: "Budget limit."
          steps:
            - name: log-anomaly
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO MARKETING.SPEND_ANOMALIES (campaign_id, current_spend, budget_limit, overage, detected_at) VALUES ('{{campaign_id}}', {{current_spend}}, {{budget_limit}}, {{current_spend}} - {{budget_limit}}, CURRENT_TIMESTAMP())"
            - name: alert-marketing
              type: call
              call: slack.post-message
              with:
                channel: "marketing-alerts"
                text: "Ad spend anomaly: Campaign {{campaign_id}} at ${{current_spend}} (budget: ${{budget_limit}}). Overage detected. Review immediately."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves an Adobe Analytics segment definition by ID for marketing analysis review.

naftiko: "0.5"
info:
  label: "Adobe Analytics Segment Lookup"
  description: "Retrieves an Adobe Analytics segment definition by ID for marketing analysis review."
  tags:
    - marketing
    - adobe-analytics
    - segmentation
capability:
  exposes:
    - type: mcp
      namespace: marketing
      port: 8080
      tools:
        - name: get-segment
          description: "Given an Adobe Analytics segment ID, return its name, definition criteria, and owner. Use for marketing campaign audience reviews."
          inputParameters:
            - name: segment_id
              in: body
              type: string
              description: "Adobe Analytics segment ID."
          call: adobe-analytics.get-segment
          with:
            segment_id: "{{segment_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: definition
              type: object
              mapping: "$.definition"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api/walmart"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: segments
          path: "/segments/{{segment_id}}"
          inputParameters:
            - name: segment_id
              in: path
          operations:
            - name: get-segment
              method: GET

When Adobe Analytics detects a significant traffic drop, queries Snowflake for correlated data, creates a Jira investigation ticket, and alerts the digital team via Slack.

naftiko: "0.5"
info:
  label: "Adobe Analytics Traffic Drop Investigation"
  description: "When Adobe Analytics detects a significant traffic drop, queries Snowflake for correlated data, creates a Jira investigation ticket, and alerts the digital team via Slack."
  tags:
    - analytics
    - adobe-analytics
    - snowflake
    - jira
    - slack
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: digital-ops
      port: 8080
      tools:
        - name: investigate-traffic-drop
          description: "Given a report suite and date range, query Adobe Analytics and Snowflake for traffic patterns, create a Jira ticket, and alert the digital team. Use when web traffic drops exceed threshold."
          inputParameters:
            - name: report_suite
              in: body
              type: string
              description: "Adobe Analytics report suite ID."
            - name: drop_date
              in: body
              type: string
              description: "Date of the traffic drop in YYYY-MM-DD."
            - name: drop_percentage
              in: body
              type: string
              description: "Percentage drop observed."
          steps:
            - name: query-correlated-data
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT channel, SUM(sessions) as sessions, SUM(orders) as orders FROM DIGITAL.WEB_ANALYTICS WHERE report_date = '{{drop_date}}' GROUP BY channel ORDER BY sessions DESC"
            - name: create-investigation
              type: call
              call: jira.create-issue
              with:
                project: DIGITAL
                issue_type: Task
                summary: "Traffic drop: {{drop_percentage}}% on {{drop_date}}"
                description: "Report suite: {{report_suite}}. Channel breakdown: {{query-correlated-data.results}}."
            - name: alert-digital-team
              type: call
              call: slack.post-message
              with:
                channel: "digital-alerts"
                text: "Traffic drop of {{drop_percentage}}% detected on {{drop_date}} for {{report_suite}}. Jira: {{create-investigation.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Pulls weekly site traffic metrics from Adobe Analytics and publishes a summary report to the e-commerce Slack channel for stakeholder visibility.

naftiko: "0.5"
info:
  label: "Adobe Analytics Weekly Traffic Digest"
  description: "Pulls weekly site traffic metrics from Adobe Analytics and publishes a summary report to the e-commerce Slack channel for stakeholder visibility."
  tags:
    - marketing
    - analytics
    - adobe-analytics
    - slack
    - e-commerce
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: ecomm-analytics
      port: 8080
      tools:
        - name: digest-site-traffic
          description: "Given a date range, retrieve weekly traffic metrics from Adobe Analytics and post a digest to the e-commerce Slack channel. Use for Monday morning stakeholder traffic reports."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Report start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "Report end date in YYYY-MM-DD format."
            - name: report_suite_id
              in: body
              type: string
              description: "Adobe Analytics report suite ID (e.g. walmart-us-prod)."
          steps:
            - name: get-traffic-report
              type: call
              call: adobe-analytics.run-report
              with:
                rsid: "{{report_suite_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: post-digest
              type: call
              call: slack-ecomm.post-message
              with:
                channel: "ecommerce-analytics"
                text: "Weekly traffic digest ({{start_date}} to {{end_date}}): Visits={{get-traffic-report.visits}}, PageViews={{get-traffic-report.pageViews}}, Revenue={{get-traffic-report.revenue}}"
  consumes:
    - type: http
      namespace: adobe-analytics
      baseUri: "https://analytics.adobe.io/api"
      authentication:
        type: bearer
        token: "$secrets.adobe_analytics_token"
      resources:
        - name: reports
          path: "/{{company_id}}/reports"
          inputParameters:
            - name: company_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: slack-ecomm
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a separation is recorded in Workday, revokes Okta access, closes ServiceNow assets, and posts a Slack notification to the HR operations channel.

naftiko: "0.5"
info:
  label: "Associate Offboarding Workflow"
  description: "When a separation is recorded in Workday, revokes Okta access, closes ServiceNow assets, and posts a Slack notification to the HR operations channel."
  tags:
    - hr
    - offboarding
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-associate-offboarding
          description: "Given a Workday employee ID and separation date, revoke system access via ServiceNow and notify the HR operations Slack channel. Invoke when an associate's employment ends."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing associate."
            - name: separation_date
              in: body
              type: string
              description: "Last working day in ISO 8601 format (YYYY-MM-DD)."
            - name: separation_reason
              in: body
              type: string
              description: "Reason code for separation (e.g. voluntary, involuntary, retirement)."
          steps:
            - name: get-worker
              type: call
              call: workday-lookup.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-offboarding-task
              type: call
              call: servicenow-offboard.create-task
              with:
                category: hr_offboarding
                short_description: "Offboarding: {{get-worker.full_name}} — effective {{separation_date}}"
                assigned_group: IT_Access_Management
            - name: notify-hr-ops
              type: call
              call: slack-hr.post-message
              with:
                channel: "hr-operations"
                text: "Offboarding initiated for {{get-worker.full_name}} ({{workday_employee_id}}). Separation date: {{separation_date}}. Reason: {{separation_reason}}. ServiceNow task: {{create-offboarding-task.number}}"
  consumes:
    - type: http
      namespace: workday-lookup
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/walmart/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow-offboard
      baseUri: "https://walmart.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: slack-hr
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Provisions a new Azure resource group and tags it according to Walmart's FinOps tagging policy, then registers the resource in the ServiceNow CMDB.

naftiko: "0.5"
info:
  label: "Azure Cloud Resource Provisioning"
  description: "Provisions a new Azure resource group and tags it according to Walmart's FinOps tagging policy, then registers the resource in the ServiceNow CMDB."
  tags:
    - cloud
    - azure
    - servicenow
    - finops
    - provisioning
capability:
  exposes:
    - type: mcp
      namespace: cloud-provisioning
      port: 8080
      tools:
        - name: provision-azure-resource-group
          description: "Given a resource group name, Azure region, and cost center, create the resource group with standard Walmart FinOps tags and register it in the ServiceNow CMDB. Use when teams request new Azure environments."
          inputParameters:
            - name: resource_group_name
              in: body
              type: string
              description: "Name for the new Azure resource group (e.g. wmt-supply-chain-prod-rg)."
            - name: location
              in: body
              type: string
              description: "Azure region (e.g. eastus2, westus2)."
            - name: cost_center
              in: body
              type: string
              description: "Walmart cost center code for FinOps tagging."
            - name: environment
              in: body
              type: string
              description: "Environment type: prod, staging, dev."
          steps:
            - name: create-resource-group
              type: call
              call: azure-mgmt.create-resource-group
              with:
                name: "{{resource_group_name}}"
                location: "{{location}}"
                cost_center: "{{cost_center}}"
                environment: "{{environment}}"
            - name: register-cmdb
              type: call
              call: servicenow-cmdb.create-ci
              with:
                name: "{{resource_group_name}}"
                category: cloud
                short_description: "Azure resource group {{resource_group_name}} in {{location}}"
                environment: "{{environment}}"
  consumes:
    - type: http
      namespace: azure-mgmt
      baseUri: "https://management.azure.com/subscriptions"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: resource-groups
          path: "/{{subscription_id}}/resourcegroups/{{resource_group_name}}"
          inputParameters:
            - name: subscription_id
              in: path
            - name: resource_group_name
              in: path
          operations:
            - name: create-resource-group
              method: PUT
    - type: http
      namespace: servicenow-cmdb
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: configuration-items
          path: "/table/cmdb_ci_cloud_service"
          operations:
            - name: create-ci
              method: POST

When an Azure DevOps build pipeline fails, creates a Jira bug ticket with build logs and notifies the development team via Slack.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Failure to Jira"
  description: "When an Azure DevOps build pipeline fails, creates a Jira bug ticket with build logs and notifies the development team via Slack."
  tags:
    - devops
    - azure-devops
    - jira
    - slack
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: build-ops
      port: 8080
      tools:
        - name: handle-build-failure
          description: "Given an Azure DevOps build ID and project, fetch build details, create a Jira bug, and notify the dev team. Use when CI/CD pipelines fail."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Azure DevOps project name."
            - name: build_id
              in: body
              type: string
              description: "Azure DevOps build ID."
          steps:
            - name: get-build
              type: call
              call: azuredevops.get-build
              with:
                project: "{{project}}"
                build_id: "{{build_id}}"
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project: DEV
                issue_type: Bug
                summary: "Build failure: {{get-build.definition_name}} #{{build_id}}"
                description: "Branch: {{get-build.source_branch}}. Triggered by: {{get-build.requested_by}}. Error: {{get-build.error_message}}."
            - name: notify-team
              type: call
              call: slack.post-message
              with:
                channel: "dev-builds"
                text: "Build failure: {{get-build.definition_name}} #{{build_id}} on {{get-build.source_branch}}. Jira: {{create-bug.key}}."
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/walmart"
      authentication:
        type: basic
        username: "$secrets.azdo_user"
        password: "$secrets.azdo_pat"
      resources:
        - name: builds
          path: "/{{project}}/_apis/build/builds/{{build_id}}?api-version=7.0"
          inputParameters:
            - name: project
              in: path
            - name: build_id
              in: path
          operations:
            - name: get-build
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks the health status of an Azure resource by resource ID and returns availability state and summary.

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

When a GitHub Actions pipeline fails on a protected branch, creates a Jira bug, posts a Datadog event marker, and alerts the engineering Slack channel.

naftiko: "0.5"
info:
  label: "CI/CD Pipeline Failure Response"
  description: "When a GitHub Actions pipeline fails on a protected branch, creates a Jira bug, posts a Datadog event marker, and alerts the engineering Slack channel."
  tags:
    - devops
    - cicd
    - github
    - jira
    - datadog
    - slack
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a failed GitHub Actions workflow run, create a Jira bug, post a Datadog deployment event, and alert the engineering Slack channel. Invoke on protected-branch pipeline failures."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format (e.g. walmart/supply-chain-api)."
            - name: workflow_run_id
              in: body
              type: string
              description: "GitHub Actions workflow run ID that failed."
            - name: branch
              in: body
              type: string
              description: "Branch name where the failure occurred (e.g. main)."
            - name: commit_sha
              in: body
              type: string
              description: "Full commit SHA associated with the failed run."
          steps:
            - name: get-run-details
              type: call
              call: github.get-workflow-run
              with:
                repo: "{{repo}}"
                run_id: "{{workflow_run_id}}"
            - name: create-jira-bug
              type: call
              call: jira.create-issue
              with:
                project_key: ENG
                issuetype: Bug
                summary: "[CI Failure] {{repo}} / {{branch}} — {{get-run-details.name}}"
                description: "Workflow: {{get-run-details.name}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nURL: {{get-run-details.html_url}}"
            - name: post-datadog-event
              type: call
              call: datadog.create-event
              with:
                title: "CI Failure: {{repo}} on {{branch}}"
                text: "Workflow {{get-run-details.name}} failed. Jira: {{create-jira-bug.key}}"
                alert_type: error
            - name: alert-slack
              type: call
              call: slack-eng.post-message
              with:
                channel: "engineering-alerts"
                text: "Pipeline failure: {{repo}} | Branch: {{branch}} | Commit: {{commit_sha}} | Jira: {{create-jira-bug.key}} | Run: {{get-run-details.html_url}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_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: slack-eng
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When AWS cost anomaly is detected, retrieves cost breakdown from CloudWatch, creates a Jira investigation ticket, and alerts the FinOps Slack channel.

naftiko: "0.5"
info:
  label: "Cloud Cost Spike Investigation"
  description: "When AWS cost anomaly is detected, retrieves cost breakdown from CloudWatch, creates a Jira investigation ticket, and alerts the FinOps Slack channel."
  tags:
    - cloud
    - finops
    - aws
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finops
      port: 8080
      tools:
        - name: investigate-cost-spike
          description: "Given an AWS account ID and anomaly date, fetch the cost breakdown, open a Jira ticket, and notify FinOps. Use when daily cloud spend exceeds threshold."
          inputParameters:
            - name: aws_account_id
              in: body
              type: string
              description: "AWS account ID."
            - name: anomaly_date
              in: body
              type: string
              description: "Date of the cost anomaly in YYYY-MM-DD."
          steps:
            - name: get-cost-data
              type: call
              call: aws-ce.get-cost
              with:
                account_id: "{{aws_account_id}}"
                start_date: "{{anomaly_date}}"
            - name: create-investigation
              type: call
              call: jira.create-issue
              with:
                project: FINOPS
                issue_type: Task
                summary: "Cost anomaly: AWS account {{aws_account_id}} on {{anomaly_date}}"
                description: "Total spend: {{get-cost-data.total_cost}}. Top service: {{get-cost-data.top_service}}."
            - name: alert-finops
              type: call
              call: slack.post-message
              with:
                channel: "finops-alerts"
                text: "Cost spike detected in AWS account {{aws_account_id}} on {{anomaly_date}}. Spend: {{get-cost-data.total_cost}}. Jira: {{create-investigation.key}}."
  consumes:
    - type: http
      namespace: aws-ce
      baseUri: "https://ce.us-east-1.amazonaws.com"
      authentication:
        type: aws-sigv4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: cost-explorer
          path: "/"
          operations:
            - name: get-cost
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Coupa contract approaches expiration, notifies the procurement lead via Microsoft Teams and creates a ServiceNow renewal task.

naftiko: "0.5"
info:
  label: "Coupa Contract Renewal Workflow"
  description: "When a Coupa contract approaches expiration, notifies the procurement lead via Microsoft Teams and creates a ServiceNow renewal task."
  tags:
    - procurement
    - coupa
    - microsoft-teams
    - servicenow
    - contracts
capability:
  exposes:
    - type: mcp
      namespace: contract-ops
      port: 8080
      tools:
        - name: process-contract-renewal
          description: "Given a Coupa contract ID, check expiration date, notify the procurement lead, and create a renewal task. Use for automated contract lifecycle management."
          inputParameters:
            - name: contract_id
              in: body
              type: string
              description: "Coupa contract ID."
          steps:
            - name: get-contract
              type: call
              call: coupa.get-contract
              with:
                contract_id: "{{contract_id}}"
            - name: create-renewal-task
              type: call
              call: servicenow.create-request
              with:
                category: procurement
                short_description: "Contract renewal: {{get-contract.supplier_name}} — expires {{get-contract.end_date}}"
                description: "Contract value: {{get-contract.total_value}}. Auto-renew: {{get-contract.auto_renew}}."
            - name: notify-procurement
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-contract.owner_email}}"
                text: "Contract {{contract_id}} with {{get-contract.supplier_name}} expires {{get-contract.end_date}}. Renewal task: {{create-renewal-task.number}}."
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://walmart.coupahost.com/api"
      authentication:
        type: bearer
        token: "$secrets.coupa_token"
      resources:
        - name: contracts
          path: "/contracts/{{contract_id}}"
          inputParameters:
            - name: contract_id
              in: path
          operations:
            - name: get-contract
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a Coupa invoice is pending approval, retrieves invoice details, checks SAP budget availability, and routes a Microsoft Teams approval card to the responsible cost center owner.

naftiko: "0.5"
info:
  label: "Coupa Invoice Approval Workflow"
  description: "When a Coupa invoice is pending approval, retrieves invoice details, checks SAP budget availability, and routes a Microsoft Teams approval card to the responsible cost center owner."
  tags:
    - procurement
    - finance
    - coupa
    - sap
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: invoice-approval
      port: 8080
      tools:
        - name: route-invoice-for-approval
          description: "Given a Coupa invoice ID, retrieve invoice details, validate SAP budget headroom, and send an approval card in Microsoft Teams to the cost center owner. Invoke when invoices enter the pending approval queue."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "Coupa invoice ID requiring approval."
            - name: approver_upn
              in: body
              type: string
              description: "Microsoft UPN of the cost center owner who should approve the invoice."
          steps:
            - name: get-invoice
              type: call
              call: coupa.get-invoice
              with:
                invoice_id: "{{invoice_id}}"
            - name: check-budget
              type: call
              call: sap-budget.get-cost-center
              with:
                cost_center: "{{get-invoice.cost_center}}"
            - name: send-approval-card
              type: call
              call: msteams-approval.send-message
              with:
                recipient_upn: "{{approver_upn}}"
                text: "Invoice {{invoice_id}} from {{get-invoice.supplier_name}} for {{get-invoice.total_amount}} {{get-invoice.currency}} requires your approval. Budget available: {{check-budget.available_amount}}."
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://walmart.coupahost.com/api"
      authentication:
        type: apikey
        key: "X-COUPA-API-KEY"
        value: "$secrets.coupa_api_key"
        placement: header
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap-budget
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/ZFI_COST_CENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/CostCenterSet('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center
              method: GET
    - type: http
      namespace: msteams-approval
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

When a customer complaint is received, creates a Salesforce case, looks up the order in SAP, and initiates a refund workflow notification via Slack.

naftiko: "0.5"
info:
  label: "Customer Complaint to Case and Refund"
  description: "When a customer complaint is received, creates a Salesforce case, looks up the order in SAP, and initiates a refund workflow notification via Slack."
  tags:
    - customer-service
    - salesforce
    - sap
    - slack
    - refund
capability:
  exposes:
    - type: mcp
      namespace: customer-ops
      port: 8080
      tools:
        - name: process-customer-complaint
          description: "Given a customer email and order number, create a Salesforce case, look up the SAP order, and notify the refund team. Use for customer complaint resolution."
          inputParameters:
            - name: customer_email
              in: body
              type: string
              description: "Customer email address."
            - name: order_number
              in: body
              type: string
              description: "SAP sales order number."
            - name: complaint_description
              in: body
              type: string
              description: "Description of the customer complaint."
          steps:
            - name: lookup-order
              type: call
              call: sap.get-sales-order
              with:
                order_number: "{{order_number}}"
            - name: create-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Complaint: Order {{order_number}}"
                description: "{{complaint_description}}"
                contact_email: "{{customer_email}}"
                priority: High
            - name: notify-refund-team
              type: call
              call: slack.post-message
              with:
                channel: "customer-refunds"
                text: "New complaint case {{create-case.case_number}} for order {{order_number}} ({{lookup-order.total_value}}). Customer: {{customer_email}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-sales-order
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://walmart.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Databricks for ML model performance metrics, compares against baseline thresholds, and posts an alert to the data science Slack channel if drift is detected.

naftiko: "0.5"
info:
  label: "Databricks ML Model Performance Report"
  description: "Queries Databricks for ML model performance metrics, compares against baseline thresholds, and posts an alert to the data science Slack channel if drift is detected."
  tags:
    - ai
    - data
    - databricks
    - slack
    - model-monitoring
capability:
  exposes:
    - type: mcp
      namespace: ml-ops
      port: 8080
      tools:
        - name: check-model-drift
          description: "Given a Databricks model name and version, retrieve recent inference metrics and check for performance drift against a baseline. Post results to the data-science Slack channel. Use for scheduled model health checks."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "Registered model name in the Databricks MLflow registry (e.g. demand-forecast-v2)."
            - name: model_version
              in: body
              type: string
              description: "Model version to evaluate (e.g. 3)."
            - name: drift_threshold
              in: body
              type: number
              description: "Acceptable drift threshold as a decimal (e.g. 0.05 for 5%)."
          steps:
            - name: get-model-metrics
              type: call
              call: databricks.get-model-version
              with:
                name: "{{model_name}}"
                version: "{{model_version}}"
            - name: notify-data-science
              type: call
              call: slack-ds.post-message
              with:
                channel: "data-science"
                text: "Model health check: {{model_name}} v{{model_version}} | Status: {{get-model-metrics.current_stage}} | Drift threshold: {{drift_threshold}}"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://walmart.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: model-versions
          path: "/mlflow/model-versions/get"
          inputParameters:
            - name: name
              in: query
            - name: version
              in: query
          operations:
            - name: get-model-version
              method: GET
    - type: http
      namespace: slack-ds
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Databricks ML model shows prediction drift, logs the event in Snowflake, creates a Jira ticket for the data science team, and alerts via Slack.

naftiko: "0.5"
info:
  label: "Databricks Model Drift Alert Handler"
  description: "When a Databricks ML model shows prediction drift, logs the event in Snowflake, creates a Jira ticket for the data science team, and alerts via Slack."
  tags:
    - data-science
    - databricks
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: ml-ops
      port: 8080
      tools:
        - name: handle-model-drift
          description: "Given a Databricks model name and drift score, log to Snowflake, create a Jira ticket, and alert data science. Use when model monitoring detects performance degradation."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "Databricks registered model name."
            - name: drift_score
              in: body
              type: string
              description: "Model drift score (0-1)."
          steps:
            - name: log-drift-event
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO ML_OPS.MODEL_DRIFT_LOG (model_name, drift_score, detected_at) VALUES ('{{model_name}}', {{drift_score}}, CURRENT_TIMESTAMP())"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: MLOPS
                issue_type: Task
                summary: "Model drift: {{model_name}} — score {{drift_score}}"
                description: "Model {{model_name}} drift score exceeded threshold at {{drift_score}}. Retrain or investigate."
            - name: alert-team
              type: call
              call: slack.post-message
              with:
                channel: "data-science-alerts"
                text: "Model drift detected: {{model_name}} score {{drift_score}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Datadog fires a high-severity alert for a production service, creates a ServiceNow P1 incident and posts an alert summary to the on-call Slack channel.

naftiko: "0.5"
info:
  label: "Datadog Alert to ServiceNow Incident"
  description: "When Datadog fires a high-severity alert for a production service, creates a ServiceNow P1 incident and posts an alert summary to the on-call Slack channel."
  tags:
    - itsm
    - observability
    - datadog
    - servicenow
    - slack
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: incident-ops
      port: 8080
      tools:
        - name: handle-datadog-alert
          description: "Given a Datadog alert ID and severity, create a ServiceNow incident and notify the on-call Slack channel. Invoke when production monitoring alerts fire at P1 or P2 severity."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Datadog alert/monitor ID that triggered."
            - name: alert_title
              in: body
              type: string
              description: "Human-readable title of the Datadog alert."
            - name: severity
              in: body
              type: string
              description: "Severity level: P1 or P2."
            - name: service_name
              in: body
              type: string
              description: "Name of the affected service or host."
          steps:
            - name: create-incident
              type: call
              call: servicenow-incident.create-incident
              with:
                category: application
                impact: "{{severity}}"
                urgency: 1
                short_description: "[{{severity}}] {{alert_title}} — {{service_name}}"
                description: "Datadog alert {{alert_id}} fired for service {{service_name}}. Severity: {{severity}}."
            - name: notify-oncall
              type: call
              call: slack-oncall.post-message
              with:
                channel: "oncall-alerts"
                text: "{{severity}} Incident created: {{alert_title}} | Service: {{service_name}} | ServiceNow: {{create-incident.number}} | Datadog Alert: {{alert_id}}"
  consumes:
    - type: http
      namespace: servicenow-incident
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack-oncall
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Datadog APM detects a latency spike, creates a Jira bug ticket with trace details and alerts the on-call Slack channel.

naftiko: "0.5"
info:
  label: "Datadog APM Latency to Jira Bug"
  description: "When Datadog APM detects a latency spike, creates a Jira bug ticket with trace details and alerts the on-call Slack channel."
  tags:
    - observability
    - datadog
    - jira
    - slack
    - performance
capability:
  exposes:
    - type: mcp
      namespace: perf-ops
      port: 8080
      tools:
        - name: handle-latency-spike
          description: "Given a Datadog trace ID and service name, fetch the trace details, create a Jira bug, and notify the on-call channel. Use when APM latency thresholds are breached."
          inputParameters:
            - name: trace_id
              in: body
              type: string
              description: "Datadog trace ID."
            - name: service_name
              in: body
              type: string
              description: "Affected service name."
            - name: p99_latency_ms
              in: body
              type: string
              description: "Observed P99 latency in milliseconds."
          steps:
            - name: get-trace
              type: call
              call: datadog.get-trace
              with:
                trace_id: "{{trace_id}}"
            - name: create-bug
              type: call
              call: jira.create-issue
              with:
                project: PERF
                issue_type: Bug
                summary: "Latency spike: {{service_name}} P99={{p99_latency_ms}}ms"
                description: "Datadog trace {{trace_id}} shows P99 latency of {{p99_latency_ms}}ms for {{service_name}}. Root span: {{get-trace.root_span}}."
            - name: alert-oncall
              type: call
              call: slack.post-message
              with:
                channel: "oncall-alerts"
                text: "Latency spike on {{service_name}}: P99={{p99_latency_ms}}ms. Jira: {{create-bug.key}}. Trace: {{trace_id}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: traces
          path: "/traces/{{trace_id}}"
          inputParameters:
            - name: trace_id
              in: path
          operations:
            - name: get-trace
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks the current status of a Datadog monitor by ID and returns the monitor name, overall state, and last triggered timestamp.

naftiko: "0.5"
info:
  label: "Datadog Monitor Status Check"
  description: "Checks the current status of a Datadog monitor by ID and returns the monitor name, overall state, and last triggered timestamp."
  tags:
    - observability
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-monitor-status
          description: "Given a Datadog monitor ID, return the monitor name, overall status, and last triggered time. Use for observability health checks."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Numeric Datadog monitor ID."
          call: datadog.get-monitor
          with:
            monitor_id: "{{monitor_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: overall_state
              type: string
              mapping: "$.overall_state"
            - name: last_triggered
              type: string
              mapping: "$.overall_state_modified"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET

Monitors Datadog SLO burn rates for critical retail APIs and triggers a Slack alert with context when the burn rate exceeds the warning threshold.

naftiko: "0.5"
info:
  label: "Datadog SLO Burn Rate Alert"
  description: "Monitors Datadog SLO burn rates for critical retail APIs and triggers a Slack alert with context when the burn rate exceeds the warning threshold."
  tags:
    - observability
    - datadog
    - slack
    - slo
    - reliability
capability:
  exposes:
    - type: mcp
      namespace: reliability-ops
      port: 8080
      tools:
        - name: check-slo-burn-rate
          description: "Given a Datadog SLO ID and burn rate threshold, retrieve current burn rate and post an alert to the reliability Slack channel if the threshold is breached. Use for proactive SLO management on critical retail APIs."
          inputParameters:
            - name: slo_id
              in: body
              type: string
              description: "Datadog SLO ID to check (32-character hex string)."
            - name: burn_rate_threshold
              in: body
              type: number
              description: "Burn rate threshold above which to alert (e.g. 2.0 for 2x)."
          steps:
            - name: get-slo-history
              type: call
              call: datadog-slo.get-slo-history
              with:
                slo_id: "{{slo_id}}"
            - name: post-burn-alert
              type: call
              call: slack-reliability.post-message
              with:
                channel: "reliability-eng"
                text: "SLO burn rate alert: SLO {{slo_id}} has burn rate {{get-slo-history.overall.burn_rate_alert}} (threshold: {{burn_rate_threshold}}). Current SLI: {{get-slo-history.overall.sli_value}}."
  consumes:
    - type: http
      namespace: datadog-slo
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slo-history
          path: "/slo/{{slo_id}}/history"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: get-slo-history
              method: GET
    - type: http
      namespace: slack-reliability
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Snowflake demand forecast data, identifies SKUs below safety stock, and creates replenishment purchase orders in SAP with a notification to the supply chain Slack channel.

naftiko: "0.5"
info:
  label: "Demand Forecast to Replenishment Order"
  description: "Queries Snowflake demand forecast data, identifies SKUs below safety stock, and creates replenishment purchase orders in SAP with a notification to the supply chain Slack channel."
  tags:
    - supply-chain
    - snowflake
    - sap
    - slack
    - replenishment
capability:
  exposes:
    - type: mcp
      namespace: replenishment
      port: 8080
      tools:
        - name: trigger-replenishment
          description: "Given a distribution center code and category, check forecasted demand against current stock in Snowflake, create SAP POs for low-stock items, and notify supply chain. Use for automated replenishment cycles."
          inputParameters:
            - name: dc_code
              in: body
              type: string
              description: "Distribution center code."
            - name: category
              in: body
              type: string
              description: "Product category."
          steps:
            - name: get-low-stock-items
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT sku, on_hand_qty, forecasted_demand, reorder_qty FROM SUPPLY_CHAIN.REPLENISHMENT_VIEW WHERE dc_code = '{{dc_code}}' AND category = '{{category}}' AND on_hand_qty < safety_stock"
            - name: create-po
              type: call
              call: sap.create-purchase-order
              with:
                items: "{{get-low-stock-items.results}}"
                dc_code: "{{dc_code}}"
            - name: notify-supply-chain
              type: call
              call: slack.post-message
              with:
                channel: "supply-chain-ops"
                text: "Replenishment triggered for DC {{dc_code}}, category {{category}}: {{get-low-stock-items.row_count}} SKUs below safety stock. PO: {{create-po.po_number}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder"
          operations:
            - name: create-purchase-order
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Dynatrace detects CPU or memory saturation, creates a ServiceNow problem ticket and triggers an auto-scaling workflow notification via Slack.

naftiko: "0.5"
info:
  label: "Dynatrace Resource Saturation Handler"
  description: "When Dynatrace detects CPU or memory saturation, creates a ServiceNow problem ticket and triggers an auto-scaling workflow notification via Slack."
  tags:
    - observability
    - dynatrace
    - servicenow
    - slack
    - auto-scaling
capability:
  exposes:
    - type: mcp
      namespace: capacity-ops
      port: 8080
      tools:
        - name: handle-resource-saturation
          description: "Given a Dynatrace problem ID, fetch affected entities, create a ServiceNow problem ticket, and notify the capacity team. Use when host resources exceed saturation thresholds."
          inputParameters:
            - name: problem_id
              in: body
              type: string
              description: "Dynatrace problem ID."
          steps:
            - name: get-problem
              type: call
              call: dynatrace.get-problem
              with:
                problem_id: "{{problem_id}}"
            - name: create-problem-ticket
              type: call
              call: servicenow.create-problem
              with:
                short_description: "Resource saturation: {{get-problem.title}}"
                description: "Affected entities: {{get-problem.affected_entities}}. Impact: {{get-problem.impact_level}}. Root cause: {{get-problem.root_cause}}."
            - name: notify-capacity
              type: call
              call: slack.post-message
              with:
                channel: "capacity-alerts"
                text: "Resource saturation: {{get-problem.title}}. Impact: {{get-problem.impact_level}}. ServiceNow: {{create-problem-ticket.number}}."
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://walmart.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: problems
          path: "/problems/{{problem_id}}"
          inputParameters:
            - name: problem_id
              in: path
          operations:
            - name: get-problem
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: problems
          path: "/table/problem"
          operations:
            - name: create-problem
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Looks up an e-commerce order in SAP, checks shipment tracking status, and updates the Salesforce case with delivery information.

naftiko: "0.5"
info:
  label: "E-Commerce Order Fulfillment Tracker"
  description: "Looks up an e-commerce order in SAP, checks shipment tracking status, and updates the Salesforce case with delivery information."
  tags:
    - e-commerce
    - sap
    - salesforce
    - fulfillment
capability:
  exposes:
    - type: mcp
      namespace: fulfillment
      port: 8080
      tools:
        - name: track-order-fulfillment
          description: "Given an order number and Salesforce case ID, look up the SAP shipment status and update the customer case. Use for customer inquiries about order delivery."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "SAP sales order number."
            - name: case_id
              in: body
              type: string
              description: "Salesforce case ID."
          steps:
            - name: get-order
              type: call
              call: sap.get-sales-order
              with:
                order_number: "{{order_number}}"
            - name: update-case
              type: call
              call: salesforce.update-case
              with:
                case_id: "{{case_id}}"
                comment: "Order {{order_number}} status: {{get-order.delivery_status}}. Tracking: {{get-order.tracking_number}}. ETA: {{get-order.estimated_delivery}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-sales-order
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://walmart.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

When a pull request is opened in GitHub, triggers a Datadog security scan check and posts a compliance summary comment back to the PR before merge is allowed.

naftiko: "0.5"
info:
  label: "GitHub PR Security Scan Gating"
  description: "When a pull request is opened in GitHub, triggers a Datadog security scan check and posts a compliance summary comment back to the PR before merge is allowed."
  tags:
    - devops
    - security
    - github
    - datadog
    - devsecops
capability:
  exposes:
    - type: mcp
      namespace: security-gate
      port: 8080
      tools:
        - name: gate-pr-security-scan
          description: "Given a GitHub PR number and repository, check Datadog security scan results and post a compliance summary as a PR comment. Invoke on every pull request opened event."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
            - name: pr_number
              in: body
              type: integer
              description: "Pull request number to evaluate."
            - name: commit_sha
              in: body
              type: string
              description: "Head commit SHA of the pull request."
          steps:
            - name: get-pr
              type: call
              call: github-pr.get-pull-request
              with:
                repo: "{{repo}}"
                pull_number: "{{pr_number}}"
            - name: post-pr-comment
              type: call
              call: github-pr.create-comment
              with:
                repo: "{{repo}}"
                issue_number: "{{pr_number}}"
                body: "Security scan initiated for commit {{commit_sha}}. Results will be posted when complete. PR: {{get-pr.title}}"
  consumes:
    - type: http
      namespace: github-pr
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/{{repo}}/pulls/{{pull_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pull_number
              in: path
          operations:
            - name: get-pull-request
              method: GET
        - name: comments
          path: "/repos/{{repo}}/issues/{{issue_number}}/comments"
          inputParameters:
            - name: repo
              in: path
            - name: issue_number
              in: path
          operations:
            - name: create-comment
              method: POST

When a GitHub release is published, creates a ServiceNow change request and posts the release notes to the engineering Slack channel.

naftiko: "0.5"
info:
  label: "GitHub Release to ServiceNow Change Request"
  description: "When a GitHub release is published, creates a ServiceNow change request and posts the release notes to the engineering Slack channel."
  tags:
    - devops
    - github
    - servicenow
    - slack
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: release-ops
      port: 8080
      tools:
        - name: process-github-release
          description: "Given a GitHub repository and release tag, fetch the release details, create a ServiceNow change request, and notify the engineering channel. Use for production release tracking."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository in org/repo format."
            - name: release_tag
              in: body
              type: string
              description: "Release tag (e.g. v2.1.0)."
          steps:
            - name: get-release
              type: call
              call: github.get-release
              with:
                repo_name: "{{repo_name}}"
                tag: "{{release_tag}}"
            - name: create-change-request
              type: call
              call: servicenow.create-change
              with:
                short_description: "Production release {{release_tag}} for {{repo_name}}"
                description: "{{get-release.body}}"
                category: software
                type: standard
            - name: notify-engineering
              type: call
              call: slack.post-message
              with:
                channel: "engineering-releases"
                text: "Release {{release_tag}} for {{repo_name}} published. Change request: {{create-change-request.number}}. Notes: {{get-release.body}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: releases
          path: "/repos/{{repo_name}}/releases/tags/{{tag}}"
          inputParameters:
            - name: repo_name
              in: path
            - name: tag
              in: path
          operations:
            - name: get-release
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Looks up a GitHub repository and returns its description, default branch, open issue count, and last push date.

naftiko: "0.5"
info:
  label: "GitHub Repository Info"
  description: "Looks up a GitHub repository and returns its description, default branch, open issue count, and last push date."
  tags:
    - devops
    - github
    - repository
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: get-repo-info
          description: "Given an org and repo name, return the repository description, default branch, open issues count, and last push timestamp. Use for engineering portfolio reviews."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "Full repository name in org/repo format."
          call: github.get-repo
          with:
            repo_name: "{{repo_name}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.description"
            - name: default_branch
              type: string
              mapping: "$.default_branch"
            - name: open_issues
              type: integer
              mapping: "$.open_issues_count"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{repo_name}}"
          inputParameters:
            - name: repo_name
              in: path
          operations:
            - name: get-repo
              method: GET

Scans GitHub repositories for open Dependabot security alerts, aggregates findings by severity, and posts a weekly digest to the security Slack channel.

naftiko: "0.5"
info:
  label: "GitHub Repository Security Advisory Digest"
  description: "Scans GitHub repositories for open Dependabot security alerts, aggregates findings by severity, and posts a weekly digest to the security Slack channel."
  tags:
    - devops
    - security
    - github
    - slack
    - devsecops
capability:
  exposes:
    - type: mcp
      namespace: security-advisory
      port: 8080
      tools:
        - name: digest-security-advisories
          description: "Given a GitHub organization name, retrieve all open Dependabot alerts grouped by severity and post a weekly digest to the security Slack channel. Use for weekly security hygiene reporting."
          inputParameters:
            - name: github_org
              in: body
              type: string
              description: "GitHub organization name to scan (e.g. walmart)."
            - name: severity_filter
              in: body
              type: string
              description: "Minimum severity to include: critical, high, medium, low."
          steps:
            - name: get-alerts
              type: call
              call: github-security.list-org-alerts
              with:
                org: "{{github_org}}"
                severity: "{{severity_filter}}"
            - name: post-digest
              type: call
              call: slack-security.post-message
              with:
                channel: "security-advisories"
                text: "Weekly security advisory digest for {{github_org}}: {{get-alerts.total_count}} open alerts (Critical: {{get-alerts.critical_count}}, High: {{get-alerts.high_count}}). Review in GitHub Security tab."
  consumes:
    - type: http
      namespace: github-security
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-alerts
          path: "/orgs/{{org}}/dependabot/alerts"
          inputParameters:
            - name: org
              in: path
            - name: severity
              in: query
          operations:
            - name: list-org-alerts
              method: GET
    - type: http
      namespace: slack-security
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches Google Analytics e-commerce conversion data, stores results in Snowflake, and posts a conversion summary to the digital marketing Slack channel.

naftiko: "0.5"
info:
  label: "Google Analytics E-Commerce Conversion Report"
  description: "Fetches Google Analytics e-commerce conversion data, stores results in Snowflake, and posts a conversion summary to the digital marketing Slack channel."
  tags:
    - analytics
    - google-analytics
    - snowflake
    - slack
    - e-commerce
capability:
  exposes:
    - type: mcp
      namespace: ecom-analytics
      port: 8080
      tools:
        - name: generate-conversion-report
          description: "Given a date range and property ID, fetch GA4 e-commerce data, load to Snowflake, and post summary to marketing. Use for weekly conversion rate reporting."
          inputParameters:
            - name: property_id
              in: body
              type: string
              description: "Google Analytics 4 property ID."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD."
          steps:
            - name: get-conversion-data
              type: call
              call: ga4.run-report
              with:
                property_id: "{{property_id}}"
                date_range_start: "{{start_date}}"
                date_range_end: "{{end_date}}"
            - name: load-to-snowflake
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO DIGITAL.GA_CONVERSIONS (property_id, period_start, period_end, sessions, transactions, conversion_rate, revenue) VALUES ('{{property_id}}', '{{start_date}}', '{{end_date}}', {{get-conversion-data.sessions}}, {{get-conversion-data.transactions}}, {{get-conversion-data.conversion_rate}}, {{get-conversion-data.revenue}})"
            - name: post-summary
              type: call
              call: slack.post-message
              with:
                channel: "digital-marketing"
                text: "E-commerce conversion report ({{start_date}} to {{end_date}}): {{get-conversion-data.sessions}} sessions, {{get-conversion-data.conversion_rate}}% CVR, ${{get-conversion-data.revenue}} revenue."
  consumes:
    - type: http
      namespace: ga4
      baseUri: "https://analyticsdata.googleapis.com/v1beta"
      authentication:
        type: bearer
        token: "$secrets.google_analytics_token"
      resources:
        - name: reports
          path: "/properties/{{property_id}}:runReport"
          inputParameters:
            - name: property_id
              in: path
          operations:
            - name: run-report
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Detects Google Cloud billing anomalies above a spend threshold and notifies the FinOps Slack channel with a cost breakdown and recommended actions.

naftiko: "0.5"
info:
  label: "Google Cloud Cost Anomaly Responder"
  description: "Detects Google Cloud billing anomalies above a spend threshold and notifies the FinOps Slack channel with a cost breakdown and recommended actions."
  tags:
    - cloud
    - finops
    - google-cloud
    - slack
    - cost-management
capability:
  exposes:
    - type: mcp
      namespace: cloud-finops
      port: 8080
      tools:
        - name: respond-to-cost-anomaly
          description: "Given a GCP billing account ID and anomaly threshold in USD, retrieve daily cost data and post an anomaly report to the FinOps Slack channel. Use when automated billing alerts fire above acceptable variance."
          inputParameters:
            - name: billing_account_id
              in: body
              type: string
              description: "Google Cloud billing account ID (e.g. 01234A-56789B-CDEF00)."
            - name: threshold_usd
              in: body
              type: number
              description: "Daily spend threshold in USD above which to alert."
          steps:
            - name: get-billing-data
              type: call
              call: gcp-billing.get-billing-info
              with:
                billing_account_id: "{{billing_account_id}}"
            - name: post-anomaly-report
              type: call
              call: slack-finops.post-message
              with:
                channel: "cloud-finops"
                text: "GCP cost anomaly: Billing account {{billing_account_id}} exceeded threshold of ${{threshold_usd}}. Current period cost: {{get-billing-data.cost}}. Top project: {{get-billing-data.top_project}}."
  consumes:
    - type: http
      namespace: gcp-billing
      baseUri: "https://cloudbilling.googleapis.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: billing-accounts
          path: "/billingAccounts/{{billing_account_id}}"
          inputParameters:
            - name: billing_account_id
              in: path
          operations:
            - name: get-billing-info
              method: GET
    - type: http
      namespace: slack-finops
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks grocery pickup order readiness in SAP, updates the customer record in Salesforce, and sends a pickup notification via Microsoft Teams to the store fulfillment team.

naftiko: "0.5"
info:
  label: "Grocery Pickup Order Status Notifier"
  description: "Checks grocery pickup order readiness in SAP, updates the customer record in Salesforce, and sends a pickup notification via Microsoft Teams to the store fulfillment team."
  tags:
    - e-commerce
    - grocery
    - sap
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: grocery-ops
      port: 8080
      tools:
        - name: notify-pickup-ready
          description: "Given an order number and store number, check SAP fulfillment status, update Salesforce, and notify the store team. Use when grocery pickup orders are ready for customer collection."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "Grocery pickup order number."
            - name: store_number
              in: body
              type: string
              description: "Store number."
          steps:
            - name: get-order-status
              type: call
              call: sap.get-order-status
              with:
                order_number: "{{order_number}}"
            - name: update-customer-record
              type: call
              call: salesforce.update-order
              with:
                order_number: "{{order_number}}"
                status: "{{get-order-status.fulfillment_status}}"
            - name: notify-store-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: grocery-fulfillment
                channel: store-{{store_number}}
                text: "Pickup order {{order_number}} is {{get-order-status.fulfillment_status}}. Items: {{get-order-status.item_count}}. Customer ETA: {{get-order-status.pickup_window}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/A_SalesOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-order-status
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://walmart.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Order/{{order_number}}"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: update-order
              method: PATCH
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a new HubSpot contact meets lead scoring criteria, creates a Salesforce lead and notifies the sales team via Slack.

naftiko: "0.5"
info:
  label: "HubSpot Contact to Salesforce Lead Sync"
  description: "When a new HubSpot contact meets lead scoring criteria, creates a Salesforce lead and notifies the sales team via Slack."
  tags:
    - marketing
    - hubspot
    - salesforce
    - slack
    - lead-management
capability:
  exposes:
    - type: mcp
      namespace: lead-ops
      port: 8080
      tools:
        - name: sync-hubspot-lead
          description: "Given a HubSpot contact ID, fetch contact details, create a Salesforce lead, and notify sales. Use when marketing-qualified leads are identified."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "HubSpot contact ID."
          steps:
            - name: get-contact
              type: call
              call: hubspot.get-contact
              with:
                contact_id: "{{contact_id}}"
            - name: create-lead
              type: call
              call: salesforce.create-lead
              with:
                first_name: "{{get-contact.firstname}}"
                last_name: "{{get-contact.lastname}}"
                email: "{{get-contact.email}}"
                company: "{{get-contact.company}}"
                lead_source: HubSpot
            - name: notify-sales
              type: call
              call: slack.post-message
              with:
                channel: "sales-leads"
                text: "New MQL from HubSpot: {{get-contact.firstname}} {{get-contact.lastname}} at {{get-contact.company}}. Salesforce lead: {{create-lead.id}}."
  consumes:
    - type: http
      namespace: hubspot
      baseUri: "https://api.hubapi.com"
      authentication:
        type: bearer
        token: "$secrets.hubspot_token"
      resources:
        - name: contacts
          path: "/crm/v3/objects/contacts/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://walmart.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead"
          operations:
            - name: create-lead
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a Jira issue by key and returns its summary, status, assignee, and priority.

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves a Jira issue by key and returns its summary, status, assignee, and priority."
  tags:
    - devops
    - jira
    - issue-tracking
capability:
  exposes:
    - type: mcp
      namespace: issue-tracking
      port: 8080
      tools:
        - name: get-issue
          description: "Given a Jira issue key, return its summary, status, assignee, priority, and sprint. Use for engineering standup preparation and issue triage."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key (e.g. PROJ-1234)."
          call: jira.get-issue
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Retrieves completed sprint data from Jira, calculates velocity metrics, and publishes the summary to the engineering Confluence space and Slack channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "Retrieves completed sprint data from Jira, calculates velocity metrics, and publishes the summary to the engineering Confluence space and Slack channel."
  tags:
    - devops
    - jira
    - slack
    - reporting
    - agile
capability:
  exposes:
    - type: mcp
      namespace: agile-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity
          description: "Given a Jira board ID and sprint ID, retrieve completed sprint story points, compute velocity, and post the report to the engineering Slack channel. Use after each sprint close to track team throughput."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "Jira board ID (numeric string)."
            - name: sprint_id
              in: body
              type: string
              description: "Jira sprint ID for the completed sprint."
          steps:
            - name: get-sprint
              type: call
              call: jira-sprint.get-sprint
              with:
                sprint_id: "{{sprint_id}}"
            - name: get-issues
              type: call
              call: jira-sprint.search-issues
              with:
                jql: "sprint = {{sprint_id}} AND status = Done"
            - name: post-velocity
              type: call
              call: slack-agile.post-message
              with:
                channel: "engineering-sprints"
                text: "Sprint {{get-sprint.name}} closed. Issues completed: {{get-issues.total}}. Goal: {{get-sprint.goal}}"
  consumes:
    - type: http
      namespace: jira-sprint
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: sprints
          path: "/sprint/{{sprint_id}}"
          inputParameters:
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint
              method: GET
        - name: issues
          path: "/search"
          inputParameters:
            - name: jql
              in: query
          operations:
            - name: search-issues
              method: GET
    - type: http
      namespace: slack-agile
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks Kafka consumer group lag for critical supply chain topics and posts an alert to the data infrastructure Slack channel when lag exceeds acceptable thresholds.

naftiko: "0.5"
info:
  label: "Kafka Consumer Lag Monitor"
  description: "Checks Kafka consumer group lag for critical supply chain topics and posts an alert to the data infrastructure Slack channel when lag exceeds acceptable thresholds."
  tags:
    - data
    - kafka
    - slack
    - monitoring
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: kafka-ops
      port: 8080
      tools:
        - name: check-consumer-lag
          description: "Given a Kafka consumer group ID and maximum allowed lag, check current consumer lag via the Kafka Admin API and alert the data-infrastructure Slack channel if the lag threshold is exceeded. Use for supply chain event streaming health checks."
          inputParameters:
            - name: consumer_group_id
              in: body
              type: string
              description: "Kafka consumer group ID to monitor (e.g. supply-chain-inventory-consumer)."
            - name: max_lag_threshold
              in: body
              type: integer
              description: "Maximum allowable consumer lag in messages before alerting."
          steps:
            - name: get-consumer-lag
              type: call
              call: kafka-admin.get-consumer-group
              with:
                group_id: "{{consumer_group_id}}"
            - name: post-lag-alert
              type: call
              call: slack-infra.post-message
              with:
                channel: "data-infrastructure"
                text: "Kafka consumer lag alert: Group {{consumer_group_id}} has lag {{get-consumer-lag.total_lag}} (max allowed: {{max_lag_threshold}}). Topic: {{get-consumer-lag.max_lag_topic}}."
  consumes:
    - type: http
      namespace: kafka-admin
      baseUri: "https://walmart-kafka-admin.internal/v3"
      authentication:
        type: bearer
        token: "$secrets.kafka_admin_token"
      resources:
        - name: consumer-groups
          path: "/clusters/{{cluster_id}}/consumer-groups/{{group_id}}"
          inputParameters:
            - name: cluster_id
              in: path
            - name: group_id
              in: path
          operations:
            - name: get-consumer-group
              method: GET
    - type: http
      namespace: slack-infra
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks Kubernetes deployment rollout status via the cluster API and posts a summary to the platform engineering Slack channel, creating a ServiceNow change task if rollout fails.

naftiko: "0.5"
info:
  label: "Kubernetes Deployment Rollout Monitor"
  description: "Checks Kubernetes deployment rollout status via the cluster API and posts a summary to the platform engineering Slack channel, creating a ServiceNow change task if rollout fails."
  tags:
    - devops
    - kubernetes
    - servicenow
    - slack
    - cloud
capability:
  exposes:
    - type: mcp
      namespace: platform-ops
      port: 8080
      tools:
        - name: monitor-deployment-rollout
          description: "Given a Kubernetes namespace and deployment name, retrieve rollout status and notify the platform-eng Slack channel. If the rollout is degraded, create a ServiceNow change task. Use after deployments to production clusters."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Kubernetes namespace where the deployment lives (e.g. supply-chain-prod)."
            - name: deployment_name
              in: body
              type: string
              description: "Name of the Kubernetes deployment to monitor."
          steps:
            - name: get-deployment-status
              type: call
              call: k8s.get-deployment
              with:
                namespace: "{{namespace}}"
                name: "{{deployment_name}}"
            - name: create-change-task
              type: call
              call: servicenow-change.create-change
              with:
                short_description: "Rollout issue: {{deployment_name}} in {{namespace}}"
                category: software
                description: "Deployment {{deployment_name}} in namespace {{namespace}} is degraded. Available replicas: {{get-deployment-status.available_replicas}}"
            - name: notify-platform
              type: call
              call: slack-platform.post-message
              with:
                channel: "platform-engineering"
                text: "Rollout status for {{deployment_name}} ({{namespace}}): Ready={{get-deployment-status.ready_replicas}}/{{get-deployment-status.desired_replicas}}. Change task: {{create-change-task.number}}"
  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://walmart-k8s-api.internal/apis/apps/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_service_account_token"
      resources:
        - name: deployments
          path: "/namespaces/{{namespace}}/deployments/{{name}}"
          inputParameters:
            - name: namespace
              in: path
            - name: name
              in: path
          operations:
            - name: get-deployment
              method: GET
    - type: http
      namespace: servicenow-change
      baseUri: "https://walmart.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: slack-platform
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Kubernetes Pod CrashLoop Responder"
  description: "When a Kubernetes pod enters CrashLoopBackOff, collects pod logs via Datadog, creates a ServiceNow incident, and pages the on-call engineer via PagerDuty."
  tags:
    - infrastructure
    - kubernetes
    - datadog
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: k8s-ops
      port: 8080
      tools:
        - name: handle-crashloop
          description: "Given a namespace, pod name, and cluster, collect recent logs, create an incident, and page on-call. Use when Kubernetes pods enter CrashLoopBackOff."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Kubernetes namespace."
            - name: pod_name
              in: body
              type: string
              description: "Name of the crashing pod."
            - name: cluster
              in: body
              type: string
              description: "Kubernetes cluster name."
          steps:
            - name: get-pod-logs
              type: call
              call: datadog.search-logs
              with:
                query: "kube_namespace:{{namespace}} pod_name:{{pod_name}} cluster_name:{{cluster}}"
                time_range: "15m"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: infrastructure
                urgency: 1
                short_description: "CrashLoopBackOff: {{pod_name}} in {{namespace}}/{{cluster}}"
                description: "Recent logs: {{get-pod-logs.summary}}."
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "{{cluster}}-k8s"
                title: "CrashLoopBackOff: {{pod_name}} in {{namespace}}"
                urgency: high
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
      resources:
        - name: logs
          path: "/logs/events/search"
          operations:
            - name: search-logs
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Fetches LinkedIn job posting analytics, syncs metrics to Snowflake, and sends a weekly summary to the talent acquisition Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "LinkedIn Job Posting Performance Sync"
  description: "Fetches LinkedIn job posting analytics, syncs metrics to Snowflake, and sends a weekly summary to the talent acquisition Microsoft Teams channel."
  tags:
    - recruiting
    - linkedin
    - snowflake
    - microsoft-teams
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: talent-analytics
      port: 8080
      tools:
        - name: sync-job-posting-metrics
          description: "Given a date range, fetch LinkedIn job posting performance, load into Snowflake, and post a summary to talent acquisition. Use for weekly recruiting pipeline reviews."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD."
          steps:
            - name: get-linkedin-metrics
              type: call
              call: linkedin.get-job-analytics
              with:
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: load-to-snowflake
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO HR.LINKEDIN_JOB_METRICS (period_start, period_end, views, applies, quality_applies) VALUES ('{{start_date}}', '{{end_date}}', {{get-linkedin-metrics.views}}, {{get-linkedin-metrics.applies}}, {{get-linkedin-metrics.quality_applies}})"
            - name: post-summary
              type: call
              call: msteams.send-channel-message
              with:
                team_id: talent-acquisition
                channel: analytics
                text: "LinkedIn job posting metrics for {{start_date}} to {{end_date}}: {{get-linkedin-metrics.views}} views, {{get-linkedin-metrics.applies}} applies, {{get-linkedin-metrics.quality_applies}} quality applies."
  consumes:
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-analytics
          path: "/jobAnalytics"
          operations:
            - name: get-job-analytics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Publishes a new job requisition from Workday to LinkedIn Jobs and logs the posting record in Salesforce for recruiting pipeline tracking.

naftiko: "0.5"
info:
  label: "LinkedIn Job Posting Sync"
  description: "Publishes a new job requisition from Workday to LinkedIn Jobs and logs the posting record in Salesforce for recruiting pipeline tracking."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: recruiting
      port: 8080
      tools:
        - name: publish-job-to-linkedin
          description: "Given a Workday job requisition ID, retrieve job details, post the opening to LinkedIn Jobs, and log the external posting record in Salesforce. Use when a requisition is approved and ready to advertise."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Workday job requisition ID (e.g. JR-00045678)."
            - name: linkedin_organization_id
              in: body
              type: string
              description: "LinkedIn organization ID for the Walmart company page."
          steps:
            - name: get-requisition
              type: call
              call: workday-jobs.get-job-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: post-to-linkedin
              type: call
              call: linkedin.create-job-posting
              with:
                organization_id: "{{linkedin_organization_id}}"
                title: "{{get-requisition.job_title}}"
                description: "{{get-requisition.job_description}}"
                location: "{{get-requisition.location}}"
            - name: log-in-salesforce
              type: call
              call: salesforce-recruiting.create-record
              with:
                object_type: Job_Posting__c
                requisition_id: "{{requisition_id}}"
                linkedin_posting_id: "{{post-to-linkedin.id}}"
  consumes:
    - type: http
      namespace: workday-jobs
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/walmart/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-job-requisition
              method: GET
    - type: http
      namespace: linkedin
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: create-job-posting
              method: POST
    - type: http
      namespace: salesforce-recruiting
      baseUri: "https://walmart.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: records
          path: "/sobjects/{{object_type}}"
          inputParameters:
            - name: object_type
              in: path
          operations:
            - name: create-record
              method: POST

Pulls weekly campaign performance metrics from Marketo, writes a summary record to Snowflake, and publishes a digest to the marketing Slack channel.

naftiko: "0.5"
info:
  label: "Marketo Campaign Performance Digest"
  description: "Pulls weekly campaign performance metrics from Marketo, writes a summary record to Snowflake, and publishes a digest to the marketing Slack channel."
  tags:
    - marketing
    - marketo
    - snowflake
    - slack
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: marketing-reporting
      port: 8080
      tools:
        - name: digest-campaign-performance
          description: "Given a Marketo program ID and date range, retrieve email performance metrics, persist the summary to Snowflake, and post a digest to the marketing Slack channel. Use for weekly marketing performance reviews."
          inputParameters:
            - name: program_id
              in: body
              type: string
              description: "Marketo program ID for the campaign to analyze."
            - name: start_date
              in: body
              type: string
              description: "Reporting period start date in ISO 8601 format (YYYY-MM-DD)."
            - name: end_date
              in: body
              type: string
              description: "Reporting period end date in ISO 8601 format (YYYY-MM-DD)."
          steps:
            - name: get-campaign-stats
              type: call
              call: marketo.get-program-stats
              with:
                program_id: "{{program_id}}"
                start_date: "{{start_date}}"
                end_date: "{{end_date}}"
            - name: write-snowflake-summary
              type: call
              call: snowflake.insert-row
              with:
                table: "MARKETING.CAMPAIGN_PERFORMANCE"
                program_id: "{{program_id}}"
                sent: "{{get-campaign-stats.sent}}"
                opens: "{{get-campaign-stats.opens}}"
                clicks: "{{get-campaign-stats.clicks}}"
            - name: post-digest
              type: call
              call: slack-marketing.post-message
              with:
                channel: "marketing-analytics"
                text: "Campaign digest ({{start_date}} to {{end_date}}): Sent={{get-campaign-stats.sent}}, Opens={{get-campaign-stats.opens}}, Clicks={{get-campaign-stats.clicks}}, Unsubscribes={{get-campaign-stats.unsubscribes}}."
  consumes:
    - type: http
      namespace: marketo
      baseUri: "https://walmart.mktorest.com/rest/v1"
      authentication:
        type: bearer
        token: "$secrets.marketo_token"
      resources:
        - name: program-stats
          path: "/stats/usage/daybyprogram.json"
          inputParameters:
            - name: program_id
              in: query
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: get-program-stats
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-row
              method: POST
    - type: http
      namespace: slack-marketing
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches Marketo email campaign performance metrics, loads them into Snowflake for analysis, and posts a summary to the marketing Slack channel.

naftiko: "0.5"
info:
  label: "Marketo Email Campaign to Snowflake Analytics"
  description: "Fetches Marketo email campaign performance metrics, loads them into Snowflake for analysis, and posts a summary to the marketing Slack channel."
  tags:
    - marketing
    - marketo
    - snowflake
    - slack
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: marketing-analytics
      port: 8080
      tools:
        - name: sync-campaign-metrics
          description: "Given a Marketo campaign ID, fetch email performance metrics, insert into Snowflake, and post a summary to marketing. Use for campaign ROI analysis."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "Marketo email campaign ID."
          steps:
            - name: get-campaign-stats
              type: call
              call: marketo.get-campaign-stats
              with:
                campaign_id: "{{campaign_id}}"
            - name: load-to-snowflake
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO MARKETING.CAMPAIGN_METRICS (campaign_id, sends, opens, clicks, open_rate, click_rate) VALUES ('{{campaign_id}}', {{get-campaign-stats.sends}}, {{get-campaign-stats.opens}}, {{get-campaign-stats.clicks}}, {{get-campaign-stats.open_rate}}, {{get-campaign-stats.click_rate}})"
            - name: post-summary
              type: call
              call: slack.post-message
              with:
                channel: "marketing-analytics"
                text: "Campaign {{campaign_id}} results: {{get-campaign-stats.sends}} sent, {{get-campaign-stats.open_rate}}% open rate, {{get-campaign-stats.click_rate}}% CTR."
  consumes:
    - type: http
      namespace: marketo
      baseUri: "https://walmart.mktorest.com/rest"
      authentication:
        type: bearer
        token: "$secrets.marketo_token"
      resources:
        - name: campaigns
          path: "/v1/campaigns/{{campaign_id}}/stats.json"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-stats
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Lists all channels within a Microsoft Teams team for directory and communication purposes.

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

When a new associate is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder, and sends a Microsoft Teams welcome message with first-day instructions.

naftiko: "0.5"
info:
  label: "New Associate Onboarding Orchestrator"
  description: "When a new associate is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder, and sends a Microsoft Teams welcome message with first-day instructions."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-associate-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence across ServiceNow, Microsoft Teams, and SharePoint. Invoke when a new retail or corporate associate begins employment."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new associate."
            - name: start_date
              in: body
              type: string
              description: "Associate start date in ISO 8601 format (YYYY-MM-DD)."
            - name: store_number
              in: body
              type: string
              description: "Walmart store or facility number the associate is assigned to."
          steps:
            - name: get-worker
              type: call
              call: workday.get-worker
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-onboarding-ticket
              type: call
              call: servicenow.create-incident
              with:
                category: hr_onboarding
                short_description: "New associate onboarding: {{get-worker.full_name}} — Store {{store_number}}"
                assigned_group: IT_Onboarding
            - name: send-welcome-message
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Walmart, {{get-worker.first_name}}! Your onboarding ticket is {{open-onboarding-ticket.number}}. Your start date is {{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: "/walmart/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.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: chats
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

When New Relic detects an error rate spike post-deployment, triggers a GitHub Actions rollback workflow and creates a ServiceNow incident.

naftiko: "0.5"
info:
  label: "New Relic Error Rate to Rollback Trigger"
  description: "When New Relic detects an error rate spike post-deployment, triggers a GitHub Actions rollback workflow and creates a ServiceNow incident."
  tags:
    - devops
    - new-relic
    - github
    - servicenow
    - deployment
capability:
  exposes:
    - type: mcp
      namespace: deploy-ops
      port: 8080
      tools:
        - name: handle-error-rate-spike
          description: "Given a New Relic application ID and error threshold, check current error rate, trigger rollback if exceeded, and create an incident. Use for post-deployment error monitoring."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "New Relic application ID."
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository for rollback."
            - name: previous_sha
              in: body
              type: string
              description: "Git SHA to roll back to."
          steps:
            - name: get-error-rate
              type: call
              call: newrelic.get-app-metrics
              with:
                app_id: "{{app_id}}"
            - name: trigger-rollback
              type: call
              call: github.dispatch-workflow
              with:
                repo: "{{repo_name}}"
                workflow: rollback.yml
                ref: main
                inputs_sha: "{{previous_sha}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: deployment
                urgency: 1
                short_description: "Auto-rollback triggered: {{repo_name}} — error rate {{get-error-rate.error_percentage}}%"
                description: "Rolling back to {{previous_sha}}. New Relic app: {{app_id}}."
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apiKey
        key: "$secrets.newrelic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}/metrics/data.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app-metrics
              method: GET
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflows
          path: "/repos/{{repo}}/actions/workflows/{{workflow}}/dispatches"
          inputParameters:
            - name: repo
              in: path
            - name: workflow
              in: path
          operations:
            - name: dispatch-workflow
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.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

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

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

When Okta detects a suspicious login event, creates a security incident in ServiceNow, suspends the user session, and alerts the SOC Slack channel.

naftiko: "0.5"
info:
  label: "Okta Suspicious Login to Security Incident"
  description: "When Okta detects a suspicious login event, creates a security incident in ServiceNow, suspends the user session, and alerts the SOC Slack channel."
  tags:
    - security
    - okta
    - servicenow
    - slack
    - threat-detection
capability:
  exposes:
    - type: mcp
      namespace: threat-response
      port: 8080
      tools:
        - name: handle-suspicious-login
          description: "Given an Okta event ID and user login, fetch event details, create a security incident, suspend sessions, and alert SOC. Use when Okta threat intelligence flags suspicious activity."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "Okta system log event ID."
            - name: user_login
              in: body
              type: string
              description: "Affected user login email."
          steps:
            - name: get-event
              type: call
              call: okta.get-event
              with:
                event_id: "{{event_id}}"
            - name: suspend-sessions
              type: call
              call: okta.clear-sessions
              with:
                user_login: "{{user_login}}"
            - name: create-security-incident
              type: call
              call: servicenow.create-incident
              with:
                category: security
                urgency: 1
                short_description: "Suspicious login: {{user_login}} from {{get-event.client_ip}}"
                description: "Event: {{event_id}}. Location: {{get-event.geo_location}}. Reason: {{get-event.outcome_reason}}."
            - name: alert-soc
              type: call
              call: slack.post-message
              with:
                channel: "soc-alerts"
                text: "Suspicious login for {{user_login}} from {{get-event.client_ip}} ({{get-event.geo_location}}). Sessions cleared. Incident: {{create-security-incident.number}}."
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://walmart.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: events
          path: "/logs?filter=uuid+eq+\"{{event_id}}\""
          inputParameters:
            - name: event_id
              in: query
          operations:
            - name: get-event
              method: GET
        - name: sessions
          path: "/users/{{user_login}}/sessions"
          inputParameters:
            - name: user_login
              in: path
          operations:
            - name: clear-sessions
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Looks up an Okta user by login email and returns their profile, status, and group memberships.

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

Retrieves the current on-call engineer for a PagerDuty schedule.

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

Looks up prescription fulfillment status in SAP, updates the customer case in Salesforce, and sends a patient notification via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Pharmacy Prescription Fulfillment Tracker"
  description: "Looks up prescription fulfillment status in SAP, updates the customer case in Salesforce, and sends a patient notification via Microsoft Teams."
  tags:
    - pharmacy
    - sap
    - salesforce
    - microsoft-teams
    - healthcare
capability:
  exposes:
    - type: mcp
      namespace: pharmacy-ops
      port: 8080
      tools:
        - name: track-prescription
          description: "Given a prescription ID and Salesforce case ID, look up fulfillment status in SAP, update the case, and notify the pharmacy team. Use for prescription inquiry resolution."
          inputParameters:
            - name: prescription_id
              in: body
              type: string
              description: "Pharmacy prescription ID."
            - name: case_id
              in: body
              type: string
              description: "Salesforce case ID."
            - name: store_number
              in: body
              type: string
              description: "Store number."
          steps:
            - name: get-fulfillment-status
              type: call
              call: sap.get-prescription
              with:
                prescription_id: "{{prescription_id}}"
            - name: update-case
              type: call
              call: salesforce.update-case
              with:
                case_id: "{{case_id}}"
                comment: "Prescription {{prescription_id}} status: {{get-fulfillment-status.status}}. Ready at Store {{store_number}}: {{get-fulfillment-status.ready_date}}."
            - name: notify-pharmacy
              type: call
              call: msteams.send-channel-message
              with:
                team_id: pharmacy-ops
                channel: store-{{store_number}}
                text: "Prescription {{prescription_id}} update: {{get-fulfillment-status.status}}. Case: {{case_id}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_PHARMACY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: prescriptions
          path: "/A_Prescription('{{prescription_id}}')"
          inputParameters:
            - name: prescription_id
              in: path
          operations:
            - name: get-prescription
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://walmart.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
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Checks the latest refresh status for a Power BI dataset including start time, end time, and result.

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

Triggers a Power BI dataset refresh for a specified workspace and dataset, then posts the refresh status to the analytics Slack channel.

naftiko: "0.5"
info:
  label: "Power BI Report Refresh Trigger"
  description: "Triggers a Power BI dataset refresh for a specified workspace and dataset, then posts the refresh status to the analytics Slack channel."
  tags:
    - data
    - analytics
    - power-bi
    - slack
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: bi-reporting
      port: 8080
      tools:
        - name: trigger-report-refresh
          description: "Given a Power BI workspace ID and dataset ID, trigger a dataset refresh and post the result to the analytics Slack channel. Use to refresh dashboards after ETL completion."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Power BI workspace (group) ID containing the dataset."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID to refresh."
          steps:
            - name: refresh-dataset
              type: call
              call: powerbi.trigger-refresh
              with:
                group_id: "{{workspace_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-analytics
              type: call
              call: slack-analytics.post-message
              with:
                channel: "analytics-ops"
                text: "Power BI dataset refresh triggered for dataset {{dataset_id}} in workspace {{workspace_id}}. Status: {{refresh-dataset.status}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: slack-analytics
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a product recall is initiated, queries SAP for affected stores, creates a Salesforce case for tracking, and broadcasts the recall to store managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Product Recall Notification Orchestrator"
  description: "When a product recall is initiated, queries SAP for affected stores, creates a Salesforce case for tracking, and broadcasts the recall to store managers via Microsoft Teams."
  tags:
    - compliance
    - sap
    - salesforce
    - microsoft-teams
    - product-safety
capability:
  exposes:
    - type: mcp
      namespace: product-safety
      port: 8080
      tools:
        - name: process-product-recall
          description: "Given a material number and recall reason, find affected stores in SAP, create a Salesforce tracking case, and notify store managers. Use when product safety recalls are issued."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number of the recalled product."
            - name: recall_reason
              in: body
              type: string
              description: "Reason for the recall."
          steps:
            - name: get-affected-stores
              type: call
              call: sap.get-stock-by-plant
              with:
                material_number: "{{material_number}}"
            - name: create-recall-case
              type: call
              call: salesforce.create-case
              with:
                subject: "Product recall: {{material_number}}"
                description: "{{recall_reason}}. Affected stores: {{get-affected-stores.plant_count}}."
                priority: Critical
            - name: notify-store-managers
              type: call
              call: msteams.send-channel-message
              with:
                team_id: store-managers
                channel: recalls
                text: "PRODUCT RECALL: Material {{material_number}}. Reason: {{recall_reason}}. {{get-affected-stores.plant_count}} stores affected. Pull from shelves immediately. Case: {{create-recall-case.case_number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: stock
          path: "/A_MatlStkInAcctMod?$filter=Material eq '{{material_number}}'"
          inputParameters:
            - name: material_number
              in: query
          operations:
            - name: get-stock-by-plant
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://walmart.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Snowflake for compliance metrics, generates a report in SharePoint, and distributes it to the compliance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Audit Report Generator"
  description: "Queries Snowflake for compliance metrics, generates a report in SharePoint, and distributes it to the compliance team via Microsoft Teams."
  tags:
    - compliance
    - snowflake
    - sharepoint
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: generate-compliance-report
          description: "Given a fiscal quarter and year, query compliance metrics from Snowflake, create a SharePoint report, and notify the compliance team. Use for quarterly SOX and regulatory reviews."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter (e.g. Q1, Q2, Q3, Q4)."
            - name: fiscal_year
              in: body
              type: string
              description: "Fiscal year (e.g. 2026)."
          steps:
            - name: query-metrics
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT control_area, pass_count, fail_count, pass_rate FROM COMPLIANCE.QUARTERLY_METRICS WHERE fiscal_quarter = '{{fiscal_quarter}}' AND fiscal_year = '{{fiscal_year}}'"
            - name: create-report
              type: call
              call: sharepoint.create-document
              with:
                site: "compliance-docs"
                name: "Compliance-Report-{{fiscal_quarter}}-{{fiscal_year}}.xlsx"
                data: "{{query-metrics.results}}"
            - name: notify-team
              type: call
              call: msteams.send-channel-message
              with:
                team_id: compliance-team
                channel: general
                text: "Quarterly compliance report for {{fiscal_quarter}} {{fiscal_year}} is available: {{create-report.web_url}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: documents
          path: "/sites/walmart.sharepoint.com/drive/root:/{{name}}:/content"
          inputParameters:
            - name: name
              in: path
          operations:
            - name: create-document
              method: PUT
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves a Salesforce account by ID and returns company name, industry, annual revenue, and account owner.

naftiko: "0.5"
info:
  label: "Salesforce Account Lookup"
  description: "Retrieves a Salesforce account by ID and returns company name, industry, annual revenue, and account owner."
  tags:
    - sales
    - salesforce
    - account
capability:
  exposes:
    - type: mcp
      namespace: sales
      port: 8080
      tools:
        - name: get-account
          description: "Given a Salesforce account ID, return the company name, industry, annual revenue, and account owner. Use for sales team account reviews."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce 18-character account ID."
          call: salesforce.get-account
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: industry
              type: string
              mapping: "$.Industry"
            - name: annual_revenue
              type: string
              mapping: "$.AnnualRevenue"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://walmart.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

When a Salesforce service case is escalated to priority 1, creates a linked ServiceNow incident and notifies the customer success Slack channel with full case context.

naftiko: "0.5"
info:
  label: "Salesforce Case Escalation to ServiceNow"
  description: "When a Salesforce service case is escalated to priority 1, creates a linked ServiceNow incident and notifies the customer success Slack channel with full case context."
  tags:
    - customer-support
    - salesforce
    - servicenow
    - slack
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: customer-support
      port: 8080
      tools:
        - name: escalate-salesforce-case
          description: "Given a Salesforce case ID, retrieve case details, create a linked ServiceNow P1 incident, and notify the customer-success Slack channel. Invoke when a Salesforce case priority is set to Critical."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "Salesforce case ID to escalate (18-character ID)."
          steps:
            - name: get-case
              type: call
              call: salesforce-cases.get-case
              with:
                case_id: "{{case_id}}"
            - name: create-incident
              type: call
              call: servicenow-support.create-incident
              with:
                category: customer_support
                impact: 1
                urgency: 1
                short_description: "Escalated case: {{get-case.subject}}"
                description: "Salesforce case {{case_id}}: {{get-case.description}}\nAccount: {{get-case.account_name}}\nContact: {{get-case.contact_name}}"
            - name: notify-cs
              type: call
              call: slack-cs.post-message
              with:
                channel: "customer-success"
                text: "P1 case escalated: {{get-case.subject}} | Account: {{get-case.account_name}} | ServiceNow: {{create-incident.number}} | Salesforce: {{case_id}}"
  consumes:
    - type: http
      namespace: salesforce-cases
      baseUri: "https://walmart.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: servicenow-support
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack-cs
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Converts a qualified Salesforce lead into an opportunity, enriches it with Snowflake account intelligence, and notifies the assigned sales rep via Slack.

naftiko: "0.5"
info:
  label: "Salesforce Lead-to-Opportunity Sync"
  description: "Converts a qualified Salesforce lead into an opportunity, enriches it with Snowflake account intelligence, and notifies the assigned sales rep via Slack."
  tags:
    - sales
    - crm
    - salesforce
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: crm-sales
      port: 8080
      tools:
        - name: convert-lead-to-opportunity
          description: "Given a Salesforce lead ID, convert it to an opportunity, enrich with Snowflake account data, and notify the assigned rep in Slack. Use when a lead reaches the qualified stage."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "Salesforce lead ID to convert (18-character Salesforce ID)."
            - name: opportunity_stage
              in: body
              type: string
              description: "Initial opportunity stage (e.g. Prospecting, Qualification)."
          steps:
            - name: get-lead
              type: call
              call: salesforce-leads.get-lead
              with:
                lead_id: "{{lead_id}}"
            - name: create-opportunity
              type: call
              call: salesforce-opps.create-opportunity
              with:
                name: "{{get-lead.company}} — {{get-lead.last_name}}"
                stage: "{{opportunity_stage}}"
                account_id: "{{get-lead.converted_account_id}}"
            - name: notify-rep
              type: call
              call: slack-sales.post-message
              with:
                channel: "sales-notifications"
                text: "New opportunity created: {{create-opportunity.name}} ({{create-opportunity.id}}). Owner: {{get-lead.owner_name}}."
  consumes:
    - type: http
      namespace: salesforce-leads
      baseUri: "https://walmart.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: salesforce-opps
      baseUri: "https://walmart.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST
    - type: http
      namespace: slack-sales
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Salesforce opportunity is closed-won, creates a corresponding sales order in SAP and sends a confirmation to the account owner via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Close to SAP Order"
  description: "When a Salesforce opportunity is closed-won, creates a corresponding sales order in SAP and sends a confirmation to the account owner via Microsoft Teams."
  tags:
    - sales
    - salesforce
    - sap
    - microsoft-teams
    - order-management
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: sync-closed-opportunity
          description: "Given a Salesforce opportunity ID, fetch the closed-won deal details, create a SAP sales order, and notify the account owner in Teams. Use when deals close to trigger downstream fulfillment."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: salesforce.get-opportunity
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-sales-order
              type: call
              call: sap.create-order
              with:
                customer_id: "{{get-opportunity.account_id}}"
                amount: "{{get-opportunity.amount}}"
                currency: "{{get-opportunity.currency}}"
            - name: notify-owner
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-opportunity.owner_email}}"
                text: "Deal {{get-opportunity.name}} closed! SAP order {{create-sales-order.order_number}} created for {{get-opportunity.amount}} {{get-opportunity.currency}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://walmart.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder"
          operations:
            - name: create-order
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When an SAP Ariba RFQ response period closes, compiles bid summaries into Snowflake, creates a Jira evaluation task, and notifies the sourcing team via Slack.

naftiko: "0.5"
info:
  label: "SAP Ariba RFQ Evaluation Workflow"
  description: "When an SAP Ariba RFQ response period closes, compiles bid summaries into Snowflake, creates a Jira evaluation task, and notifies the sourcing team via Slack."
  tags:
    - procurement
    - sap-ariba
    - snowflake
    - jira
    - slack
    - sourcing
capability:
  exposes:
    - type: mcp
      namespace: sourcing
      port: 8080
      tools:
        - name: evaluate-rfq-responses
          description: "Given an Ariba RFQ event ID, compile bid data, create an evaluation task, and notify sourcing. Use when RFQ response periods close."
          inputParameters:
            - name: rfq_event_id
              in: body
              type: string
              description: "SAP Ariba sourcing event ID."
          steps:
            - name: get-bids
              type: call
              call: ariba.get-event-bids
              with:
                event_id: "{{rfq_event_id}}"
            - name: load-bids
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO PROCUREMENT.RFQ_BIDS (event_id, supplier_count, avg_bid, lowest_bid) VALUES ('{{rfq_event_id}}', {{get-bids.supplier_count}}, {{get-bids.avg_bid}}, {{get-bids.lowest_bid}})"
            - name: create-evaluation-task
              type: call
              call: jira.create-issue
              with:
                project: PROC
                issue_type: Task
                summary: "RFQ evaluation: {{rfq_event_id}} — {{get-bids.supplier_count}} bids received"
            - name: notify-sourcing
              type: call
              call: slack.post-message
              with:
                channel: "sourcing-team"
                text: "RFQ {{rfq_event_id}} closed: {{get-bids.supplier_count}} bids. Lowest: ${{get-bids.lowest_bid}}. Evaluation task: {{create-evaluation-task.key}}."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/sourcing/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: events
          path: "/events/{{event_id}}/bids"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-event-bids
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a SAP delivery is delayed past threshold, creates a ServiceNow incident and notifies the logistics team via Slack with alternative routing options.

naftiko: "0.5"
info:
  label: "SAP Delivery Delay Escalation"
  description: "When a SAP delivery is delayed past threshold, creates a ServiceNow incident and notifies the logistics team via Slack with alternative routing options."
  tags:
    - logistics
    - sap
    - servicenow
    - slack
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: logistics
      port: 8080
      tools:
        - name: escalate-delivery-delay
          description: "Given a SAP delivery number, check the delay duration, create a ServiceNow incident, and alert logistics. Use when deliveries exceed SLA thresholds."
          inputParameters:
            - name: delivery_number
              in: body
              type: string
              description: "SAP delivery document number."
          steps:
            - name: get-delivery
              type: call
              call: sap.get-delivery
              with:
                delivery_number: "{{delivery_number}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: logistics
                urgency: 2
                short_description: "Delivery delay: {{delivery_number}} — {{get-delivery.delay_days}} days late"
                description: "Destination: {{get-delivery.ship_to}}. Original ETA: {{get-delivery.planned_date}}. Carrier: {{get-delivery.carrier}}."
            - name: notify-logistics
              type: call
              call: slack.post-message
              with:
                channel: "logistics-ops"
                text: "Delivery {{delivery_number}} delayed {{get-delivery.delay_days}} days. Carrier: {{get-delivery.carrier}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_OutbDeliveryHeader('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: get-delivery
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries SAP for period-close task status, aggregates results in Snowflake, and posts a readiness summary to the finance Microsoft Teams channel.

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

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

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

Validates a SAP supplier invoice against the purchase order and goods receipt, logs discrepancies in Snowflake, and escalates mismatches to the AP team via Slack.

naftiko: "0.5"
info:
  label: "SAP Invoice Three-Way Match Validator"
  description: "Validates a SAP supplier invoice against the purchase order and goods receipt, logs discrepancies in Snowflake, and escalates mismatches to the AP team via Slack."
  tags:
    - finance
    - sap
    - snowflake
    - slack
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: ap-ops
      port: 8080
      tools:
        - name: validate-three-way-match
          description: "Given a SAP invoice number, validate against PO and GR, log results in Snowflake, and escalate mismatches. Use for accounts payable processing."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "SAP invoice document number."
          steps:
            - name: get-invoice
              type: call
              call: sap.get-invoice
              with:
                invoice_number: "{{invoice_number}}"
            - name: get-po
              type: call
              call: sap.get-po
              with:
                po_number: "{{get-invoice.po_number}}"
            - name: log-match-result
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO FINANCE.THREE_WAY_MATCH_LOG (invoice_number, po_number, match_status, variance) VALUES ('{{invoice_number}}', '{{get-invoice.po_number}}', '{{get-invoice.match_status}}', {{get-invoice.variance_amount}})"
            - name: escalate-mismatch
              type: call
              call: slack.post-message
              with:
                channel: "accounts-payable"
                text: "Three-way match result for invoice {{invoice_number}}: {{get-invoice.match_status}}. PO: {{get-invoice.po_number}}. Variance: {{get-invoice.variance_amount}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves SAP material master data by material number including description, unit of measure, and material group.

naftiko: "0.5"
info:
  label: "SAP Material Master Lookup"
  description: "Retrieves SAP material master data by material number including description, unit of measure, and material group."
  tags:
    - supply-chain
    - sap
    - material
capability:
  exposes:
    - type: mcp
      namespace: supply-chain
      port: 8080
      tools:
        - name: get-material
          description: "Given a SAP material number, return the material description, base unit of measure, material group, and gross weight. Use for product data lookups."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
          call: sap-product.get-material
          with:
            material_number: "{{material_number}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.d.ProductDescription"
            - name: base_unit
              type: string
              mapping: "$.d.BaseUnit"
            - name: material_group
              type: string
              mapping: "$.d.ProductGroup"
  consumes:
    - type: http
      namespace: sap-product
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: products
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET

Queries SAP for open items that would block period close, posts a readiness checklist to the finance Slack channel, and creates a ServiceNow task for each blocking item found.

naftiko: "0.5"
info:
  label: "SAP Period Close Readiness Check"
  description: "Queries SAP for open items that would block period close, posts a readiness checklist to the finance Slack channel, and creates a ServiceNow task for each blocking item found."
  tags:
    - finance
    - sap
    - servicenow
    - slack
    - period-close
capability:
  exposes:
    - type: mcp
      namespace: finance-close
      port: 8080
      tools:
        - name: check-period-close-readiness
          description: "Given a SAP company code and fiscal period, check for open purchase orders, unposted journals, and GR/IR mismatches that block period close. Create ServiceNow tasks for blockers and post a readiness summary to the finance Slack channel."
          inputParameters:
            - name: company_code
              in: body
              type: string
              description: "SAP company code (e.g. 1000 for Walmart US)."
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period in YYYYMM format (e.g. 202503)."
          steps:
            - name: check-open-items
              type: call
              call: sap-close.get-open-items
              with:
                company_code: "{{company_code}}"
                fiscal_period: "{{fiscal_period}}"
            - name: create-blocker-task
              type: call
              call: servicenow-finance.create-task
              with:
                category: finance_period_close
                short_description: "Period close blocker: {{company_code}} — {{fiscal_period}}"
                description: "Open items found preventing period close: {{check-open-items.open_count}} items totaling {{check-open-items.total_amount}}"
            - name: post-readiness-summary
              type: call
              call: slack-finance.post-message
              with:
                channel: "finance-close"
                text: "Period close readiness for {{company_code}} / {{fiscal_period}}: {{check-open-items.open_count}} blocking items. ServiceNow: {{create-blocker-task.number}}"
  consumes:
    - type: http
      namespace: sap-close
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/ZFI_PERIOD_CLOSE_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: open-items
          path: "/OpenItemSet"
          inputParameters:
            - name: company_code
              in: query
            - name: fiscal_period
              in: query
          operations:
            - name: get-open-items
              method: GET
    - type: http
      namespace: servicenow-finance
      baseUri: "https://walmart.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: slack-finance
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates a SAP plant maintenance work order, assigns it to the facilities team in ServiceNow, and sends notification to the building operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "SAP Plant Maintenance Work Order"
  description: "Creates a SAP plant maintenance work order, assigns it to the facilities team in ServiceNow, and sends notification to the building operations Microsoft Teams channel."
  tags:
    - facilities
    - sap
    - servicenow
    - microsoft-teams
    - maintenance
capability:
  exposes:
    - type: mcp
      namespace: facilities
      port: 8080
      tools:
        - name: create-maintenance-order
          description: "Given equipment ID, issue type, and store number, create a SAP maintenance order, a ServiceNow task, and notify building ops. Use for store equipment maintenance requests."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "SAP equipment ID."
            - name: issue_type
              in: body
              type: string
              description: "Maintenance issue type (e.g. HVAC, electrical, plumbing)."
            - name: store_number
              in: body
              type: string
              description: "Store number."
          steps:
            - name: create-work-order
              type: call
              call: sap.create-maintenance-order
              with:
                equipment: "{{equipment_id}}"
                order_type: "{{issue_type}}"
                plant: "{{store_number}}"
            - name: create-task
              type: call
              call: servicenow.create-task
              with:
                category: facilities
                short_description: "Maintenance: {{issue_type}} at Store {{store_number}}"
                description: "SAP work order: {{create-work-order.order_number}}. Equipment: {{equipment_id}}."
            - name: notify-building-ops
              type: call
              call: msteams.send-channel-message
              with:
                team_id: building-operations
                channel: maintenance
                text: "Maintenance order created for Store {{store_number}}: {{issue_type}}. SAP: {{create-work-order.order_number}}. ServiceNow: {{create-task.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-maintenance-order
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Looks up a SAP purchase order by PO number and returns header status, supplier name, total value, and open line items for procurement review.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Lookup"
  description: "Looks up a SAP purchase order by PO number and returns header status, supplier name, total value, and open line items for procurement review."
  tags:
    - procurement
    - finance
    - sap
    - purchase-order
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Given a SAP PO number, return header status, supplier details, total value, currency, and open line items. Use for procurement tracking and accounts payable review."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "SAP purchase order number (e.g. 4500012345)."
          call: sap.get-po
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: supplier
              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://walmart-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 including name, payment terms, and account group.

naftiko: "0.5"
info:
  label: "SAP Vendor Master Lookup"
  description: "Retrieves vendor master data from SAP by vendor number including name, payment terms, and account group."
  tags:
    - procurement
    - sap
    - vendor
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-vendor
          description: "Given a SAP vendor number, return the vendor name, payment terms, account group, and address. Use for supplier verification during procurement."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "SAP vendor number (e.g. 0001000100)."
          call: sap.get-vendor
          with:
            vendor_id: "{{vendor_id}}"
          outputParameters:
            - name: vendor_name
              type: string
              mapping: "$.d.SupplierName"
            - name: payment_terms
              type: string
              mapping: "$.d.PaymentTerms"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-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_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET

Queries Snowflake for historical seasonal demand patterns, creates job requisitions in Workday for peak staffing, and notifies regional HR via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Seasonal Workforce Planning Orchestrator"
  description: "Queries Snowflake for historical seasonal demand patterns, creates job requisitions in Workday for peak staffing, and notifies regional HR via Microsoft Teams."
  tags:
    - hr
    - workforce-planning
    - snowflake
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: workforce-planning
      port: 8080
      tools:
        - name: plan-seasonal-hiring
          description: "Given a region and season, query historical demand from Snowflake, calculate staffing needs, create Workday requisitions, and notify HR. Use for seasonal workforce ramp-ups."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Region code (e.g. US-SOUTH)."
            - name: season
              in: body
              type: string
              description: "Season name (e.g. holiday, back-to-school)."
          steps:
            - name: get-demand-forecast
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT store_id, AVG(peak_headcount) as avg_peak, MAX(peak_headcount) as max_peak FROM HR.SEASONAL_DEMAND WHERE region = '{{region}}' AND season = '{{season}}' GROUP BY store_id"
            - name: create-requisitions
              type: call
              call: workday.create-requisition
              with:
                region: "{{region}}"
                job_profile: "Seasonal Associate"
                positions_needed: "{{get-demand-forecast.total_positions}}"
            - name: notify-hr
              type: call
              call: msteams.send-channel-message
              with:
                team_id: regional-hr
                channel: "{{region}}"
                text: "Seasonal hiring plan for {{region}} ({{season}}): {{get-demand-forecast.total_positions}} positions needed. Requisitions created in Workday."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/walmart/jobRequisitions"
          operations:
            - name: create-requisition
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

When a GitHub security advisory is detected, creates a Jira remediation ticket, assigns it based on CODEOWNERS, and posts to the security Slack channel.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Tracker"
  description: "When a GitHub security advisory is detected, creates a Jira remediation ticket, assigns it based on CODEOWNERS, and posts to the security Slack channel."
  tags:
    - security
    - github
    - jira
    - slack
    - vulnerability
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: track-vulnerability-remediation
          description: "Given a GitHub repository and advisory ID, fetch advisory details, create a Jira ticket, and notify the security channel. Use when Dependabot or CodeQL alerts fire."
          inputParameters:
            - name: repo_name
              in: body
              type: string
              description: "GitHub repository in org/repo format."
            - name: advisory_id
              in: body
              type: string
              description: "GitHub security advisory ID."
          steps:
            - name: get-advisory
              type: call
              call: github.get-advisory
              with:
                repo_name: "{{repo_name}}"
                advisory_id: "{{advisory_id}}"
            - name: create-remediation-ticket
              type: call
              call: jira.create-issue
              with:
                project: SEC
                issue_type: Bug
                summary: "Security: {{get-advisory.severity}} — {{get-advisory.summary}} in {{repo_name}}"
                description: "Advisory: {{advisory_id}}. CVE: {{get-advisory.cve_id}}. Affected package: {{get-advisory.package}}."
                priority: "{{get-advisory.severity}}"
            - name: notify-security
              type: call
              call: slack.post-message
              with:
                channel: "security-alerts"
                text: "{{get-advisory.severity}} vulnerability in {{repo_name}}: {{get-advisory.summary}}. Jira: {{create-remediation-ticket.key}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: advisories
          path: "/repos/{{repo_name}}/security-advisories/{{advisory_id}}"
          inputParameters:
            - name: repo_name
              in: path
            - name: advisory_id
              in: path
          operations:
            - name: get-advisory
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Submits a ServiceNow change request for infrastructure changes, retrieves the approval status, and notifies the requester via Microsoft Teams when the change is approved or rejected.

naftiko: "0.5"
info:
  label: "ServiceNow Change Management Approval"
  description: "Submits a ServiceNow change request for infrastructure changes, retrieves the approval status, and notifies the requester via Microsoft Teams when the change is approved or rejected."
  tags:
    - itsm
    - servicenow
    - microsoft-teams
    - change-management
    - approval
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: submit-change-request
          description: "Given change details, submit a ServiceNow change request and notify the requester in Microsoft Teams when the approval decision is made. Use for planned infrastructure and application changes."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief description of the proposed change."
            - name: description
              in: body
              type: string
              description: "Detailed description of the change, impact, and rollback plan."
            - name: scheduled_start
              in: body
              type: string
              description: "Scheduled start time for the change in ISO 8601 format."
            - name: requester_upn
              in: body
              type: string
              description: "Microsoft UPN of the change requester."
          steps:
            - name: create-change
              type: call
              call: servicenow-cr.create-change
              with:
                short_description: "{{short_description}}"
                description: "{{description}}"
                start_date: "{{scheduled_start}}"
                type: normal
            - name: notify-requester
              type: call
              call: msteams-change.send-message
              with:
                recipient_upn: "{{requester_upn}}"
                text: "Your change request has been submitted. Change number: {{create-change.number}}. Scheduled: {{scheduled_start}}. Monitor status in ServiceNow."
  consumes:
    - type: http
      namespace: servicenow-cr
      baseUri: "https://walmart.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-change
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a ServiceNow incident by number and returns status, priority, assigned group, and resolution notes.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number and returns status, priority, assigned group, and resolution notes."
  tags:
    - itsm
    - servicenow
    - incident
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Given a ServiceNow incident number, return its current state, priority, assignment group, and resolution notes. Use for incident status checks."
          inputParameters:
            - name: incident_number
              in: body
              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[0].state"
            - name: priority
              type: string
              mapping: "$.result[0].priority"
            - name: assigned_to
              type: string
              mapping: "$.result[0].assigned_to.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

When a ServiceNow incident approaches SLA breach, escalates to the manager, pages on-call via PagerDuty, and posts an alert to the operations Slack channel.

naftiko: "0.5"
info:
  label: "ServiceNow SLA Breach Escalation"
  description: "When a ServiceNow incident approaches SLA breach, escalates to the manager, pages on-call via PagerDuty, and posts an alert to the operations Slack channel."
  tags:
    - itsm
    - servicenow
    - pagerduty
    - slack
    - sla
capability:
  exposes:
    - type: mcp
      namespace: sla-mgmt
      port: 8080
      tools:
        - name: escalate-sla-breach
          description: "Given a ServiceNow incident number, check SLA status, page on-call, and notify ops. Use when incidents are at risk of breaching SLA targets."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number."
          steps:
            - name: get-incident
              type: call
              call: servicenow.get-incident
              with:
                incident_number: "{{incident_number}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: "{{get-incident.assignment_group}}"
                title: "SLA breach risk: {{incident_number}} — {{get-incident.short_description}}"
                urgency: high
            - name: notify-ops
              type: call
              call: slack.post-message
              with:
                channel: "ops-escalations"
                text: "SLA breach imminent: {{incident_number}} ({{get-incident.priority}}). Time remaining: {{get-incident.sla_remaining}}. On-call paged."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Searches SharePoint for documents matching a keyword query and returns file names, paths, and last modified dates.

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

Retrieves the last 20 messages from a Slack channel for quick context gathering.

naftiko: "0.5"
info:
  label: "Slack Channel History Lookup"
  description: "Retrieves the last 20 messages from a Slack channel for quick context gathering."
  tags:
    - communication
    - slack
    - messaging
capability:
  exposes:
    - type: mcp
      namespace: messaging
      port: 8080
      tools:
        - name: get-channel-history
          description: "Given a Slack channel ID, return the last 20 messages including sender and timestamp. Use when summarizing recent channel activity."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "Slack channel ID (e.g. C01ABCDEF)."
          call: slack.get-history
          with:
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: messages
              type: array
              mapping: "$.messages"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: conversations
          path: "/conversations.history?channel={{channel_id}}&limit=20"
          inputParameters:
            - name: channel_id
              in: query
          operations:
            - name: get-history
              method: GET

Queries Snowflake for failed or stalled data pipeline jobs, posts a health summary to the data engineering Slack channel, and creates a Jira task for any failures.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Health Check"
  description: "Queries Snowflake for failed or stalled data pipeline jobs, posts a health summary to the data engineering Slack channel, and creates a Jira task for any failures."
  tags:
    - data
    - analytics
    - snowflake
    - jira
    - slack
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: check-pipeline-health
          description: "Query Snowflake task history for failed or stalled jobs in the last N hours, create Jira tasks for failures, and post a health summary to the data-engineering Slack channel. Use for scheduled pipeline monitoring."
          inputParameters:
            - name: lookback_hours
              in: body
              type: integer
              description: "Number of hours of task history to inspect (e.g. 24)."
            - name: schema
              in: body
              type: string
              description: "Snowflake schema to check pipeline health for (e.g. RETAIL.ETL)."
          steps:
            - name: query-task-history
              type: call
              call: snowflake-query.execute-statement
              with:
                statement: "SELECT name, state, error_message FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(SCHEDULED_TIME_RANGE_START=>DATEADD('hour', -{{lookback_hours}}, CURRENT_TIMESTAMP()))) WHERE STATE = 'FAILED'"
            - name: create-failure-task
              type: call
              call: jira-data.create-issue
              with:
                project_key: DATA
                issuetype: Task
                summary: "Pipeline failures detected in {{schema}} — last {{lookback_hours}}h"
                description: "Snowflake task failures:\n{{query-task-history.results}}"
            - name: post-health-summary
              type: call
              call: slack-data.post-message
              with:
                channel: "data-engineering"
                text: "Pipeline health check for {{schema}}: {{query-task-history.row_count}} failures in last {{lookback_hours}}h. Jira: {{create-failure-task.key}}"
  consumes:
    - type: http
      namespace: snowflake-query
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira-data
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack-data
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Snowflake data quality checks fail, creates a Jira ticket for the data engineering team and posts the failure details to the data-ops Slack channel.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Alert to Jira"
  description: "When Snowflake data quality checks fail, creates a Jira ticket for the data engineering team and posts the failure details to the data-ops Slack channel."
  tags:
    - data-engineering
    - snowflake
    - jira
    - slack
    - data-quality
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: handle-dq-failure
          description: "Given a Snowflake table name and check type, query the failure details, create a Jira ticket, and notify data ops. Use when scheduled data quality checks fail."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name."
            - name: check_type
              in: body
              type: string
              description: "Data quality check type (e.g. null_check, freshness, row_count)."
          steps:
            - name: get-failure-details
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT check_name, expected_value, actual_value, checked_at FROM DATA_OPS.DQ_RESULTS WHERE table_name = '{{table_name}}' AND check_type = '{{check_type}}' AND status = 'FAIL' ORDER BY checked_at DESC LIMIT 5"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: DATA
                issue_type: Bug
                summary: "DQ failure: {{check_type}} on {{table_name}}"
                description: "Latest failures: {{get-failure-details.results}}."
            - name: notify-data-ops
              type: call
              call: slack.post-message
              with:
                channel: "data-ops-alerts"
                text: "Data quality {{check_type}} failed on {{table_name}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Snowflake task fails, queries the error details, creates a Jira ticket for the data engineering team, and alerts the data-ops Slack channel.

naftiko: "0.5"
info:
  label: "Snowflake ETL Pipeline Failure Handler"
  description: "When a Snowflake task fails, queries the error details, creates a Jira ticket for the data engineering team, and alerts the data-ops Slack channel."
  tags:
    - data-engineering
    - snowflake
    - jira
    - slack
    - etl
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: handle-etl-failure
          description: "Given a Snowflake task name and run ID, query the error details, create a Jira ticket, and notify data ops. Use when scheduled ETL pipelines fail."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "Snowflake task fully qualified name."
            - name: run_id
              in: body
              type: string
              description: "Task run ID."
          steps:
            - name: get-error-details
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT error_code, error_message, query_text FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(TASK_NAME=>'{{task_name}}', RESULT_LIMIT=>1)) WHERE state = 'FAILED'"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: DATA
                issue_type: Bug
                summary: "ETL failure: {{task_name}}"
                description: "Run ID: {{run_id}}. Error: {{get-error-details.error_message}}. Query: {{get-error-details.query_text}}."
            - name: notify-data-ops
              type: call
              call: slack.post-message
              with:
                channel: "data-ops-alerts"
                text: "ETL pipeline {{task_name}} failed. Error: {{get-error-details.error_message}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Snowflake for current inventory levels by SKU and distribution center.

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

Queries Snowflake for daily retail sales performance by store and department, then publishes the snapshot to the sales operations Slack channel for leadership review.

naftiko: "0.5"
info:
  label: "Snowflake Retail Sales Snapshot"
  description: "Queries Snowflake for daily retail sales performance by store and department, then publishes the snapshot to the sales operations Slack channel for leadership review."
  tags:
    - data
    - analytics
    - snowflake
    - slack
    - retail
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: sales-reporting
      port: 8080
      tools:
        - name: publish-sales-snapshot
          description: "Given a reporting date and region, query Snowflake for daily sales totals by store and department and post a summary to the sales-ops Slack channel. Use for daily morning sales stand-ups."
          inputParameters:
            - name: report_date
              in: body
              type: string
              description: "Sales date to report on in YYYY-MM-DD format."
            - name: region
              in: body
              type: string
              description: "Walmart region code (e.g. US-SOUTH, US-NORTH)."
          steps:
            - name: query-sales
              type: call
              call: snowflake-sales.execute-statement
              with:
                statement: "SELECT store_id, department, SUM(net_sales) as total_sales FROM RETAIL.DAILY_SALES WHERE sale_date = '{{report_date}}' AND region = '{{region}}' GROUP BY store_id, department ORDER BY total_sales DESC LIMIT 20"
            - name: post-snapshot
              type: call
              call: slack-sales-ops.post-message
              with:
                channel: "sales-operations"
                text: "Daily sales snapshot for {{region}} on {{report_date}}: Top {{query-sales.row_count}} store-department combos reported. Total: {{query-sales.grand_total}}."
  consumes:
    - type: http
      namespace: snowflake-sales
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack-sales-ops
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Splunk detects a log anomaly pattern, creates a ServiceNow incident with log context and notifies the security operations Slack channel.

naftiko: "0.5"
info:
  label: "Splunk Log Anomaly to Incident"
  description: "When Splunk detects a log anomaly pattern, creates a ServiceNow incident with log context and notifies the security operations Slack channel."
  tags:
    - security
    - splunk
    - servicenow
    - slack
    - logging
capability:
  exposes:
    - type: mcp
      namespace: soc
      port: 8080
      tools:
        - name: handle-log-anomaly
          description: "Given a Splunk search ID and anomaly type, fetch log results, create a ServiceNow incident, and alert SecOps. Use when Splunk correlation rules trigger."
          inputParameters:
            - name: search_id
              in: body
              type: string
              description: "Splunk search job ID."
            - name: anomaly_type
              in: body
              type: string
              description: "Type of anomaly detected."
          steps:
            - name: get-search-results
              type: call
              call: splunk.get-results
              with:
                search_id: "{{search_id}}"
            - name: create-incident
              type: call
              call: servicenow.create-incident
              with:
                category: security
                urgency: 2
                short_description: "Log anomaly: {{anomaly_type}}"
                description: "Splunk search {{search_id}} detected {{anomaly_type}}. Event count: {{get-search-results.event_count}}. Source: {{get-search-results.source}}."
            - name: alert-secops
              type: call
              call: slack.post-message
              with:
                channel: "secops-alerts"
                text: "Log anomaly detected: {{anomaly_type}}. Events: {{get-search-results.event_count}}. Incident: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.walmart.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-results
          path: "/search/jobs/{{search_id}}/results"
          inputParameters:
            - name: search_id
              in: path
          operations:
            - name: get-results
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Splunk detects a high-severity security event, creates a ServiceNow security incident, enriches it with asset context, and notifies the SecOps Slack channel.

naftiko: "0.5"
info:
  label: "Splunk Security Incident Triage"
  description: "When Splunk detects a high-severity security event, creates a ServiceNow security incident, enriches it with asset context, and notifies the SecOps Slack channel."
  tags:
    - security
    - splunk
    - servicenow
    - slack
    - secops
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: secops
      port: 8080
      tools:
        - name: triage-security-event
          description: "Given a Splunk notable event ID and severity, create a ServiceNow security incident and alert the SecOps Slack channel. Invoke on high or critical Splunk ES notable events."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "Splunk notable event ID from Enterprise Security."
            - name: severity
              in: body
              type: string
              description: "Event severity: critical, high, medium."
            - name: source_ip
              in: body
              type: string
              description: "Source IP address associated with the security event."
            - name: description
              in: body
              type: string
              description: "Human-readable description of the security event."
          steps:
            - name: create-security-incident
              type: call
              call: servicenow-sec.create-incident
              with:
                category: security
                subcategory: intrusion_detection
                impact: "{{severity}}"
                short_description: "Security event: {{description}} from {{source_ip}}"
                description: "Splunk event {{event_id}}: {{description}}. Source IP: {{source_ip}}. Severity: {{severity}}."
            - name: notify-secops
              type: call
              call: slack-secops.post-message
              with:
                channel: "security-ops"
                text: "Security incident created: {{description}} | Source: {{source_ip}} | Severity: {{severity}} | ServiceNow: {{create-security-incident.number}} | Splunk event: {{event_id}}"
  consumes:
    - type: http
      namespace: servicenow-sec
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/sn_si_incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack-secops
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a store reports an IT outage, creates a P1 ServiceNow incident, pages the on-call engineer via PagerDuty, and notifies the store ops Slack channel.

naftiko: "0.5"
info:
  label: "Store IT Outage Response Orchestrator"
  description: "When a store reports an IT outage, creates a P1 ServiceNow incident, pages the on-call engineer via PagerDuty, and notifies the store ops Slack channel."
  tags:
    - operations
    - servicenow
    - pagerduty
    - slack
    - retail
capability:
  exposes:
    - type: mcp
      namespace: store-ops
      port: 8080
      tools:
        - name: handle-store-outage
          description: "Given a store number, affected system, and impact description, create a P1 incident, page on-call, and notify store ops. Use for critical store IT failures."
          inputParameters:
            - name: store_number
              in: body
              type: string
              description: "Walmart store number."
            - name: affected_system
              in: body
              type: string
              description: "Affected system (e.g. POS, self-checkout, pharmacy)."
            - name: impact
              in: body
              type: string
              description: "Description of the business impact."
          steps:
            - name: create-p1-incident
              type: call
              call: servicenow.create-incident
              with:
                category: store_systems
                urgency: 1
                impact: 1
                short_description: "[P1] Store {{store_number}} — {{affected_system}} outage"
                description: "{{impact}}"
            - name: page-oncall
              type: call
              call: pagerduty.create-incident
              with:
                service_id: store-systems
                title: "Store {{store_number}} {{affected_system}} outage"
                urgency: high
            - name: notify-store-ops
              type: call
              call: slack.post-message
              with:
                channel: "store-ops-critical"
                text: "P1 outage at Store {{store_number}}: {{affected_system}}. Incident: {{create-p1-incident.number}}. On-call paged."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a markdown request is submitted, validates inventory levels in Snowflake, creates an approval request in ServiceNow, and notifies the category manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Store Markdown Approval Workflow"
  description: "When a markdown request is submitted, validates inventory levels in Snowflake, creates an approval request in ServiceNow, and notifies the category manager via Microsoft Teams."
  tags:
    - merchandising
    - snowflake
    - servicenow
    - microsoft-teams
    - pricing
capability:
  exposes:
    - type: mcp
      namespace: markdown-ops
      port: 8080
      tools:
        - name: submit-markdown-request
          description: "Given a SKU, proposed markdown percentage, and store list, validate inventory, create approval request, and notify category manager. Use for clearance and seasonal markdowns."
          inputParameters:
            - name: sku
              in: body
              type: string
              description: "Product SKU."
            - name: markdown_pct
              in: body
              type: string
              description: "Proposed markdown percentage."
            - name: category_manager_email
              in: body
              type: string
              description: "Category manager email."
          steps:
            - name: check-inventory
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT SUM(on_hand_qty) as total_qty, AVG(days_of_supply) as avg_dos FROM SUPPLY_CHAIN.INVENTORY WHERE sku = '{{sku}}'"
            - name: create-approval
              type: call
              call: servicenow.create-request
              with:
                category: merchandising
                short_description: "Markdown approval: {{sku}} — {{markdown_pct}}% off"
                description: "Current inventory: {{check-inventory.total_qty}} units, {{check-inventory.avg_dos}} days of supply."
            - name: notify-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{category_manager_email}}"
                text: "Markdown request for SKU {{sku}} at {{markdown_pct}}% off. Inventory: {{check-inventory.total_qty}} units. Approval: {{create-approval.number}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a price change is approved in SAP, updates the product catalog in Snowflake and sends a notification to the merchandising Slack channel.

naftiko: "0.5"
info:
  label: "Store Price Change Propagation"
  description: "When a price change is approved in SAP, updates the product catalog in Snowflake and sends a notification to the merchandising Slack channel."
  tags:
    - merchandising
    - sap
    - snowflake
    - slack
    - pricing
capability:
  exposes:
    - type: mcp
      namespace: merchandising
      port: 8080
      tools:
        - name: propagate-price-change
          description: "Given a SAP material number and new price, update the Snowflake product catalog and notify merchandising. Use when pricing adjustments are approved by category managers."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "SAP material number."
            - name: new_price
              in: body
              type: string
              description: "New retail price."
            - name: effective_date
              in: body
              type: string
              description: "Price effective date in YYYY-MM-DD format."
          steps:
            - name: get-material
              type: call
              call: sap.get-material
              with:
                material_number: "{{material_number}}"
            - name: update-catalog
              type: call
              call: snowflake.execute-statement
              with:
                statement: "UPDATE RETAIL.PRODUCT_CATALOG SET retail_price = {{new_price}}, price_effective_date = '{{effective_date}}' WHERE material_number = '{{material_number}}'"
            - name: notify-merchandising
              type: call
              call: slack.post-message
              with:
                channel: "merchandising-pricing"
                text: "Price change for {{get-material.description}} ({{material_number}}): new price ${{new_price}} effective {{effective_date}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: products
          path: "/A_Product('{{material_number}}')"
          inputParameters:
            - name: material_number
              in: path
          operations:
            - name: get-material
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Generates a scoped Tableau embedded view token for a specified user and workbook, enabling secure analytics embedding in Walmart's internal portals.

naftiko: "0.5"
info:
  label: "Tableau Dashboard Embed Token Generator"
  description: "Generates a scoped Tableau embedded view token for a specified user and workbook, enabling secure analytics embedding in Walmart's internal portals."
  tags:
    - data
    - analytics
    - tableau
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: tableau-embed
      port: 8080
      tools:
        - name: get-tableau-embed-token
          description: "Given a Tableau site, workbook name, and user email, generate a scoped embed token for use in internal portal iframes. Returns the token and embed URL."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Tableau site ID (e.g. walmart-analytics)."
            - name: workbook_name
              in: body
              type: string
              description: "Name of the Tableau workbook to embed."
            - name: user_email
              in: body
              type: string
              description: "Email of the user requesting the embedded view."
          steps:
            - name: get-workbook
              type: call
              call: tableau.get-workbook
              with:
                site_id: "{{site_id}}"
                workbook_name: "{{workbook_name}}"
            - name: generate-token
              type: call
              call: tableau.create-embed-token
              with:
                site_id: "{{site_id}}"
                workbook_id: "{{get-workbook.id}}"
                user: "{{user_email}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://prod-useast-a.online.tableau.com/api/3.21"
      authentication:
        type: apikey
        key: "X-Tableau-Auth"
        value: "$secrets.tableau_token"
        placement: header
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: get-workbook
              method: GET
        - name: embed-tokens
          path: "/sites/{{site_id}}/embeddingtoken/generate"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-embed-token
              method: POST

Lists all workbooks in a Tableau site filtered by project name for dashboard discovery.

naftiko: "0.5"
info:
  label: "Tableau Workbook List"
  description: "Lists all workbooks in a Tableau site filtered by project name for dashboard discovery."
  tags:
    - analytics
    - tableau
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: list-workbooks
          description: "Given a Tableau project name, return all workbooks with their IDs, names, and last updated timestamps. Use for analytics asset discovery."
          inputParameters:
            - name: project_name
              in: body
              type: string
              description: "Tableau project name to filter by."
          call: tableau.list-workbooks
          with:
            project_name: "{{project_name}}"
          outputParameters:
            - name: workbooks
              type: array
              mapping: "$.workbooks.workbook"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.walmart.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks"
          operations:
            - name: list-workbooks
              method: GET

Detects Terraform state drift, creates a GitHub pull request with the fix, and alerts the platform engineering Slack channel.

naftiko: "0.5"
info:
  label: "Terraform Drift Detection and Remediation"
  description: "Detects Terraform state drift, creates a GitHub pull request with the fix, and alerts the platform engineering Slack channel."
  tags:
    - infrastructure
    - terraform
    - github
    - slack
    - cloud
capability:
  exposes:
    - type: mcp
      namespace: platform-eng
      port: 8080
      tools:
        - name: handle-terraform-drift
          description: "Given a Terraform workspace and drift details, create a remediation PR in GitHub and notify platform engineering. Use when Terraform plan detects configuration drift."
          inputParameters:
            - name: workspace
              in: body
              type: string
              description: "Terraform workspace name."
            - name: resource_address
              in: body
              type: string
              description: "Terraform resource address with drift."
            - name: drift_summary
              in: body
              type: string
              description: "Summary of the detected drift."
          steps:
            - name: create-branch
              type: call
              call: github.create-branch
              with:
                repo: "walmart/infrastructure"
                branch: "fix/drift-{{workspace}}-{{resource_address}}"
            - name: create-pr
              type: call
              call: github.create-pr
              with:
                repo: "walmart/infrastructure"
                head: "fix/drift-{{workspace}}-{{resource_address}}"
                base: main
                title: "Fix drift: {{resource_address}} in {{workspace}}"
                body: "{{drift_summary}}"
            - name: notify-platform
              type: call
              call: slack.post-message
              with:
                channel: "platform-engineering"
                text: "Terraform drift detected in {{workspace}}: {{resource_address}}. PR: {{create-pr.html_url}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branches
          path: "/repos/{{repo}}/git/refs"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: create-branch
              method: POST
        - name: pulls
          path: "/repos/{{repo}}/pulls"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: create-pr
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

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

naftiko: "0.5"
info:
  label: "Vendor Invoice Discrepancy Handler"
  description: "When a SAP invoice has a price discrepancy, creates a Jira ticket for the procurement team and notifies the buyer via Microsoft Teams."
  tags:
    - procurement
    - finance
    - sap
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: procurement-ops
      port: 8080
      tools:
        - name: handle-invoice-discrepancy
          description: "Given a SAP invoice number, fetch the discrepancy details, create a Jira ticket for resolution, and notify the assigned buyer via Teams. Use when three-way match failures occur."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "SAP invoice document number."
            - name: buyer_email
              in: body
              type: string
              description: "Email of the responsible buyer."
          steps:
            - name: get-invoice
              type: call
              call: sap.get-invoice
              with:
                invoice_number: "{{invoice_number}}"
            - name: create-ticket
              type: call
              call: jira.create-issue
              with:
                project: PROC
                issue_type: Task
                summary: "Invoice discrepancy: {{invoice_number}} — variance {{get-invoice.variance_amount}}"
                description: "Vendor: {{get-invoice.vendor_name}}. PO: {{get-invoice.po_number}}. Variance: {{get-invoice.variance_amount}}."
            - name: notify-buyer
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{buyer_email}}"
                text: "Invoice {{invoice_number}} has a discrepancy of {{get-invoice.variance_amount}}. Jira ticket: {{create-ticket.key}}. Please review."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_SupplierInvoice('{{invoice_number}}')"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://walmart.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake for weekly store sales and foot traffic metrics, generates a summary, and posts it to the regional leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Weekly Store Performance Digest"
  description: "Queries Snowflake for weekly store sales and foot traffic metrics, generates a summary, and posts it to the regional leadership Microsoft Teams channel."
  tags:
    - analytics
    - retail
    - snowflake
    - microsoft-teams
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: retail-reporting
      port: 8080
      tools:
        - name: publish-store-performance
          description: "Given a region code and week ending date, query Snowflake for store performance data and send a digest to the regional Teams channel. Use for weekly leadership reviews."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "Region code (e.g. US-SOUTH)."
            - name: week_ending
              in: body
              type: string
              description: "Week ending date in YYYY-MM-DD format."
          steps:
            - name: query-performance
              type: call
              call: snowflake.execute-statement
              with:
                statement: "SELECT store_id, SUM(net_sales) as total_sales, SUM(transactions) as total_txns, AVG(basket_size) as avg_basket FROM RETAIL.WEEKLY_STORE_METRICS WHERE region = '{{region}}' AND week_ending = '{{week_ending}}' GROUP BY store_id ORDER BY total_sales DESC LIMIT 25"
            - name: post-digest
              type: call
              call: msteams.send-channel-message
              with:
                team_id: "{{region}}-leadership"
                channel: "store-performance"
                text: "Weekly performance for {{region}} ending {{week_ending}}: {{query-performance.row_count}} stores reported. Top store sales: {{query-performance.top_sales}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries Workday for associates who have not completed benefits enrollment, sends reminders via Microsoft Teams, and updates a tracking spreadsheet in SharePoint.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Queries Workday for associates who have not completed benefits enrollment, sends reminders via Microsoft Teams, and updates a tracking spreadsheet in SharePoint."
  tags:
    - hr
    - workday
    - microsoft-teams
    - sharepoint
    - benefits
capability:
  exposes:
    - type: mcp
      namespace: hr-benefits
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Given an enrollment deadline date, find incomplete enrollments in Workday, send Teams reminders, and update the SharePoint tracker. Use during open enrollment periods."
          inputParameters:
            - name: enrollment_deadline
              in: body
              type: string
              description: "Enrollment deadline date in YYYY-MM-DD format."
          steps:
            - name: get-pending-enrollments
              type: call
              call: workday.get-pending-enrollments
              with:
                deadline: "{{enrollment_deadline}}"
            - name: send-reminders
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-pending-enrollments.employee_emails}}"
                text: "Reminder: Your benefits enrollment is due by {{enrollment_deadline}}. Please complete your selections in Workday."
            - name: update-tracker
              type: call
              call: sharepoint.update-list
              with:
                list_name: "Benefits Enrollment Tracker"
                data: "{{get-pending-enrollments.summary}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: benefits
          path: "/walmart/benefits/pendingEnrollments"
          operations:
            - name: get-pending-enrollments
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: lists
          path: "/sites/walmart.sharepoint.com/lists/{{list_name}}/items"
          inputParameters:
            - name: list_name
              in: path
          operations:
            - name: update-list
              method: POST

Pulls merit increase proposals from Workday, validates against SAP budget allocations, and notifies HR business partners via Microsoft Teams with a review summary.

naftiko: "0.5"
info:
  label: "Workday Compensation Review Sync"
  description: "Pulls merit increase proposals from Workday, validates against SAP budget allocations, and notifies HR business partners via Microsoft Teams with a review summary."
  tags:
    - hr
    - finance
    - workday
    - sap
    - microsoft-teams
    - compensation
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: sync-compensation-review
          description: "Given a Workday compensation review cycle ID, retrieve merit proposals, check SAP budget availability for each cost center, and send a review summary to HR business partners in Microsoft Teams."
          inputParameters:
            - name: review_cycle_id
              in: body
              type: string
              description: "Workday compensation review cycle ID."
            - name: review_period
              in: body
              type: string
              description: "Human-readable review period label (e.g. 2025 Annual Merit)."
          steps:
            - name: get-proposals
              type: call
              call: workday-comp.get-comp-review
              with:
                cycle_id: "{{review_cycle_id}}"
            - name: notify-hrbp
              type: call
              call: msteams-comp.send-message
              with:
                channel_id: "$secrets.teams_hr_channel_id"
                text: "Compensation review cycle {{review_period}} has {{get-proposals.total_count}} proposals totaling {{get-proposals.total_increase_amount}}. Please review in Workday."
  consumes:
    - type: http
      namespace: workday-comp
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: comp-reviews
          path: "/walmart/compensationReviewCycles/{{cycle_id}}"
          inputParameters:
            - name: cycle_id
              in: path
          operations:
            - name: get-comp-review
              method: GET
    - type: http
      namespace: msteams-comp
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Looks up a Workday employee by worker ID and returns their name, department, job title, and manager for HR inquiries.

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

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

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot"
  description: "Returns current headcount by department and cost center from Workday for use in workforce planning and finance reporting."
  tags:
    - hr
    - reporting
    - workday
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: get-headcount-by-department
          description: "Returns active associate headcount grouped by department and cost center from Workday. Use for workforce planning, finance budgeting, or store staffing analysis."
          call: workday.get-headcount
          outputParameters:
            - name: workers
              type: array
              mapping: "$.data[*]"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/walmart/workers"
          operations:
            - name: get-headcount
              method: GET

When a new job requisition is created in Workday, validates budget in SAP, creates a ServiceNow approval request, and notifies the hiring manager via Teams.

naftiko: "0.5"
info:
  label: "Workday Job Requisition Approval Flow"
  description: "When a new job requisition is created in Workday, validates budget in SAP, creates a ServiceNow approval request, and notifies the hiring manager via Teams."
  tags:
    - hr
    - workday
    - sap
    - servicenow
    - microsoft-teams
    - recruiting
capability:
  exposes:
    - type: mcp
      namespace: recruiting
      port: 8080
      tools:
        - name: process-job-requisition
          description: "Given a Workday job requisition ID, validate department budget in SAP, create a ServiceNow approval, and notify the hiring manager. Use when new headcount requests are submitted."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "Workday job requisition ID."
          steps:
            - name: get-requisition
              type: call
              call: workday.get-requisition
              with:
                requisition_id: "{{requisition_id}}"
            - name: check-budget
              type: call
              call: sap.get-cost-center-budget
              with:
                cost_center: "{{get-requisition.cost_center}}"
            - name: create-approval
              type: call
              call: servicenow.create-request
              with:
                category: hr_recruiting
                short_description: "Job requisition approval: {{get-requisition.job_title}} — {{get-requisition.department}}"
                description: "Budget remaining: {{check-budget.remaining_budget}}. Requested salary: {{get-requisition.target_salary}}."
            - name: notify-hiring-manager
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-requisition.hiring_manager_email}}"
                text: "Your job requisition for {{get-requisition.job_title}} is submitted for approval. ServiceNow: {{create-approval.number}}. Budget available: {{check-budget.remaining_budget}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisitions
          path: "/walmart/jobRequisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://walmart-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: cost-centers
          path: "/A_CostCenter('{{cost_center}}')"
          inputParameters:
            - name: cost_center
              in: path
          operations:
            - name: get-cost-center-budget
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://walmart.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When an organizational restructure occurs in Workday, updates Okta group assignments, syncs the org chart to SharePoint, and notifies affected managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Organizational Change Sync"
  description: "When an organizational restructure occurs in Workday, updates Okta group assignments, syncs the org chart to SharePoint, and notifies affected managers via Microsoft Teams."
  tags:
    - hr
    - workday
    - okta
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: org-mgmt
      port: 8080
      tools:
        - name: sync-org-change
          description: "Given a Workday supervisory org ID, fetch the updated structure, update Okta groups, sync to SharePoint, and notify managers. Use during organizational restructures."
          inputParameters:
            - name: org_id
              in: body
              type: string
              description: "Workday supervisory organization ID."
          steps:
            - name: get-org-structure
              type: call
              call: workday.get-org
              with:
                org_id: "{{org_id}}"
            - name: update-okta-groups
              type: call
              call: okta.sync-group-members
              with:
                group_name: "{{get-org-structure.org_name}}"
                members: "{{get-org-structure.member_emails}}"
            - name: update-org-chart
              type: call
              call: sharepoint.update-list
              with:
                list_name: "Organization Chart"
                data: "{{get-org-structure.hierarchy}}"
            - name: notify-managers
              type: call
              call: msteams.send-message
              with:
                recipient_upn: "{{get-org-structure.manager_email}}"
                text: "Organizational change processed for {{get-org-structure.org_name}}. {{get-org-structure.member_count}} members updated. Okta groups and org chart synced."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: organizations
          path: "/walmart/organizations/{{org_id}}"
          inputParameters:
            - name: org_id
              in: path
          operations:
            - name: get-org
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://walmart.okta.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.okta_token"
      resources:
        - name: groups
          path: "/groups/{{group_name}}/users"
          inputParameters:
            - name: group_name
              in: path
          operations:
            - name: sync-group-members
              method: PUT
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: lists
          path: "/sites/walmart.sharepoint.com/lists/{{list_name}}/items"
          inputParameters:
            - name: list_name
              in: path
          operations:
            - name: update-list
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chats
          path: "/users/{{recipient_upn}}/chats"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Compares Workday payroll run results with SAP cost center budgets, logs variances in Snowflake, and alerts the payroll team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Payroll Variance Alert"
  description: "Compares Workday payroll run results with SAP cost center budgets, logs variances in Snowflake, and alerts the payroll team via Microsoft Teams."
  tags:
    - finance
    - hr
    - workday
    - sap
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payroll-ops
      port: 8080
      tools:
        - name: check-payroll-variance
          description: "Given a pay period and company code, compare Workday payroll results with SAP budgets, log variances, and alert the payroll team. Use after each payroll run completes."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "Pay period identifier (e.g. 2026-W13)."
            - name: company_code
              in: body
              type: string
              description: "SAP company code."
          steps:
            - name: get-payroll-results
              type: call
              call: workday.get-payroll-results
              with:
                pay_period: "{{pay_period}}"
            - name: log-variance
              type: call
              call: snowflake.execute-statement
              with:
                statement: "INSERT INTO FINANCE.PAYROLL_VARIANCE (pay_period, company_code, total_payroll, budget, variance) SELECT '{{pay_period}}', '{{company_code}}', {{get-payroll-results.total_amount}}, budget_amount, {{get-payroll-results.total_amount}} - budget_amount FROM FINANCE.PAYROLL_BUDGETS WHERE company_code = '{{company_code}}'"
            - name: alert-payroll
              type: call
              call: msteams.send-channel-message
              with:
                team_id: payroll-team
                channel: variance-alerts
                text: "Payroll variance for {{pay_period}}: Total payroll ${{get-payroll-results.total_amount}}. Review in Snowflake for details."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: payroll
          path: "/walmart/payroll/results"
          operations:
            - name: get-payroll-results
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://walmart.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel
              in: path
          operations:
            - name: send-channel-message
              method: POST

Kicks off an annual performance review cycle in Workday for a specified manager's direct reports and notifies each employee via Microsoft Teams with review instructions.

naftiko: "0.5"
info:
  label: "Workday Performance Review Initiation"
  description: "Kicks off an annual performance review cycle in Workday for a specified manager's direct reports and notifies each employee via Microsoft Teams with review instructions."
  tags:
    - hr
    - performance
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-performance
      port: 8080
      tools:
        - name: initiate-performance-review
          description: "Given a manager's Workday ID and review cycle name, retrieve direct reports, and send each a Microsoft Teams notification with performance review instructions. Use to launch annual or mid-year review cycles."
          inputParameters:
            - name: manager_workday_id
              in: body
              type: string
              description: "Workday ID of the manager whose direct reports should receive review notifications."
            - name: review_cycle_name
              in: body
              type: string
              description: "Name of the review cycle (e.g. 2025 Annual Performance Review)."
            - name: due_date
              in: body
              type: string
              description: "Review submission due date in ISO 8601 format."
          steps:
            - name: get-direct-reports
              type: call
              call: workday-perf.get-direct-reports
              with:
                manager_id: "{{manager_workday_id}}"
            - name: notify-employees
              type: call
              call: msteams-perf.send-message
              with:
                recipient_upn: "{{get-direct-reports.work_email}}"
                text: "Your {{review_cycle_name}} self-assessment is now open. Please complete your review in Workday by {{due_date}}."
  consumes:
    - type: http
      namespace: workday-perf
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: direct-reports
          path: "/walmart/workers/{{manager_id}}/directReports"
          inputParameters:
            - name: manager_id
              in: path
          operations:
            - name: get-direct-reports
              method: GET
    - type: http
      namespace: msteams-perf
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{upn}}/chats"
          inputParameters:
            - name: upn
              in: path
          operations:
            - name: send-message
              method: POST

When an associate is promoted in Workday, updates their Okta group memberships and notifies the IT team via ServiceNow for access provisioning.

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

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

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

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

Retrieves details for a Zoom meeting by ID including topic, start time, duration, and participant count.

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

Enriches a Salesforce lead with firmographic data from ZoomInfo and updates the lead record with company size, revenue, and industry details.

naftiko: "0.5"
info:
  label: "ZoomInfo Lead Enrichment to Salesforce"
  description: "Enriches a Salesforce lead with firmographic data from ZoomInfo and updates the lead record with company size, revenue, and industry details."
  tags:
    - sales
    - zoominfo
    - salesforce
    - lead-enrichment
capability:
  exposes:
    - type: mcp
      namespace: sales-enrichment
      port: 8080
      tools:
        - name: enrich-lead
          description: "Given a Salesforce lead ID, fetch the company domain, enrich via ZoomInfo, and update the Salesforce lead record. Use for new lead qualification."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "Salesforce lead ID."
          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:
                domain: "{{get-lead.website}}"
            - name: update-lead
              type: call
              call: salesforce.update-lead
              with:
                lead_id: "{{lead_id}}"
                number_of_employees: "{{enrich-company.employee_count}}"
                annual_revenue: "{{enrich-company.revenue}}"
                industry: "{{enrich-company.industry}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://walmart.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
            - name: update-lead
              method: PATCH
    - type: http
      namespace: zoominfo
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: companies
          path: "/search/company"
          operations:
            - name: search-company
              method: POST