Lowe's Capabilities
Naftiko 0.5 capability definitions for Lowe's - 105 capabilities showing integration workflows and service orchestrations.
Retrieves product page performance metrics from Adobe Analytics, including views, add-to-cart rate, and conversion rate.
naftiko: "0.5"
info:
label: "Adobe Analytics Product Page Performance"
description: "Retrieves product page performance metrics from Adobe Analytics, including views, add-to-cart rate, and conversion rate."
tags:
- analytics
- adobe-analytics
- e-commerce
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: get-product-page-metrics
description: "Fetch Adobe Analytics product page performance. Returns page views, add-to-cart rate, and conversion rate for a product category."
inputParameters:
- name: product_category
type: string
description: "Product category identifier (e.g., appliances, tools, lumber)."
call: adobe.get-report
with:
product_category: "{{product_category}}"
outputParameters:
- name: page_views
type: integer
mapping: "$.rows[0].value"
- name: add_to_cart_rate
type: number
mapping: "$.rows[0].addToCartRate"
- name: conversion_rate
type: number
mapping: "$.rows[0].conversionRate"
consumes:
- type: http
namespace: adobe
baseUri: "https://analytics.adobe.io/api/lowes"
authentication:
type: bearer
token: "$secrets.adobe_analytics_token"
resources:
- name: reports
path: "/reports"
operations:
- name: get-report
method: POST
Uses Anthropic Claude to classify and summarize customer complaints from Salesforce Service Cloud, routing them to the appropriate ServiceNow queue based on category.
naftiko: "0.5"
info:
label: "AI-Assisted Customer Complaint Triage"
description: "Uses Anthropic Claude to classify and summarize customer complaints from Salesforce Service Cloud, routing them to the appropriate ServiceNow queue based on category."
tags:
- customer-support
- ai
- salesforce
- servicenow
- anthropic
capability:
exposes:
- type: mcp
namespace: cx-triage
port: 8080
tools:
- name: triage-customer-complaint
description: "Given a Salesforce Service Cloud case ID, retrieve case details, classify and summarize using Anthropic Claude, and create a routed ServiceNow incident with the AI-generated summary."
inputParameters:
- name: case_id
type: string
description: "Salesforce Service Cloud case record ID."
steps:
- name: get-case
type: call
call: salesforce.get-case
with:
case_id: "{{case_id}}"
- name: classify-complaint
type: call
call: anthropic.create-message
with:
model: "claude-3-5-sonnet-20241022"
prompt: "Classify severity and summarize this customer complaint: {{get-case.Description}}"
- name: create-routed-incident
type: call
call: servicenow.create-incident
with:
short_description: "Customer complaint: {{get-case.Subject}}"
description: "AI summary: {{classify-complaint.content}}"
category: "customer_experience"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Analyzes in-store aisle traffic by pulling sensor data from Snowflake, correlating with sales data in SAP, and generating insights in Confluence.
naftiko: "0.5"
info:
label: "Aisle Traffic Analysis Pipeline"
description: "Analyzes in-store aisle traffic by pulling sensor data from Snowflake, correlating with sales data in SAP, and generating insights in Confluence."
tags:
- store-ops
- snowflake
- sap
- confluence
capability:
exposes:
- type: mcp
namespace: store-analytics
port: 8080
tools:
- name: analyze-aisle-traffic
description: "Given a store and date range, pull Snowflake traffic sensor data, correlate SAP aisle sales, and publish Confluence insights."
inputParameters:
- name: store_number
type: string
description: "Store number."
- name: start_date
type: string
description: "Start date in YYYY-MM-DD format."
- name: end_date
type: string
description: "End date in YYYY-MM-DD format."
steps:
- name: get-traffic-data
type: call
call: snowflake.run-query
with:
statement: "SELECT aisle, avg_visitors, peak_hour FROM AISLE_TRAFFIC WHERE store='{{store_number}}' AND date BETWEEN '{{start_date}}' AND '{{end_date}}'"
- name: get-aisle-sales
type: call
call: sap.get-sales-by-aisle
with:
plant: "{{store_number}}"
start: "{{start_date}}"
end: "{{end_date}}"
- name: publish-insights
type: call
call: confluence.create-page
with:
space: "STORE_ANALYTICS"
title: "Aisle Traffic: Store {{store_number}} ({{start_date}} to {{end_date}})"
body: "Top aisle: {{get-traffic-data.results[0].aisle}} with {{get-traffic-data.results[0].avg_visitors}} avg visitors."
consumes:
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales
path: "/A_SalesOrder"
operations:
- name: get-sales-by-aisle
method: GET
- type: http
namespace: confluence
baseUri: "https://lowes.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
method: POST
Monitors API gateway health by pulling Datadog latency metrics, New Relic error rates, and posting a consolidated dashboard summary to Teams.
naftiko: "0.5"
info:
label: "API Gateway Health Dashboard"
description: "Monitors API gateway health by pulling Datadog latency metrics, New Relic error rates, and posting a consolidated dashboard summary to Teams."
tags:
- infrastructure
- datadog
- new-relic
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: platform-ops
port: 8080
tools:
- name: check-api-gateway-health
description: "Pull Datadog latency metrics and New Relic error rates for the API gateway, then post a consolidated summary to Teams."
inputParameters:
- name: gateway_name
type: string
description: "API gateway identifier."
steps:
- name: get-latency
type: call
call: datadog.get-monitor
with:
monitor_id: "api-gw-{{gateway_name}}"
- name: get-errors
type: call
call: newrelic.get-app-metrics
with:
app_id: "{{gateway_name}}"
- name: post-summary
type: call
call: msteams.send-message
with:
channel_id: "platform-engineering"
text: "API Gateway {{gateway_name}}: Latency={{get-latency.overall_state}}, Error rate={{get-errors.error_rate}}%, Throughput={{get-errors.throughput}} rpm"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: newrelic
baseUri: "https://api.newrelic.com/v2"
authentication:
type: bearer
token: "$secrets.newrelic_api_key"
resources:
- name: applications
path: "/applications/{{app_id}}.json"
inputParameters:
- name: app_id
in: path
operations:
- name: get-app-metrics
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Coordinates appliance delivery by confirming the order in Salesforce, verifying warehouse stock in Oracle, and scheduling the delivery route via ServiceNow.
naftiko: "0.5"
info:
label: "Appliance Delivery Coordination"
description: "Coordinates appliance delivery by confirming the order in Salesforce, verifying warehouse stock in Oracle, and scheduling the delivery route via ServiceNow."
tags:
- e-commerce
- salesforce
- oracle
- servicenow
capability:
exposes:
- type: mcp
namespace: delivery-ops
port: 8080
tools:
- name: coordinate-appliance-delivery
description: "Given an order ID, confirm Salesforce order details, verify Oracle warehouse availability, and create a ServiceNow delivery work order."
inputParameters:
- name: order_id
type: string
description: "Salesforce order ID."
- name: delivery_date
type: string
description: "Requested delivery date in YYYY-MM-DD format."
steps:
- name: get-order
type: call
call: salesforce.get-order
with:
order_id: "{{order_id}}"
- name: verify-stock
type: call
call: oracle.get-onhand
with:
item_number: "{{get-order.product_sku}}"
org_code: "{{get-order.fulfillment_center}}"
- name: create-delivery-order
type: call
call: servicenow.create-work-order
with:
short_description: "Appliance delivery: {{get-order.product_name}} to {{get-order.shipping_address}}"
scheduled_date: "{{delivery_date}}"
assignment_group: "Delivery_Operations"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: orders
path: "/sobjects/Order/{{order_id}}"
inputParameters:
- name: order_id
in: path
operations:
- name: get-order
method: GET
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: inventory
path: "/inventoryBalances"
operations:
- name: get-onhand
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
Tracks store associate certifications by pulling training records from Workday, checking expiration dates, and creating ServiceNow tasks for renewals due within 30 days.
naftiko: "0.5"
info:
label: "Associate Certification Tracker"
description: "Tracks store associate certifications by pulling training records from Workday, checking expiration dates, and creating ServiceNow tasks for renewals due within 30 days."
tags:
- store-ops
- workday
- servicenow
- hr
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: check-certification-renewals
description: "Given a store number, pull Workday training records, identify certifications expiring within 30 days, and create ServiceNow renewal tasks."
inputParameters:
- name: store_number
type: string
description: "Store number to check."
steps:
- name: get-certifications
type: call
call: workday.get-certifications
with:
store: "{{store_number}}"
expiring_within_days: "30"
- name: create-renewal-tasks
type: call
call: servicenow.create-task
with:
short_description: "Certification renewal required — Store {{store_number}}"
description: "{{get-certifications.count}} certifications expiring within 30 days"
assignment_group: "Store_Training"
- name: notify-manager
type: call
call: msteams.send-message
with:
channel_id: "store-{{store_number}}-ops"
text: "{{get-certifications.count}} associate certifications expiring within 30 days at Store {{store_number}}. Task: {{create-renewal-tasks.number}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: certifications
path: "/lowes/certifications"
operations:
- name: get-certifications
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Retrieves the latest build status from Azure DevOps for a given pipeline, returning result, duration, and triggered-by.
naftiko: "0.5"
info:
label: "Azure DevOps Build Status"
description: "Retrieves the latest build status from Azure DevOps for a given pipeline, returning result, duration, and triggered-by."
tags:
- devops
- azure-devops
- infrastructure
capability:
exposes:
- type: mcp
namespace: devops
port: 8080
tools:
- name: get-build-status
description: "Check the latest Azure DevOps build status for a pipeline. Returns build result, duration, and requestor."
inputParameters:
- name: pipeline_id
type: string
description: "Azure DevOps pipeline definition ID."
call: azuredevops.get-build
with:
pipeline_id: "{{pipeline_id}}"
outputParameters:
- name: result
type: string
mapping: "$.value[0].result"
- name: status
type: string
mapping: "$.value[0].status"
- name: finish_time
type: string
mapping: "$.value[0].finishTime"
consumes:
- type: http
namespace: azuredevops
baseUri: "https://dev.azure.com/lowes"
authentication:
type: bearer
token: "$secrets.azure_devops_pat"
resources:
- name: builds
path: "/_apis/build/builds?definitions={{pipeline_id}}&$top=1&api-version=7.0"
inputParameters:
- name: pipeline_id
in: query
operations:
- name: get-build
method: GET
Retrieves a product listing from the BigCommerce catalog by SKU, returning price, availability, and images.
naftiko: "0.5"
info:
label: "BigCommerce Product Listing Lookup"
description: "Retrieves a product listing from the BigCommerce catalog by SKU, returning price, availability, and images."
tags:
- e-commerce
- bigcommerce
- inventory
capability:
exposes:
- type: mcp
namespace: ecommerce
port: 8080
tools:
- name: get-product-listing
description: "Look up a BigCommerce product by SKU. Returns name, price, stock level, and primary image URL."
inputParameters:
- name: sku
type: string
description: "Product SKU identifier."
call: bigcommerce.get-product
with:
sku: "{{sku}}"
outputParameters:
- name: name
type: string
mapping: "$.data.name"
- name: price
type: number
mapping: "$.data.price"
- name: inventory_level
type: integer
mapping: "$.data.inventory_level"
consumes:
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: products
path: "/v3/catalog/products?sku={{sku}}"
inputParameters:
- name: sku
in: query
operations:
- name: get-product
method: GET
Orchestrates Buy Online Pick Up In Store orders by verifying BigCommerce order status, confirming SAP store-level inventory, and notifying the store associate via Teams.
naftiko: "0.5"
info:
label: "BOPIS Order Fulfillment Orchestrator"
description: "Orchestrates Buy Online Pick Up In Store orders by verifying BigCommerce order status, confirming SAP store-level inventory, and notifying the store associate via Teams."
tags:
- e-commerce
- bigcommerce
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ecommerce-ops
port: 8080
tools:
- name: fulfill-bopis-order
description: "Given a BOPIS order number, verify BigCommerce order, confirm SAP store inventory, and notify the fulfillment associate via Teams."
inputParameters:
- name: order_number
type: string
description: "BigCommerce BOPIS order number."
- name: store_number
type: string
description: "Pickup store number."
steps:
- name: get-order
type: call
call: bigcommerce.get-order
with:
order_number: "{{order_number}}"
- name: check-store-stock
type: call
call: sap.get-stock-level
with:
material_number: "{{get-order.line_items[0].sku}}"
plant: "{{store_number}}"
- name: notify-associate
type: call
call: msteams.send-message
with:
channel_id: "store-{{store_number}}-fulfillment"
text: "BOPIS order {{order_number}} ready for pick: {{get-order.line_items[0].name}} (Qty: {{get-order.line_items[0].quantity}}). Aisle location: {{check-store-stock.bin_location}}"
consumes:
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: orders
path: "/v2/orders/{{order_number}}"
inputParameters:
- name: order_number
in: path
operations:
- name: get-order
method: GET
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/A_MatlStkInAcctMod"
operations:
- name: get-stock-level
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Retrieves a document from Box by file ID, returning file metadata including name, size, and shared link.
naftiko: "0.5"
info:
label: "Box Document Retrieval"
description: "Retrieves a document from Box by file ID, returning file metadata including name, size, and shared link."
tags:
- document-management
- box
- store-ops
capability:
exposes:
- type: mcp
namespace: documents
port: 8080
tools:
- name: get-document
description: "Retrieve a Box file by ID. Returns file name, size, last modified date, and download URL."
inputParameters:
- name: file_id
type: string
description: "Box file ID."
call: box.get-file
with:
file_id: "{{file_id}}"
outputParameters:
- name: name
type: string
mapping: "$.name"
- name: size
type: integer
mapping: "$.size"
- name: modified_at
type: string
mapping: "$.modified_at"
consumes:
- type: http
namespace: box
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: files
path: "/files/{{file_id}}"
inputParameters:
- name: file_id
in: path
operations:
- name: get-file
method: GET
On a GitHub Actions pipeline failure, creates a Jira bug, posts a Datadog event marker, and alerts the engineering Teams channel.
naftiko: "0.5"
info:
label: "CI/CD Pipeline Failure Triage"
description: "On a GitHub Actions pipeline failure, creates a Jira bug, posts a Datadog event marker, and alerts the engineering Teams channel."
tags:
- devops
- cicd
- github
- jira
- datadog
capability:
exposes:
- type: mcp
namespace: devops
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions pipeline failure, create a Jira bug in the engineering project, post a Datadog deployment event, and alert the engineering Teams channel with context."
inputParameters:
- name: repo
type: string
description: "GitHub repository full name (org/repo)."
- name: branch
type: string
description: "Branch name where the failure occurred."
- name: workflow_run_id
type: string
description: "GitHub Actions workflow run ID."
- name: commit_sha
type: string
description: "Git commit SHA that triggered the run."
steps:
- name: create-bug
type: call
call: jira.create-issue
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repo}} / {{branch}}"
description: "Workflow run {{workflow_run_id}} failed on commit {{commit_sha}}"
- name: post-event
type: call
call: datadog.create-event
with:
title: "CI failure: {{repo}}"
text: "Branch {{branch}} pipeline failed. Jira: {{create-bug.key}}"
alert_type: "error"
- name: alert-team
type: call
call: msteams.post-channel-message
with:
channel_id: "engineering-alerts"
text: "Pipeline failure: {{repo}} | Branch: {{branch}} | Jira: {{create-bug.key}} | Run: {{workflow_run_id}}"
consumes:
- type: http
namespace: jira
baseUri: "https://lowes.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/engineering/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Queries AWS Cost Explorer for account-level spend anomalies and creates a Jira cost-tracking task with a Datadog event when thresholds are breached.
naftiko: "0.5"
info:
label: "Cloud Cost Anomaly Alert"
description: "Queries AWS Cost Explorer for account-level spend anomalies and creates a Jira cost-tracking task with a Datadog event when thresholds are breached."
tags:
- cloud
- finops
- aws
- datadog
- jira
capability:
exposes:
- type: mcp
namespace: cloud-finops
port: 8080
tools:
- name: handle-cloud-cost-anomaly
description: "Given an AWS account ID and spend threshold, detect anomalies via Cost Explorer, create a Jira ticket, and post a Datadog warning event for tracking. Use when AWS budget alerts fire."
inputParameters:
- name: account_id
type: string
description: "AWS account ID to analyze for cost anomalies."
- name: threshold_usd
type: number
description: "Anomaly threshold in USD."
- name: date_from
type: string
description: "Start date for anomaly lookback in YYYY-MM-DD format."
steps:
- name: get-anomalies
type: call
call: aws-cost.get-anomalies
with:
accountId: "{{account_id}}"
threshold: "{{threshold_usd}}"
startDate: "{{date_from}}"
- name: create-task
type: call
call: jira.create-issue
with:
project_key: "CLOUD"
issuetype: "Task"
summary: "AWS cost anomaly detected: account {{account_id}}"
description: "{{get-anomalies.summary}} — threshold {{threshold_usd}} USD exceeded"
- name: post-event
type: call
call: datadog.create-event
with:
title: "AWS cost anomaly: {{account_id}}"
text: "Threshold {{threshold_usd}} USD exceeded. Jira: {{create-task.key}}"
alert_type: "warning"
consumes:
- type: http
namespace: aws-cost
baseUri: "https://ce.us-east-1.amazonaws.com"
authentication:
type: bearer
token: "$secrets.aws_cost_explorer_token"
resources:
- name: anomalies
path: "/GetAnomalies"
operations:
- name: get-anomalies
method: POST
- type: http
namespace: jira
baseUri: "https://lowes.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
Searches the Confluence knowledge base for articles matching a query string within the store operations space.
naftiko: "0.5"
info:
label: "Confluence Knowledge Article Search"
description: "Searches the Confluence knowledge base for articles matching a query string within the store operations space."
tags:
- knowledge
- confluence
- store-ops
capability:
exposes:
- type: mcp
namespace: knowledge
port: 8080
tools:
- name: search-articles
description: "Search Confluence for knowledge articles by keyword. Returns matching article titles, URLs, and last modified dates."
inputParameters:
- name: query
type: string
description: "Search query string."
call: confluence.search
with:
query: "{{query}}"
outputParameters:
- name: results
type: array
mapping: "$.results"
- name: total_size
type: integer
mapping: "$.totalSize"
consumes:
- type: http
namespace: confluence
baseUri: "https://lowes.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content/search"
inputParameters:
- name: query
in: query
operations:
- name: search
method: GET
Verifies contractor licenses by pulling Pro account data from Salesforce, checking compliance documents in Box, and updating verification status in Snowflake.
naftiko: "0.5"
info:
label: "Contractor License Verification"
description: "Verifies contractor licenses by pulling Pro account data from Salesforce, checking compliance documents in Box, and updating verification status in Snowflake."
tags:
- loyalty
- salesforce
- box
- snowflake
capability:
exposes:
- type: mcp
namespace: pro-services
port: 8080
tools:
- name: verify-contractor-license
description: "Given a Pro account ID, pull Salesforce data, check Box license documents, and update Snowflake verification status."
inputParameters:
- name: account_id
type: string
description: "Salesforce Pro account ID."
steps:
- name: get-account
type: call
call: salesforce.get-account
with:
account_id: "{{account_id}}"
- name: check-documents
type: call
call: box.get-folder-items
with:
folder_id: "{{get-account.license_folder_id}}"
- name: update-status
type: call
call: snowflake.run-query
with:
statement: "UPDATE PRO_ACCOUNTS SET license_verified=TRUE, doc_count={{check-documents.total_count}} WHERE account_id='{{account_id}}'"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: box
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: folders
path: "/folders/{{folder_id}}/items"
inputParameters:
- name: folder_id
in: path
operations:
- name: get-folder-items
method: GET
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Generates a project quote for Pro contractors by pulling product pricing from BigCommerce, checking bulk availability in Oracle, and creating the quote in Salesforce.
naftiko: "0.5"
info:
label: "Contractor Project Quote Generator"
description: "Generates a project quote for Pro contractors by pulling product pricing from BigCommerce, checking bulk availability in Oracle, and creating the quote in Salesforce."
tags:
- e-commerce
- bigcommerce
- oracle
- salesforce
capability:
exposes:
- type: mcp
namespace: pro-services
port: 8080
tools:
- name: generate-project-quote
description: "Given a list of SKUs and quantities, fetch BigCommerce pricing, check Oracle bulk availability, and create a Salesforce quote."
inputParameters:
- name: account_id
type: string
description: "Salesforce Pro account ID."
- name: sku_list
type: string
description: "Comma-separated list of product SKUs."
- name: quantities
type: string
description: "Comma-separated quantities matching SKU list."
steps:
- name: get-pricing
type: call
call: bigcommerce.get-bulk-pricing
with:
skus: "{{sku_list}}"
- name: check-availability
type: call
call: oracle.get-bulk-onhand
with:
items: "{{sku_list}}"
org_code: "DC01"
- name: create-quote
type: call
call: salesforce.create-quote
with:
account_id: "{{account_id}}"
line_items: "{{get-pricing.items}}"
availability: "{{check-availability.results}}"
consumes:
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: pricing
path: "/v3/catalog/products"
operations:
- name: get-bulk-pricing
method: GET
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: inventory
path: "/inventoryBalances"
operations:
- name: get-bulk-onhand
method: GET
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: quotes
path: "/sobjects/Quote"
operations:
- name: create-quote
method: POST
Manages cross-dock replenishment by checking store inventory levels in SAP, creating transfer orders in Oracle, and notifying the logistics team via Teams.
naftiko: "0.5"
info:
label: "Cross-Dock Replenishment Orchestrator"
description: "Manages cross-dock replenishment by checking store inventory levels in SAP, creating transfer orders in Oracle, and notifying the logistics team via Teams."
tags:
- supply-chain
- sap
- oracle
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: logistics
port: 8080
tools:
- name: trigger-cross-dock-replenishment
description: "Given a store and material, check SAP stock levels, create Oracle transfer orders for low-stock items, and notify logistics."
inputParameters:
- name: store_number
type: string
description: "Destination store number."
- name: material_number
type: string
description: "SAP material number."
steps:
- name: check-stock
type: call
call: sap.get-stock-level
with:
material_number: "{{material_number}}"
plant: "{{store_number}}"
- name: create-transfer
type: call
call: oracle.create-transfer-order
with:
item: "{{material_number}}"
from_org: "DC_CENTRAL"
to_org: "{{store_number}}"
quantity: "{{check-stock.reorder_quantity}}"
- name: notify-logistics
type: call
call: msteams.send-message
with:
channel_id: "logistics-ops"
text: "Cross-dock replenishment initiated: {{material_number}} qty {{check-stock.reorder_quantity}} to Store {{store_number}}. Transfer: {{create-transfer.order_number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/A_MatlStkInAcctMod"
operations:
- name: get-stock-level
method: GET
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: transfers
path: "/transferOrders"
operations:
- name: create-transfer-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Manages curbside pickup by monitoring BigCommerce order status, sending customer notifications via HubSpot, and logging fulfillment metrics in Snowflake.
naftiko: "0.5"
info:
label: "Curbside Pickup Notification Pipeline"
description: "Manages curbside pickup by monitoring BigCommerce order status, sending customer notifications via HubSpot, and logging fulfillment metrics in Snowflake."
tags:
- e-commerce
- bigcommerce
- hubspot
- snowflake
capability:
exposes:
- type: mcp
namespace: ecommerce-ops
port: 8080
tools:
- name: notify-curbside-pickup
description: "Given an order number, check BigCommerce fulfillment status, send HubSpot notification to customer, and log in Snowflake."
inputParameters:
- name: order_number
type: string
description: "BigCommerce order number."
- name: store_number
type: string
description: "Pickup store number."
steps:
- name: get-order
type: call
call: bigcommerce.get-order
with:
order_number: "{{order_number}}"
- name: send-notification
type: call
call: hubspot.send-email
with:
to: "{{get-order.billing_address.email}}"
template_id: "curbside-ready"
- name: log-fulfillment
type: call
call: snowflake.run-query
with:
statement: "INSERT INTO CURBSIDE_FULFILLMENT VALUES ('{{order_number}}', '{{store_number}}', CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: orders
path: "/v2/orders/{{order_number}}"
inputParameters:
- name: order_number
in: path
operations:
- name: get-order
method: GET
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Escalates customer complaints by looking up the Salesforce case, pulling order details from BigCommerce, and creating a high-priority ServiceNow ticket for resolution.
naftiko: "0.5"
info:
label: "Customer Complaint Escalation Workflow"
description: "Escalates customer complaints by looking up the Salesforce case, pulling order details from BigCommerce, and creating a high-priority ServiceNow ticket for resolution."
tags:
- e-commerce
- salesforce
- bigcommerce
- servicenow
capability:
exposes:
- type: mcp
namespace: customer-service
port: 8080
tools:
- name: escalate-complaint
description: "Given a Salesforce case ID, pull case and order details, and create a priority ServiceNow resolution ticket."
inputParameters:
- name: case_id
type: string
description: "Salesforce case ID."
steps:
- name: get-case
type: call
call: salesforce.get-case
with:
case_id: "{{case_id}}"
- name: get-order
type: call
call: bigcommerce.get-order
with:
order_number: "{{get-case.order_number}}"
- name: create-escalation
type: call
call: servicenow.create-incident
with:
short_description: "Escalated complaint: {{get-case.subject}}"
category: "customer_service"
priority: "2"
description: "Order: {{get-case.order_number}}, Total: ${{get-order.total_inc_tax}}, Customer: {{get-case.contact_email}}"
assignment_group: "Customer_Resolution"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: orders
path: "/v2/orders/{{order_number}}"
inputParameters:
- name: order_number
in: path
operations:
- name: get-order
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Processes customer returns by looking up the order in BigCommerce, issuing a refund via Salesforce, and updating inventory in SAP.
naftiko: "0.5"
info:
label: "Customer Return Processing Workflow"
description: "Processes customer returns by looking up the order in BigCommerce, issuing a refund via Salesforce, and updating inventory in SAP."
tags:
- e-commerce
- bigcommerce
- salesforce
- sap
capability:
exposes:
- type: mcp
namespace: returns-ops
port: 8080
tools:
- name: process-customer-return
description: "Given an order number and return reason, look up BigCommerce order, create Salesforce refund case, and adjust SAP inventory."
inputParameters:
- name: order_number
type: string
description: "Original order number."
- name: return_reason
type: string
description: "Reason for return."
- name: sku
type: string
description: "Product SKU being returned."
steps:
- name: get-order
type: call
call: bigcommerce.get-order
with:
order_number: "{{order_number}}"
- name: create-refund-case
type: call
call: salesforce.create-case
with:
subject: "Return: Order {{order_number}} — {{return_reason}}"
customer_email: "{{get-order.billing_address.email}}"
amount: "{{get-order.total_inc_tax}}"
- name: adjust-inventory
type: call
call: sap.post-goods-receipt
with:
material_number: "{{sku}}"
quantity: "1"
movement_type: "651"
consumes:
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: orders
path: "/v2/orders/{{order_number}}"
inputParameters:
- name: order_number
in: path
operations:
- name: get-order
method: GET
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: material-documents
path: "/A_MaterialDocumentHeader"
operations:
- name: post-goods-receipt
method: POST
Remediates database performance issues by pulling Dynatrace metrics, analyzing slow queries in Splunk, and creating a ServiceNow change request for optimization.
naftiko: "0.5"
info:
label: "Database Performance Remediation"
description: "Remediates database performance issues by pulling Dynatrace metrics, analyzing slow queries in Splunk, and creating a ServiceNow change request for optimization."
tags:
- infrastructure
- dynatrace
- splunk
- servicenow
capability:
exposes:
- type: mcp
namespace: dba-ops
port: 8080
tools:
- name: remediate-db-performance
description: "Given a database host ID, pull Dynatrace metrics, find Splunk slow queries, and create ServiceNow change request."
inputParameters:
- name: host_id
type: string
description: "Dynatrace host entity ID for the database server."
steps:
- name: get-db-metrics
type: call
call: dynatrace.get-host
with:
host_id: "{{host_id}}"
- name: find-slow-queries
type: call
call: splunk.run-search
with:
query: "index=database host={{host_id}} duration>5000 | top query_text"
time_range: "-24h"
- name: create-change
type: call
call: servicenow.create-change
with:
short_description: "DB optimization: {{get-db-metrics.display_name}}"
description: "CPU: {{get-db-metrics.cpu_usage}}%, Top slow queries: {{find-slow-queries.event_count}}"
assignment_group: "Database_Administration"
consumes:
- type: http
namespace: dynatrace
baseUri: "https://lowes.live.dynatrace.com/api/v2"
authentication:
type: bearer
token: "$secrets.dynatrace_token"
resources:
- name: entities
path: "/entities/{{host_id}}"
inputParameters:
- name: host_id
in: path
operations:
- name: get-host
method: GET
- type: http
namespace: splunk
baseUri: "https://lowes-splunk.splunkcloud.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: searches
path: "/search/jobs"
operations:
- name: run-search
method: POST
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
Fetches SLO compliance data from Datadog for all production services and posts a weekly summary to the engineering Teams channel.
naftiko: "0.5"
info:
label: "Datadog SLO Weekly Compliance Report"
description: "Fetches SLO compliance data from Datadog for all production services and posts a weekly summary to the engineering Teams channel."
tags:
- observability
- slo
- datadog
- reporting
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: slo-reporting
port: 8080
tools:
- name: publish-slo-compliance
description: "Fetch weekly SLO compliance metrics for all production services from Datadog and post a summary to the engineering Teams channel. Use every Monday for the weekly ops review."
inputParameters:
- name: teams_channel_id
type: string
description: "Teams channel ID for engineering operations reporting."
steps:
- name: get-slos
type: call
call: datadog.list-slos
with:
tags: "env:production"
- name: post-report
type: call
call: msteams.post-channel-message
with:
channel_id: "{{teams_channel_id}}"
text: "Weekly SLO Report: {{get-slos.complianceCount}} services meeting targets out of {{get-slos.totalCount}} total."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: slos
path: "/slo"
inputParameters:
- name: tags
in: query
operations:
- name: list-slos
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/engineering/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a Datadog monitor fires for a store infrastructure resource, creates a ServiceNow incident and pages the on-call store operations engineer.
naftiko: "0.5"
info:
label: "Datadog Store Infrastructure Alert"
description: "When a Datadog monitor fires for a store infrastructure resource, creates a ServiceNow incident and pages the on-call store operations engineer."
tags:
- itsm
- observability
- datadog
- servicenow
- incident-response
capability:
exposes:
- type: mcp
namespace: store-ops
port: 8080
tools:
- name: handle-store-infrastructure-alert
description: "Given a Datadog alert for a store infrastructure issue, create a ServiceNow incident with store details and alert the store operations Teams channel."
inputParameters:
- name: monitor_id
type: string
description: "Datadog monitor ID that triggered the alert."
- name: store_number
type: string
description: "Lowe's store number affected by the alert."
- name: severity
type: string
description: "Alert severity: critical, warning, or info."
steps:
- name: get-monitor
type: call
call: datadog.get-monitor
with:
monitor_id: "{{monitor_id}}"
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Store {{store_number}} infrastructure alert — {{severity}}"
urgency: "1"
impact: "1"
description: "Monitor {{monitor_id}}: {{get-monitor.message}}"
- name: notify-ops
type: call
call: msteams.post-channel-message
with:
channel_id: "store-ops-alerts"
text: "Store {{store_number}} alert ({{severity}}): {{get-monitor.name}} | ServiceNow: {{create-incident.number}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/store-ops/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Checks the status of a Datadog synthetic monitor for store POS system uptime by monitor ID.
naftiko: "0.5"
info:
label: "Datadog Store POS Monitor Status"
description: "Checks the status of a Datadog synthetic monitor for store POS system uptime by monitor ID."
tags:
- monitoring
- datadog
- store-ops
capability:
exposes:
- type: mcp
namespace: monitoring
port: 8080
tools:
- name: get-pos-monitor
description: "Check Datadog POS monitor status by monitor ID. Returns overall status, last triggered time, and affected stores."
inputParameters:
- name: monitor_id
type: string
description: "Datadog monitor ID."
call: datadog.get-monitor
with:
monitor_id: "{{monitor_id}}"
outputParameters:
- name: overall_state
type: string
mapping: "$.overall_state"
- name: name
type: string
mapping: "$.name"
- name: last_triggered
type: string
mapping: "$.overall_state_modified"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
Tracks outbound distribution center shipments by pulling Oracle shipping data, verifying SAP delivery documents, and posting status updates to Teams.
naftiko: "0.5"
info:
label: "DC Outbound Shipment Tracker"
description: "Tracks outbound distribution center shipments by pulling Oracle shipping data, verifying SAP delivery documents, and posting status updates to Teams."
tags:
- supply-chain
- oracle
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: logistics
port: 8080
tools:
- name: track-dc-shipment
description: "Given a shipment ID, pull Oracle shipping data, verify SAP delivery document, and post Teams status update."
inputParameters:
- name: shipment_id
type: string
description: "Oracle shipment ID."
- name: delivery_number
type: string
description: "SAP delivery document number."
steps:
- name: get-shipment
type: call
call: oracle.get-shipment
with:
shipment_id: "{{shipment_id}}"
- name: verify-delivery
type: call
call: sap.get-delivery
with:
delivery_number: "{{delivery_number}}"
- name: post-status
type: call
call: msteams.send-message
with:
channel_id: "dc-operations"
text: "Shipment {{shipment_id}}: {{get-shipment.status}}. SAP delivery {{delivery_number}} to Store {{verify-delivery.ship_to_plant}}. ETA: {{get-shipment.eta}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: shipments
path: "/shipments/{{shipment_id}}"
inputParameters:
- name: shipment_id
in: path
operations:
- name: get-shipment
method: GET
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV_V2"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: deliveries
path: "/A_OutbDeliveryHeader('{{delivery_number}}')"
inputParameters:
- name: delivery_number
in: path
operations:
- name: get-delivery
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Tracks marketing campaign ROI by pulling Adobe Analytics conversion data, HubSpot email metrics, and publishing the report to a Snowflake analytics table.
naftiko: "0.5"
info:
label: "Digital Marketing Campaign ROI Tracker"
description: "Tracks marketing campaign ROI by pulling Adobe Analytics conversion data, HubSpot email metrics, and publishing the report to a Snowflake analytics table."
tags:
- marketing
- adobe-analytics
- hubspot
- snowflake
capability:
exposes:
- type: mcp
namespace: marketing-ops
port: 8080
tools:
- name: track-campaign-roi
description: "Given a campaign ID and date range, pull Adobe Analytics conversions, HubSpot email performance, and store ROI metrics in Snowflake."
inputParameters:
- name: campaign_id
type: string
description: "Marketing campaign ID."
- name: start_date
type: string
description: "Campaign start date in YYYY-MM-DD format."
- name: end_date
type: string
description: "Campaign end date in YYYY-MM-DD format."
steps:
- name: get-conversions
type: call
call: adobe.get-report
with:
campaign_id: "{{campaign_id}}"
date_range: "{{start_date}}/{{end_date}}"
- name: get-email-metrics
type: call
call: hubspot.get-campaign-metrics
with:
campaign_id: "{{campaign_id}}"
- name: store-roi
type: call
call: snowflake.run-query
with:
statement: "INSERT INTO CAMPAIGN_ROI VALUES ('{{campaign_id}}', {{get-conversions.revenue}}, {{get-email-metrics.open_rate}}, {{get-email-metrics.click_rate}}, CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: adobe
baseUri: "https://analytics.adobe.io/api/lowes"
authentication:
type: bearer
token: "$secrets.adobe_analytics_token"
resources:
- name: reports
path: "/reports"
operations:
- name: get-report
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: campaigns
path: "/marketing/v3/campaigns/{{campaign_id}}"
inputParameters:
- name: campaign_id
in: path
operations:
- name: get-campaign-metrics
method: GET
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Checks the health status of a monitored host in Dynatrace by host ID, returning availability and CPU metrics.
naftiko: "0.5"
info:
label: "Dynatrace Host Health Check"
description: "Checks the health status of a monitored host in Dynatrace by host ID, returning availability and CPU metrics."
tags:
- monitoring
- dynatrace
- infrastructure
capability:
exposes:
- type: mcp
namespace: monitoring
port: 8080
tools:
- name: get-host-health
description: "Check Dynatrace host health by host ID. Returns availability state, CPU usage percentage, and memory usage."
inputParameters:
- name: host_id
type: string
description: "Dynatrace host entity ID."
call: dynatrace.get-host
with:
host_id: "{{host_id}}"
outputParameters:
- name: display_name
type: string
mapping: "$.displayName"
- name: state
type: string
mapping: "$.availabilityState"
- name: cpu_usage
type: number
mapping: "$.cpuUsagePercent"
consumes:
- type: http
namespace: dynatrace
baseUri: "https://lowes.live.dynatrace.com/api/v2"
authentication:
type: bearer
token: "$secrets.dynatrace_token"
resources:
- name: hosts
path: "/entities/{{host_id}}"
inputParameters:
- name: host_id
in: path
operations:
- name: get-host
method: GET
Tracks an online order by looking up the order in BigCommerce, checking warehouse inventory in Oracle, and sending a fulfillment status update to the customer via Salesforce.
naftiko: "0.5"
info:
label: "E-Commerce Order Fulfillment Tracker"
description: "Tracks an online order by looking up the order in BigCommerce, checking warehouse inventory in Oracle, and sending a fulfillment status update to the customer via Salesforce."
tags:
- e-commerce
- bigcommerce
- oracle
- salesforce
capability:
exposes:
- type: mcp
namespace: ecommerce-ops
port: 8080
tools:
- name: track-order-fulfillment
description: "Given an order number, look up BigCommerce order details, check Oracle warehouse stock, and update the Salesforce case with fulfillment status."
inputParameters:
- name: order_number
type: string
description: "BigCommerce order number."
- name: case_id
type: string
description: "Salesforce case ID for customer inquiry."
steps:
- name: get-order
type: call
call: bigcommerce.get-order
with:
order_number: "{{order_number}}"
- name: check-stock
type: call
call: oracle.get-onhand
with:
item_number: "{{get-order.line_items[0].sku}}"
org_code: "DC01"
- name: update-case
type: call
call: salesforce.update-case
with:
case_id: "{{case_id}}"
status: "In Progress"
comment: "Order {{order_number}} stock confirmed: {{check-stock.on_hand}} units at DC01. Shipping initiated."
consumes:
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: orders
path: "/v2/orders/{{order_number}}"
inputParameters:
- name: order_number
in: path
operations:
- name: get-order
method: GET
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: inventory
path: "/inventoryBalances"
operations:
- name: get-onhand
method: GET
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: update-case
method: PATCH
Tunes e-commerce search relevance by pulling Adobe Analytics search data, analyzing click-through rates in Snowflake, and updating BigCommerce search weights.
naftiko: "0.5"
info:
label: "E-Commerce Search Relevance Tuning"
description: "Tunes e-commerce search relevance by pulling Adobe Analytics search data, analyzing click-through rates in Snowflake, and updating BigCommerce search weights."
tags:
- e-commerce
- adobe-analytics
- snowflake
- bigcommerce
capability:
exposes:
- type: mcp
namespace: ecommerce-ops
port: 8080
tools:
- name: tune-search-relevance
description: "Given a search term, pull Adobe Analytics CTR data, analyze Snowflake conversion funnel, and update BigCommerce search weights."
inputParameters:
- name: search_term
type: string
description: "Search term to optimize."
steps:
- name: get-search-analytics
type: call
call: adobe.get-report
with:
search_term: "{{search_term}}"
metric: "click_through_rate"
- name: analyze-funnel
type: call
call: snowflake.run-query
with:
statement: "SELECT result_position, click_count, conversion_count FROM SEARCH_FUNNEL WHERE term='{{search_term}}' AND date > DATEADD(day, -30, CURRENT_DATE())"
- name: update-weights
type: call
call: bigcommerce.update-search-config
with:
term: "{{search_term}}"
boost_skus: "{{analyze-funnel.results}}"
consumes:
- type: http
namespace: adobe
baseUri: "https://analytics.adobe.io/api/lowes"
authentication:
type: bearer
token: "$secrets.adobe_analytics_token"
resources:
- name: reports
path: "/reports"
operations:
- name: get-report
method: POST
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: search-config
path: "/v3/catalog/search"
operations:
- name: update-search-config
method: PUT
Prepares performance review packages by pulling Workday employee data, Snowflake sales metrics, and creating a Confluence review page for the manager.
naftiko: "0.5"
info:
label: "Employee Performance Review Pipeline"
description: "Prepares performance review packages by pulling Workday employee data, Snowflake sales metrics, and creating a Confluence review page for the manager."
tags:
- hr
- workday
- snowflake
- confluence
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: prepare-performance-review
description: "Given a worker ID and review period, pull Workday profile, Snowflake sales performance data, and create a Confluence review page."
inputParameters:
- name: worker_id
type: string
description: "Workday worker ID."
- name: review_period
type: string
description: "Review period (e.g., 2025-H2)."
steps:
- name: get-employee
type: call
call: workday.get-worker-profile
with:
worker_id: "{{worker_id}}"
- name: get-performance
type: call
call: snowflake.run-query
with:
statement: "SELECT total_sales, customer_satisfaction, tasks_completed FROM ASSOCIATE_PERFORMANCE WHERE worker_id='{{worker_id}}' AND period='{{review_period}}'"
- name: create-review-page
type: call
call: confluence.create-page
with:
space: "HR_REVIEWS"
title: "Performance Review: {{get-employee.full_name}} — {{review_period}}"
body: "Sales: {{get-performance.results[0].total_sales}}, CSAT: {{get-performance.results[0].customer_satisfaction}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/lowes/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker-profile
method: GET
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: confluence
baseUri: "https://lowes.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
method: POST
Processes time-off requests by verifying Workday balances, checking staffing coverage in Snowflake, and notifying the manager via Teams.
naftiko: "0.5"
info:
label: "Employee Time-Off Approval Pipeline"
description: "Processes time-off requests by verifying Workday balances, checking staffing coverage in Snowflake, and notifying the manager via Teams."
tags:
- hr
- workday
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: process-time-off-request
description: "Given a worker ID and requested dates, verify Workday PTO balance, check Snowflake staffing coverage, and notify the manager."
inputParameters:
- name: worker_id
type: string
description: "Workday worker ID."
- name: start_date
type: string
description: "Start date in YYYY-MM-DD format."
- name: end_date
type: string
description: "End date in YYYY-MM-DD format."
steps:
- name: check-balance
type: call
call: workday.get-time-off-balance
with:
worker_id: "{{worker_id}}"
- name: check-coverage
type: call
call: snowflake.run-query
with:
statement: "SELECT scheduled_count, minimum_required FROM STAFFING_COVERAGE WHERE store=(SELECT store FROM ASSOCIATES WHERE worker_id='{{worker_id}}') AND date BETWEEN '{{start_date}}' AND '{{end_date}}'"
- name: notify-manager
type: call
call: msteams.send-message
with:
channel_id: "{{check-balance.manager_channel}}"
text: "Time-off request: {{check-balance.employee_name}} ({{start_date}} to {{end_date}}). PTO balance: {{check-balance.remaining_hours}}h. Coverage: {{check-coverage.results[0].scheduled_count}}/{{check-coverage.results[0].minimum_required}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: time-off
path: "/lowes/workers/{{worker_id}}/timeOffBalance"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-time-off-balance
method: GET
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Monitors store energy consumption by pulling utility data from Snowflake, comparing against targets in SAP, and creating ServiceNow alerts for anomalies.
naftiko: "0.5"
info:
label: "Energy Management Monitoring Pipeline"
description: "Monitors store energy consumption by pulling utility data from Snowflake, comparing against targets in SAP, and creating ServiceNow alerts for anomalies."
tags:
- store-ops
- snowflake
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: facilities
port: 8080
tools:
- name: monitor-energy-consumption
description: "Given a store number and date, pull Snowflake energy data, compare SAP targets, and create ServiceNow alerts for overages."
inputParameters:
- name: store_number
type: string
description: "Store number."
- name: date
type: string
description: "Date in YYYY-MM-DD format."
steps:
- name: get-usage
type: call
call: snowflake.run-query
with:
statement: "SELECT kwh_consumed, cost, peak_demand FROM ENERGY_USAGE WHERE store='{{store_number}}' AND date='{{date}}'"
- name: get-target
type: call
call: sap.get-cost-center
with:
plant: "{{store_number}}"
account: "energy_budget"
- name: create-alert
type: call
call: servicenow.create-incident
with:
short_description: "Energy anomaly: Store {{store_number}} — {{date}}"
category: "facilities"
assignment_group: "Energy_Management"
consumes:
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: cost-centers
path: "/A_CostCenter"
operations:
- name: get-cost-center
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Detects potential gift card fraud by analyzing transaction patterns in Splunk, creating a ServiceNow investigation case, and freezing the card via the payment gateway.
naftiko: "0.5"
info:
label: "Gift Card Fraud Detection Workflow"
description: "Detects potential gift card fraud by analyzing transaction patterns in Splunk, creating a ServiceNow investigation case, and freezing the card via the payment gateway."
tags:
- security
- splunk
- servicenow
- e-commerce
capability:
exposes:
- type: mcp
namespace: fraud-ops
port: 8080
tools:
- name: investigate-gift-card-fraud
description: "Given a gift card number, pull Splunk transaction patterns, create a ServiceNow fraud case, and freeze the card."
inputParameters:
- name: card_number
type: string
description: "Gift card number (masked)."
- name: store_number
type: string
description: "Store where suspicious activity detected."
steps:
- name: analyze-transactions
type: call
call: splunk.run-search
with:
query: "index=pos gift_card={{card_number}} | stats count by transaction_type, amount"
time_range: "-7d"
- name: create-case
type: call
call: servicenow.create-incident
with:
short_description: "Gift card fraud alert: {{card_number}} — Store {{store_number}}"
category: "fraud"
priority: "1"
assignment_group: "Loss_Prevention"
- name: freeze-card
type: call
call: salesforce.update-gift-card
with:
card_id: "{{card_number}}"
status: "frozen"
reason: "Fraud investigation: {{create-case.number}}"
consumes:
- type: http
namespace: splunk
baseUri: "https://lowes-splunk.splunkcloud.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: searches
path: "/search/jobs"
operations:
- name: run-search
method: POST
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: gift-cards
path: "/sobjects/GiftCard__c/{{card_id}}"
inputParameters:
- name: card_id
in: path
operations:
- name: update-gift-card
method: PATCH
When a GitHub release is tagged, generates release notes with Anthropic Claude and posts them to Confluence and the engineering Teams channel.
naftiko: "0.5"
info:
label: "GitHub Release Notes Publisher"
description: "When a GitHub release is tagged, generates release notes with Anthropic Claude and posts them to Confluence and the engineering Teams channel."
tags:
- devops
- github
- anthropic
- confluence
- release-management
capability:
exposes:
- type: mcp
namespace: release-ops
port: 8080
tools:
- name: publish-release-notes
description: "Given a GitHub repository and release tag, retrieve the release body, generate polished release notes with Anthropic Claude, publish to Confluence, and announce in the engineering Teams channel."
inputParameters:
- name: repo_owner
type: string
description: "GitHub organization or owner name."
- name: repo_name
type: string
description: "GitHub repository name."
- name: tag
type: string
description: "Release tag name (e.g., v2.1.0)."
- name: teams_channel_id
type: string
description: "Teams channel ID for engineering announcements."
steps:
- name: get-release
type: call
call: github.get-release
with:
owner: "{{repo_owner}}"
repo: "{{repo_name}}"
tag: "{{tag}}"
- name: generate-notes
type: call
call: anthropic.create-message
with:
model: "claude-3-5-sonnet-20241022"
prompt: "Write professional release notes for an internal engineering audience based on: {{get-release.body}}"
- name: publish-confluence
type: call
call: confluence.create-page
with:
space_key: "ENG"
title: "Release {{tag}} — {{repo_name}}"
content: "{{generate-notes.content}}"
- name: announce-teams
type: call
call: msteams.post-channel-message
with:
channel_id: "{{teams_channel_id}}"
text: "Release {{tag}} published for {{repo_name}}. Confluence: {{publish-confluence.url}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: releases
path: "/repos/{{owner}}/{{repo}}/releases/tags/{{tag}}"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: tag
in: path
operations:
- name: get-release
method: GET
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: confluence
baseUri: "https://lowes.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/engineering/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves branch protection rules for a GitHub repository, returning required reviews and status checks.
naftiko: "0.5"
info:
label: "GitHub Repository Branch Protection"
description: "Retrieves branch protection rules for a GitHub repository, returning required reviews and status checks."
tags:
- devops
- github
- security
capability:
exposes:
- type: mcp
namespace: devops
port: 8080
tools:
- name: get-branch-protection
description: "Look up GitHub branch protection rules for a repository and branch. Returns required review count and status check requirements."
inputParameters:
- name: repo_name
type: string
description: "GitHub repository name (org/repo format)."
- name: branch
type: string
description: "Branch name (e.g., main)."
call: github.get-protection
with:
repo_name: "{{repo_name}}"
branch: "{{branch}}"
outputParameters:
- name: required_reviews
type: integer
mapping: "$.required_pull_request_reviews.required_approving_review_count"
- name: enforce_admins
type: boolean
mapping: "$.enforce_admins.enabled"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: branch-protection
path: "/repos/{{repo_name}}/branches/{{branch}}/protection"
inputParameters:
- name: repo_name
in: path
- name: branch
in: path
operations:
- name: get-protection
method: GET
Retrieves critical Dependabot alerts from GitHub for all production repositories and creates Jira security issues for each critical finding.
naftiko: "0.5"
info:
label: "GitHub Security Vulnerability Scan"
description: "Retrieves critical Dependabot alerts from GitHub for all production repositories and creates Jira security issues for each critical finding."
tags:
- security
- devops
- github
- jira
- vulnerability-management
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: scan-repo-vulnerabilities
description: "Given a GitHub repository owner and name, retrieve all critical Dependabot alerts and create a Jira security issue for each. Use during weekly security scanning cycles."
inputParameters:
- name: repo_owner
type: string
description: "GitHub organization or owner name."
- name: repo_name
type: string
description: "GitHub repository name."
steps:
- name: get-alerts
type: call
call: github.list-dependabot-alerts
with:
owner: "{{repo_owner}}"
repo: "{{repo_name}}"
severity: "critical"
- name: create-security-issue
type: call
call: jira.create-issue
with:
project_key: "SEC"
issuetype: "Bug"
summary: "Critical vulnerabilities: {{repo_owner}}/{{repo_name}}"
description: "{{get-alerts.count}} critical Dependabot alerts found. Repo: https://github.com/{{repo_owner}}/{{repo_name}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: dependabot-alerts
path: "/repos/{{owner}}/{{repo}}/dependabot/alerts"
inputParameters:
- name: owner
in: path
- name: repo
in: path
- name: severity
in: query
operations:
- name: list-dependabot-alerts
method: GET
- type: http
namespace: jira
baseUri: "https://lowes.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Fetches web traffic metrics from Google Analytics for the Lowes.com storefront by date range.
naftiko: "0.5"
info:
label: "Google Analytics Store Traffic"
description: "Fetches web traffic metrics from Google Analytics for the Lowes.com storefront by date range."
tags:
- analytics
- google-analytics
- e-commerce
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: get-store-traffic
description: "Retrieve Google Analytics traffic metrics for lowes.com. Returns sessions, page views, and bounce rate for the specified period."
inputParameters:
- name: start_date
type: string
description: "Start date in YYYY-MM-DD format."
- name: end_date
type: string
description: "End date in YYYY-MM-DD format."
call: ga.get-report
with:
start_date: "{{start_date}}"
end_date: "{{end_date}}"
outputParameters:
- name: sessions
type: integer
mapping: "$.reports[0].data.totals[0].values[0]"
- name: pageviews
type: integer
mapping: "$.reports[0].data.totals[0].values[1]"
- name: bounce_rate
type: number
mapping: "$.reports[0].data.totals[0].values[2]"
consumes:
- type: http
namespace: ga
baseUri: "https://analyticsdata.googleapis.com/v1beta"
authentication:
type: bearer
token: "$secrets.google_analytics_token"
resources:
- name: reports
path: "/properties/lowes:runReport"
operations:
- name: get-report
method: POST
Looks up a HubSpot contact by email address, returning contact properties and lifecycle stage.
naftiko: "0.5"
info:
label: "HubSpot Contact Lookup"
description: "Looks up a HubSpot contact by email address, returning contact properties and lifecycle stage."
tags:
- marketing
- hubspot
- crm
capability:
exposes:
- type: mcp
namespace: crm
port: 8080
tools:
- name: get-contact
description: "Look up a HubSpot contact by email. Returns name, lifecycle stage, and last activity date."
inputParameters:
- name: email
type: string
description: "Contact email address."
call: hubspot.get-contact
with:
email: "{{email}}"
outputParameters:
- name: full_name
type: string
mapping: "$.properties.firstname"
- name: lifecycle_stage
type: string
mapping: "$.properties.lifecyclestage"
- name: last_activity
type: string
mapping: "$.properties.lastactivitydate"
consumes:
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com/crm/v3"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/objects/contacts/{{email}}?idProperty=email"
inputParameters:
- name: email
in: path
operations:
- name: get-contact
method: GET
Handles infrastructure scaling alerts by checking Datadog metrics, triggering Azure auto-scaling, and logging the event in ServiceNow.
naftiko: "0.5"
info:
label: "Infrastructure Scaling Alert Handler"
description: "Handles infrastructure scaling alerts by checking Datadog metrics, triggering Azure auto-scaling, and logging the event in ServiceNow."
tags:
- infrastructure
- datadog
- microsoft-azure
- servicenow
capability:
exposes:
- type: mcp
namespace: platform-ops
port: 8080
tools:
- name: handle-scaling-alert
description: "Given a Datadog alert ID, check metrics, trigger Azure scale-out, and log the scaling event in ServiceNow."
inputParameters:
- name: alert_id
type: string
description: "Datadog alert ID."
- name: resource_group
type: string
description: "Azure resource group name."
steps:
- name: get-metrics
type: call
call: datadog.get-monitor
with:
monitor_id: "{{alert_id}}"
- name: scale-resources
type: call
call: azure.scale-vmss
with:
resource_group: "{{resource_group}}"
target_capacity: "{{get-metrics.recommended_capacity}}"
- name: log-event
type: call
call: servicenow.create-incident
with:
short_description: "Auto-scale triggered: {{resource_group}} — capacity {{scale-resources.new_capacity}}"
category: "infrastructure"
assignment_group: "Cloud_Platform"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: azure
baseUri: "https://management.azure.com/subscriptions/{{subscription_id}}"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: vmss
path: "/resourceGroups/{{resource_group}}/providers/Microsoft.Compute/virtualMachineScaleSets"
operations:
- name: scale-vmss
method: PATCH
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Manages installation service appointments by looking up the customer order in Salesforce, checking contractor availability in Workday, and confirming the appointment via HubSpot email.
naftiko: "0.5"
info:
label: "Installation Services Scheduling Pipeline"
description: "Manages installation service appointments by looking up the customer order in Salesforce, checking contractor availability in Workday, and confirming the appointment via HubSpot email."
tags:
- e-commerce
- salesforce
- workday
- hubspot
capability:
exposes:
- type: mcp
namespace: install-services
port: 8080
tools:
- name: schedule-installation
description: "Given an order ID and preferred date, look up the Salesforce order, find available Workday contractors, and send HubSpot confirmation email."
inputParameters:
- name: order_id
type: string
description: "Salesforce order ID."
- name: preferred_date
type: string
description: "Preferred installation date in YYYY-MM-DD format."
- name: service_type
type: string
description: "Installation service type (flooring, appliance, roofing, fencing)."
steps:
- name: get-order
type: call
call: salesforce.get-order
with:
order_id: "{{order_id}}"
- name: find-contractor
type: call
call: workday.find-available-worker
with:
skill: "{{service_type}}"
date: "{{preferred_date}}"
region: "{{get-order.shipping_region}}"
- name: send-confirmation
type: call
call: hubspot.send-email
with:
to: "{{get-order.customer_email}}"
template_id: "installation-confirmation"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: orders
path: "/sobjects/Order/{{order_id}}"
inputParameters:
- name: order_id
in: path
operations:
- name: get-order
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/lowes/workers"
operations:
- name: find-available-worker
method: GET
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Optimizes inventory reorder points by analyzing Snowflake demand patterns, updating SAP safety stock levels, and creating Oracle replenishment orders.
naftiko: "0.5"
info:
label: "Inventory Reorder Point Optimization"
description: "Optimizes inventory reorder points by analyzing Snowflake demand patterns, updating SAP safety stock levels, and creating Oracle replenishment orders."
tags:
- inventory
- snowflake
- sap
- oracle
capability:
exposes:
- type: mcp
namespace: inventory-ops
port: 8080
tools:
- name: optimize-reorder-points
description: "Given a product category, analyze Snowflake demand, update SAP safety stock, and trigger Oracle replenishment."
inputParameters:
- name: category_code
type: string
description: "Product category code."
- name: service_level
type: number
description: "Target service level (e.g., 0.95)."
steps:
- name: analyze-demand
type: call
call: snowflake.run-query
with:
statement: "SELECT sku, avg_daily_demand, demand_std_dev FROM DEMAND_ANALYSIS WHERE category='{{category_code}}'"
- name: update-safety-stock
type: call
call: sap.update-mrp
with:
category: "{{category_code}}"
service_level: "{{service_level}}"
demand_data: "{{analyze-demand.results}}"
- name: create-replenishment
type: call
call: oracle.create-replenishment
with:
category: "{{category_code}}"
items: "{{analyze-demand.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV_01"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: mrp
path: "/A_MRPMaterial"
operations:
- name: update-mrp
method: PATCH
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: replenishment
path: "/replenishmentOrders"
operations:
- name: create-replenishment
method: POST
Manages IT asset lifecycle by tracking assets in ServiceNow, verifying warranty status in Oracle, and scheduling replacement procurement in SAP.
naftiko: "0.5"
info:
label: "IT Asset Lifecycle Management"
description: "Manages IT asset lifecycle by tracking assets in ServiceNow, verifying warranty status in Oracle, and scheduling replacement procurement in SAP."
tags:
- infrastructure
- servicenow
- oracle
- sap
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: manage-asset-lifecycle
description: "Given an asset tag, check ServiceNow asset record, verify Oracle warranty, and create SAP procurement request if replacement needed."
inputParameters:
- name: asset_tag
type: string
description: "IT asset tag identifier."
- name: store_number
type: string
description: "Store where asset is located."
steps:
- name: get-asset
type: call
call: servicenow.get-asset
with:
asset_tag: "{{asset_tag}}"
- name: check-warranty
type: call
call: oracle.get-warranty
with:
serial_number: "{{get-asset.serial_number}}"
- name: create-requisition
type: call
call: sap.create-requisition
with:
material: "{{get-asset.model_category}}"
plant: "{{store_number}}"
justification: "Warranty expires {{check-warranty.expiry_date}} for {{get-asset.display_name}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: assets
path: "/table/alm_asset?sysparm_query=asset_tag={{asset_tag}}"
inputParameters:
- name: asset_tag
in: query
operations:
- name: get-asset
method: GET
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: warranties
path: "/warranties"
operations:
- name: get-warranty
method: GET
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PURCHASEREQ_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: requisitions
path: "/A_PurchaseRequisitionHeader"
operations:
- name: create-requisition
method: POST
Fetches completed Jira sprint issues and story points and posts a velocity digest to the engineering Teams channel.
naftiko: "0.5"
info:
label: "Jira Sprint Velocity Summary"
description: "Fetches completed Jira sprint issues and story points and posts a velocity digest to the engineering Teams channel."
tags:
- devops
- project-management
- jira
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: agile-reporting
port: 8080
tools:
- name: digest-sprint-velocity
description: "Given a Jira board ID and sprint ID, fetch completed issues and total story points, then post a velocity summary to the engineering Teams channel."
inputParameters:
- name: board_id
type: string
description: "Jira board ID."
- name: sprint_id
type: string
description: "Jira sprint ID to summarize."
- name: teams_channel_id
type: string
description: "Teams channel ID for the engineering team."
steps:
- name: get-sprint-issues
type: call
call: jira.get-sprint-issues
with:
boardId: "{{board_id}}"
sprintId: "{{sprint_id}}"
- name: post-digest
type: call
call: msteams.post-channel-message
with:
channel_id: "{{teams_channel_id}}"
text: "Sprint {{sprint_id}} closed — {{get-sprint-issues.totalPoints}} story points delivered across {{get-sprint-issues.issueCount}} issues."
consumes:
- type: http
namespace: jira
baseUri: "https://lowes.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: sprint-issues
path: "/board/{{boardId}}/sprint/{{sprintId}}/issue"
inputParameters:
- name: boardId
in: path
- name: sprintId
in: path
operations:
- name: get-sprint-issues
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/engineering/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a new Pro customer enrolls in the loyalty program via Salesforce, provisions their rewards account, syncs to Snowflake analytics, and sends a welcome email via HubSpot.
naftiko: "0.5"
info:
label: "Loyalty Pro Rewards Enrollment Pipeline"
description: "When a new Pro customer enrolls in the loyalty program via Salesforce, provisions their rewards account, syncs to Snowflake analytics, and sends a welcome email via HubSpot."
tags:
- loyalty
- salesforce
- snowflake
- hubspot
capability:
exposes:
- type: mcp
namespace: loyalty-ops
port: 8080
tools:
- name: enroll-pro-rewards
description: "Given a Salesforce contact ID, create the Pro rewards profile, sync enrollment data to Snowflake, and trigger a HubSpot welcome email."
inputParameters:
- name: contact_id
type: string
description: "Salesforce contact ID for the Pro customer."
- name: rewards_tier
type: string
description: "Initial rewards tier (silver, gold, platinum)."
steps:
- name: get-contact
type: call
call: salesforce.get-contact
with:
contact_id: "{{contact_id}}"
- name: sync-enrollment
type: call
call: snowflake.run-query
with:
statement: "INSERT INTO PRO_REWARDS_ENROLLMENTS VALUES ('{{contact_id}}', '{{get-contact.email}}', '{{rewards_tier}}', CURRENT_TIMESTAMP())"
- name: send-welcome
type: call
call: hubspot.send-email
with:
to: "{{get-contact.email}}"
template_id: "pro-rewards-welcome"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/sobjects/Contact/{{contact_id}}"
inputParameters:
- name: contact_id
in: path
operations:
- name: get-contact
method: GET
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Automates seasonal markdown pricing by analyzing sell-through rates in Snowflake, updating product prices in BigCommerce, and logging the price changes in SAP.
naftiko: "0.5"
info:
label: "Markdown Clearance Automation"
description: "Automates seasonal markdown pricing by analyzing sell-through rates in Snowflake, updating product prices in BigCommerce, and logging the price changes in SAP."
tags:
- e-commerce
- snowflake
- bigcommerce
- sap
capability:
exposes:
- type: mcp
namespace: pricing-ops
port: 8080
tools:
- name: run-markdown-clearance
description: "Given a product category and target sell-through rate, analyze Snowflake inventory velocity, compute markdowns, update BigCommerce prices, and log in SAP."
inputParameters:
- name: category_code
type: string
description: "Product category for markdown."
- name: target_sell_through
type: number
description: "Target sell-through percentage (e.g., 0.85)."
steps:
- name: analyze-velocity
type: call
call: snowflake.run-query
with:
statement: "SELECT sku, current_price, weeks_of_supply, sell_through_rate FROM INVENTORY_VELOCITY WHERE category='{{category_code}}' AND sell_through_rate < {{target_sell_through}}"
- name: update-prices
type: call
call: bigcommerce.batch-update-prices
with:
items: "{{analyze-velocity.results}}"
markdown_pct: "25"
- name: log-changes
type: call
call: sap.post-price-change
with:
category: "{{category_code}}"
changes: "{{update-prices.updated_items}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: products
path: "/v3/catalog/products"
operations:
- name: batch-update-prices
method: PUT
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_SLSPRICINGCONDITIONRECORD_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: conditions
path: "/A_SlsPrcgCndnRecdValidity"
operations:
- name: post-price-change
method: POST
When a new associate is created in Workday, opens a ServiceNow onboarding ticket, provisions an Active Directory account via Microsoft Graph, and sends a Teams welcome message.
naftiko: "0.5"
info:
label: "New Hire Onboarding Orchestrator"
description: "When a new associate is created in Workday, opens a ServiceNow onboarding ticket, provisions an Active Directory account via Microsoft Graph, and sends a Teams welcome message."
tags:
- hr
- onboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Given a Workday employee ID and store number, orchestrate the full onboarding sequence: create a ServiceNow IT ticket, provision a Microsoft 365 account, and send a Teams welcome to the new associate."
inputParameters:
- name: employee_id
type: string
description: "Workday worker ID for the new associate."
- name: store_number
type: string
description: "Lowe's store number the associate is assigned to."
- name: start_date
type: string
description: "Employment start date in YYYY-MM-DD format."
steps:
- name: get-worker
type: call
call: workday.get-worker
with:
worker_id: "{{employee_id}}"
- name: create-ticket
type: call
call: servicenow.create-incident
with:
short_description: "New associate onboarding: {{get-worker.full_name}} — Store {{store_number}}"
category: "hr_onboarding"
assignment_group: "Store_IT"
- name: provision-account
type: call
call: msgraph.create-user
with:
displayName: "{{get-worker.full_name}}"
mail: "{{get-worker.work_email}}"
officeLocation: "Store {{store_number}}"
- name: send-welcome
type: call
call: msteams.send-message
with:
recipient_upn: "{{get-worker.work_email}}"
text: "Welcome to Lowe's, {{get-worker.first_name}}! Your onboarding ticket is {{create-ticket.number}}. Start date: {{start_date}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/lowes/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/chats"
operations:
- name: send-message
method: POST
Manages new product introductions by creating the material master in SAP, publishing the product listing on BigCommerce, and notifying merchandising via Teams.
naftiko: "0.5"
info:
label: "New Product Introduction Workflow"
description: "Manages new product introductions by creating the material master in SAP, publishing the product listing on BigCommerce, and notifying merchandising via Teams."
tags:
- inventory
- sap
- bigcommerce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: merchandising
port: 8080
tools:
- name: introduce-new-product
description: "Given product details, create SAP material master, publish BigCommerce listing, and notify the merchandising team."
inputParameters:
- name: product_name
type: string
description: "New product name."
- name: category_code
type: string
description: "Product category code."
- name: price
type: number
description: "Retail price in USD."
steps:
- name: create-material
type: call
call: sap.create-material
with:
description: "{{product_name}}"
category: "{{category_code}}"
- name: create-listing
type: call
call: bigcommerce.create-product
with:
name: "{{product_name}}"
sku: "{{create-material.material_number}}"
price: "{{price}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "merchandising-new-products"
text: "New product launched: {{product_name}} (SKU: {{create-material.material_number}}) at ${{price}}. BigCommerce listing: {{create-listing.url}}"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Product"
operations:
- name: create-material
method: POST
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: products
path: "/v3/catalog/products"
operations:
- name: create-product
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Fetches the current error rate for a New Relic application by app ID, returning error percentage and throughput.
naftiko: "0.5"
info:
label: "New Relic Application Error Rate"
description: "Fetches the current error rate for a New Relic application by app ID, returning error percentage and throughput."
tags:
- monitoring
- new-relic
- e-commerce
capability:
exposes:
- type: mcp
namespace: monitoring
port: 8080
tools:
- name: get-app-error-rate
description: "Retrieve the current error rate for a New Relic application. Returns error percentage and requests per minute."
inputParameters:
- name: app_id
type: string
description: "New Relic application ID."
call: newrelic.get-app-metrics
with:
app_id: "{{app_id}}"
outputParameters:
- name: error_rate
type: number
mapping: "$.application.error_rate"
- name: throughput
type: number
mapping: "$.application.throughput"
consumes:
- type: http
namespace: newrelic
baseUri: "https://api.newrelic.com/v2"
authentication:
type: bearer
token: "$secrets.newrelic_api_key"
resources:
- name: applications
path: "/applications/{{app_id}}.json"
inputParameters:
- name: app_id
in: path
operations:
- name: get-app-metrics
method: GET
When a ServiceNow access request is approved, provisions the user's Okta group membership and updates the ticket to resolved.
naftiko: "0.5"
info:
label: "Okta Access Request Fulfillment"
description: "When a ServiceNow access request is approved, provisions the user's Okta group membership and updates the ticket to resolved."
tags:
- identity
- security
- okta
- servicenow
- access-management
capability:
exposes:
- type: mcp
namespace: identity-ops
port: 8080
tools:
- name: fulfill-access-request
description: "Given an approved ServiceNow access request ticket, assign the user to the appropriate Okta group and mark the ticket resolved. Sends a confirmation via Teams."
inputParameters:
- name: snow_ticket_id
type: string
description: "ServiceNow access request sys_id."
- name: user_email
type: string
description: "User email address to provision access for."
- name: okta_group_id
type: string
description: "Okta group ID to assign the user to."
steps:
- name: add-to-group
type: call
call: okta.add-user-to-group
with:
groupId: "{{okta_group_id}}"
userId: "{{user_email}}"
- name: resolve-ticket
type: call
call: servicenow.update-request
with:
sys_id: "{{snow_ticket_id}}"
state: "3"
close_notes: "Access provisioned to Okta group {{okta_group_id}}"
- name: confirm-user
type: call
call: msteams.send-message
with:
recipient_upn: "{{user_email}}"
text: "Your access request has been fulfilled. You have been added to the requested system (group: {{okta_group_id}})."
consumes:
- type: http
namespace: okta
baseUri: "https://lowes.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: group-members
path: "/groups/{{groupId}}/users/{{userId}}"
inputParameters:
- name: groupId
in: path
- name: userId
in: path
operations:
- name: add-user-to-group
method: PUT
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: requests
path: "/table/sc_request/{{sys_id}}"
inputParameters:
- name: sys_id
in: path
operations:
- name: update-request
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/chats"
operations:
- name: send-message
method: POST
Builds a customer 360 view by pulling Salesforce account data, BigCommerce order history, and Google Analytics engagement metrics into a unified Snowflake profile.
naftiko: "0.5"
info:
label: "Omnichannel Customer 360 Pipeline"
description: "Builds a customer 360 view by pulling Salesforce account data, BigCommerce order history, and Google Analytics engagement metrics into a unified Snowflake profile."
tags:
- e-commerce
- salesforce
- bigcommerce
- google-analytics
- snowflake
capability:
exposes:
- type: mcp
namespace: customer-analytics
port: 8080
tools:
- name: build-customer-360
description: "Given a customer email, pull Salesforce profile, BigCommerce order history, Google Analytics behavior, and merge into Snowflake."
inputParameters:
- name: customer_email
type: string
description: "Customer email address."
steps:
- name: get-sf-profile
type: call
call: salesforce.get-contact-by-email
with:
email: "{{customer_email}}"
- name: get-orders
type: call
call: bigcommerce.get-customer-orders
with:
email: "{{customer_email}}"
- name: get-behavior
type: call
call: ga.get-user-report
with:
user_id: "{{customer_email}}"
- name: merge-profile
type: call
call: snowflake.run-query
with:
statement: "MERGE INTO CUSTOMER_360 USING (SELECT '{{customer_email}}' as email, '{{get-sf-profile.account_id}}' as sf_id, {{get-orders.total_orders}} as order_count, {{get-behavior.sessions}} as web_sessions)"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/parameterizedSearch/?q={{email}}&sobject=Contact"
operations:
- name: get-contact-by-email
method: GET
- type: http
namespace: bigcommerce
baseUri: "https://api.bigcommerce.com/stores/lowes"
authentication:
type: bearer
token: "$secrets.bigcommerce_token"
resources:
- name: customers
path: "/v3/customers/orders"
operations:
- name: get-customer-orders
method: GET
- type: http
namespace: ga
baseUri: "https://analyticsdata.googleapis.com/v1beta"
authentication:
type: bearer
token: "$secrets.google_analytics_token"
resources:
- name: reports
path: "/properties/lowes:runReport"
operations:
- name: get-user-report
method: POST
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Queries Oracle EBS for current inventory balance by item number and organization, returning on-hand and reserved quantities.
naftiko: "0.5"
info:
label: "Oracle Inventory Balance Query"
description: "Queries Oracle EBS for current inventory balance by item number and organization, returning on-hand and reserved quantities."
tags:
- inventory
- oracle
- supply-chain
capability:
exposes:
- type: mcp
namespace: inventory
port: 8080
tools:
- name: get-inventory-balance
description: "Query Oracle EBS inventory balance by item and org. Returns on-hand quantity, reserved quantity, and available-to-promise."
inputParameters:
- name: item_number
type: string
description: "Oracle item number."
- name: org_code
type: string
description: "Inventory organization code."
call: oracle.get-onhand
with:
item_number: "{{item_number}}"
org_code: "{{org_code}}"
outputParameters:
- name: on_hand
type: number
mapping: "$.items[0].onHandQuantity"
- name: reserved
type: number
mapping: "$.items[0].reservedQuantity"
- name: atp
type: number
mapping: "$.items[0].availableToPromise"
consumes:
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: inventory
path: "/inventoryBalances?q=ItemNumber={{item_number}};OrganizationCode={{org_code}}"
inputParameters:
- name: item_number
in: query
- name: org_code
in: query
operations:
- name: get-onhand
method: GET
Looks up a firewall security rule in Palo Alto Networks Panorama by rule name, returning action, source, and destination zones.
naftiko: "0.5"
info:
label: "Palo Alto Firewall Rule Lookup"
description: "Looks up a firewall security rule in Palo Alto Networks Panorama by rule name, returning action, source, and destination zones."
tags:
- security
- palo-alto
- infrastructure
capability:
exposes:
- type: mcp
namespace: security
port: 8080
tools:
- name: get-firewall-rule
description: "Look up a Palo Alto firewall rule by name. Returns action, source zone, destination zone, and application filters."
inputParameters:
- name: rule_name
type: string
description: "Firewall security rule name."
call: paloalto.get-rule
with:
rule_name: "{{rule_name}}"
outputParameters:
- name: action
type: string
mapping: "$.result.entry.action"
- name: source_zone
type: array
mapping: "$.result.entry.from.member"
- name: destination_zone
type: array
mapping: "$.result.entry.to.member"
consumes:
- type: http
namespace: paloalto
baseUri: "https://lowes-panorama.paloaltonetworks.com/restapi/v10.2"
authentication:
type: bearer
token: "$secrets.paloalto_api_key"
resources:
- name: security-rules
path: "/Policies/SecurityRules?name={{rule_name}}"
inputParameters:
- name: rule_name
in: query
operations:
- name: get-rule
method: GET
Retrieves headcount by department and cost center from Workday for payroll planning and workforce analytics.
naftiko: "0.5"
info:
label: "Payroll Headcount Snapshot"
description: "Retrieves headcount by department and cost center from Workday for payroll planning and workforce analytics."
tags:
- hr
- finance
- payroll
- workday
- reporting
capability:
exposes:
- type: mcp
namespace: hr-finance
port: 8080
tools:
- name: get-headcount-by-department
description: "Returns active employees grouped by department and cost center. Use for workforce planning, payroll cost analysis, and headcount reporting."
call: workday.headcount-export
outputParameters:
- name: employees
type: array
mapping: "$.data"
items:
- name: employee_id
type: string
mapping: "$.id"
- name: full_name
type: string
mapping: "$.fullName"
- name: department
type: string
mapping: "$.department"
- name: cost_center
type: string
mapping: "$.costCenter"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers-export
path: "/lowes/workers"
operations:
- name: headcount-export
method: GET
Triggers a Power BI dataset refresh for the retail sales dashboard and notifies the merchandising team when complete.
naftiko: "0.5"
info:
label: "Power BI Retail Sales Dashboard Refresh"
description: "Triggers a Power BI dataset refresh for the retail sales dashboard and notifies the merchandising team when complete."
tags:
- data
- analytics
- power-bi
- reporting
- retail
capability:
exposes:
- type: mcp
namespace: bi-reporting
port: 8080
tools:
- name: refresh-retail-dashboard
description: "Trigger a Power BI dataset refresh for the retail sales dashboard workspace and dataset, then notify the merchandising Teams channel on completion."
inputParameters:
- name: workspace_id
type: string
description: "Power BI workspace ID containing the retail dashboard."
- name: dataset_id
type: string
description: "Power BI dataset ID for the retail sales dataset."
- name: teams_channel_id
type: string
description: "Merchandising Teams channel ID for completion notification."
steps:
- name: trigger-refresh
type: call
call: powerbi.trigger-refresh
with:
workspaceId: "{{workspace_id}}"
datasetId: "{{dataset_id}}"
- name: notify-team
type: call
call: msteams.post-channel-message
with:
channel_id: "{{teams_channel_id}}"
text: "Retail sales dashboard refresh triggered for dataset {{dataset_id}}. Latest data will be available shortly."
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/groups/{{workspaceId}}/datasets/{{datasetId}}/refreshes"
inputParameters:
- name: workspaceId
in: path
- name: datasetId
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/merchandising/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Generates Pro account spend analysis by pulling Salesforce account data, Snowflake purchase history, and delivering the report via HubSpot email.
naftiko: "0.5"
info:
label: "Pro Account Spend Analysis"
description: "Generates Pro account spend analysis by pulling Salesforce account data, Snowflake purchase history, and delivering the report via HubSpot email."
tags:
- loyalty
- salesforce
- snowflake
- hubspot
capability:
exposes:
- type: mcp
namespace: pro-services
port: 8080
tools:
- name: generate-spend-analysis
description: "Given a Pro account ID and period, pull Salesforce account, Snowflake spending data, and email the report via HubSpot."
inputParameters:
- name: account_id
type: string
description: "Salesforce Pro account ID."
- name: period
type: string
description: "Analysis period (e.g., 2026-Q1)."
steps:
- name: get-account
type: call
call: salesforce.get-account
with:
account_id: "{{account_id}}"
- name: get-spending
type: call
call: snowflake.run-query
with:
statement: "SELECT category, total_spend, order_count FROM PRO_SPEND WHERE account_id='{{account_id}}' AND period='{{period}}'"
- name: send-report
type: call
call: hubspot.send-email
with:
to: "{{get-account.email}}"
template_id: "pro-spend-report"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Processes a Pro customer credit application by verifying identity in Salesforce, running a credit check, and provisioning the account in SAP with the approved credit limit.
naftiko: "0.5"
info:
label: "Pro Customer Credit Application Workflow"
description: "Processes a Pro customer credit application by verifying identity in Salesforce, running a credit check, and provisioning the account in SAP with the approved credit limit."
tags:
- loyalty
- salesforce
- sap
- e-commerce
capability:
exposes:
- type: mcp
namespace: pro-services
port: 8080
tools:
- name: process-credit-application
description: "Given a Salesforce account ID and requested credit limit, verify the customer, run credit evaluation, and provision SAP credit account."
inputParameters:
- name: account_id
type: string
description: "Salesforce account ID."
- name: requested_limit
type: number
description: "Requested credit limit in USD."
steps:
- name: get-account
type: call
call: salesforce.get-account
with:
account_id: "{{account_id}}"
- name: check-credit
type: call
call: sap.check-credit
with:
customer_name: "{{get-account.name}}"
tax_id: "{{get-account.tax_id}}"
requested_amount: "{{requested_limit}}"
- name: update-salesforce
type: call
call: salesforce.update-account
with:
account_id: "{{account_id}}"
credit_status: "{{check-credit.decision}}"
approved_limit: "{{check-credit.approved_amount}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- name: update-account
method: PATCH
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_CREDIT_MGMT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: credit-checks
path: "/A_CreditManagement"
operations:
- name: check-credit
method: POST
When a product recall is issued, identifies affected inventory in SAP, pulls impacted customer orders from Snowflake, and triggers recall notifications through Salesforce.
naftiko: "0.5"
info:
label: "Product Recall Notification Pipeline"
description: "When a product recall is issued, identifies affected inventory in SAP, pulls impacted customer orders from Snowflake, and triggers recall notifications through Salesforce."
tags:
- inventory
- sap
- snowflake
- salesforce
capability:
exposes:
- type: mcp
namespace: product-safety
port: 8080
tools:
- name: process-product-recall
description: "Given a material number and recall reason, identify SAP inventory, find affected Snowflake customer orders, and send Salesforce notifications."
inputParameters:
- name: material_number
type: string
description: "SAP material number being recalled."
- name: recall_reason
type: string
description: "Reason for the product recall."
steps:
- name: get-inventory
type: call
call: sap.get-material
with:
material_number: "{{material_number}}"
- name: find-affected-orders
type: call
call: snowflake.run-query
with:
statement: "SELECT order_id, customer_email FROM ORDERS WHERE sku='{{material_number}}' AND ship_date > DATEADD(day, -90, CURRENT_DATE())"
- name: send-notifications
type: call
call: salesforce.create-campaign
with:
name: "Recall: {{get-inventory.description}}"
description: "{{recall_reason}}"
affected_count: "{{find-affected-orders.row_count}}"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Product('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material
method: GET
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: campaigns
path: "/sobjects/Campaign"
operations:
- name: create-campaign
method: POST
Manages quarterly access recertification by pulling SailPoint identity entitlements, cross-referencing Workday active employees, and creating ServiceNow remediation tasks.
naftiko: "0.5"
info:
label: "SailPoint Access Recertification Workflow"
description: "Manages quarterly access recertification by pulling SailPoint identity entitlements, cross-referencing Workday active employees, and creating ServiceNow remediation tasks."
tags:
- security
- sailpoint
- workday
- servicenow
capability:
exposes:
- type: mcp
namespace: identity-ops
port: 8080
tools:
- name: run-access-recertification
description: "Given a department, pull SailPoint entitlements, check Workday active status, and create ServiceNow tasks for orphaned access."
inputParameters:
- name: department
type: string
description: "Department to recertify."
steps:
- name: get-entitlements
type: call
call: sailpoint.get-department-access
with:
department: "{{department}}"
- name: check-active-employees
type: call
call: workday.get-active-workers
with:
department: "{{department}}"
- name: create-remediation
type: call
call: servicenow.create-task
with:
short_description: "Access recertification: {{department}} — orphaned accounts found"
assignment_group: "Identity_Governance"
consumes:
- type: http
namespace: sailpoint
baseUri: "https://lowes.api.identitynow.com/v3"
authentication:
type: bearer
token: "$secrets.sailpoint_token"
resources:
- name: access
path: "/search/entitlements"
operations:
- name: get-department-access
method: POST
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/lowes/workers"
operations:
- name: get-active-workers
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Retrieves current access entitlements for an identity in SailPoint IdentityNow by employee ID.
naftiko: "0.5"
info:
label: "SailPoint Identity Access Review"
description: "Retrieves current access entitlements for an identity in SailPoint IdentityNow by employee ID."
tags:
- security
- sailpoint
- identity
capability:
exposes:
- type: mcp
namespace: identity
port: 8080
tools:
- name: get-identity-access
description: "Look up SailPoint identity entitlements by employee ID. Returns active roles, entitlements, and access profiles."
inputParameters:
- name: employee_id
type: string
description: "Employee ID to look up."
call: sailpoint.get-identity
with:
employee_id: "{{employee_id}}"
outputParameters:
- name: display_name
type: string
mapping: "$.displayName"
- name: roles
type: array
mapping: "$.roles"
- name: entitlements
type: array
mapping: "$.entitlements"
consumes:
- type: http
namespace: sailpoint
baseUri: "https://lowes.api.identitynow.com/v3"
authentication:
type: bearer
token: "$secrets.sailpoint_token"
resources:
- name: identities
path: "/search/identities?query=employeeNumber:{{employee_id}}"
inputParameters:
- name: employee_id
in: query
operations:
- name: get-identity
method: GET
When a new B2B customer account is created in Salesforce, creates the corresponding account in SAP S/4HANA and confirms via Teams.
naftiko: "0.5"
info:
label: "Salesforce Customer Account Sync"
description: "When a new B2B customer account is created in Salesforce, creates the corresponding account in SAP S/4HANA and confirms via Teams."
tags:
- crm
- sales
- salesforce
- sap
capability:
exposes:
- type: mcp
namespace: crm-ops
port: 8080
tools:
- name: sync-new-account
description: "Given a Salesforce account ID, retrieve account details and create the corresponding customer master record in SAP S/4HANA, then notify the sales team via Teams."
inputParameters:
- name: account_id
type: string
description: "Salesforce account record ID."
- name: teams_channel_id
type: string
description: "Teams channel ID for the sales team notification."
steps:
- name: get-account
type: call
call: salesforce.get-account
with:
account_id: "{{account_id}}"
- name: create-customer
type: call
call: sap.create-customer
with:
customerName: "{{get-account.Name}}"
country: "{{get-account.BillingCountry}}"
salesforceId: "{{account_id}}"
- name: notify-sales
type: call
call: msteams.post-channel-message
with:
channel_id: "{{teams_channel_id}}"
text: "New B2B account synced: {{get-account.Name}} — SAP customer {{create-customer.customerId}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: customers
path: "/A_Customer"
operations:
- name: create-customer
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/sales/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Looks up a Salesforce lead by ID, returning current status, lead source, and assigned owner.
naftiko: "0.5"
info:
label: "Salesforce Lead Status Lookup"
description: "Looks up a Salesforce lead by ID, returning current status, lead source, and assigned owner."
tags:
- sales
- salesforce
- crm
capability:
exposes:
- type: mcp
namespace: crm
port: 8080
tools:
- name: get-lead-status
description: "Look up a Salesforce lead record by lead ID. Returns status, source, and owner name."
inputParameters:
- name: lead_id
type: string
description: "Salesforce lead record ID."
call: salesforce.get-lead
with:
lead_id: "{{lead_id}}"
outputParameters:
- name: status
type: string
mapping: "$.Status"
- name: lead_source
type: string
mapping: "$.LeadSource"
- name: owner_name
type: string
mapping: "$.Owner.Name"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: get-lead
method: GET
Enriches new Salesforce pro contractor leads with company firmographic data from ZoomInfo and updates the lead record.
naftiko: "0.5"
info:
label: "Salesforce Pro Contractor Lead Enrichment"
description: "Enriches new Salesforce pro contractor leads with company firmographic data from ZoomInfo and updates the lead record."
tags:
- crm
- sales
- salesforce
- zoominfo
- lead-enrichment
capability:
exposes:
- type: mcp
namespace: pro-sales
port: 8080
tools:
- name: enrich-pro-lead
description: "Given a Salesforce lead ID for a pro contractor account, fetch firmographic data from ZoomInfo and update the lead with employee count, revenue, and industry classification."
inputParameters:
- name: lead_id
type: string
description: "Salesforce lead record ID (18-character)."
steps:
- name: get-lead
type: call
call: salesforce.get-lead
with:
lead_id: "{{lead_id}}"
- name: enrich-company
type: call
call: zoominfo.search-company
with:
company_name: "{{get-lead.Company}}"
domain: "{{get-lead.Website}}"
- name: update-lead
type: call
call: salesforce-update.update-lead
with:
lead_id: "{{lead_id}}"
NumberOfEmployees: "{{enrich-company.employeeCount}}"
AnnualRevenue: "{{enrich-company.revenue}}"
Industry: "{{enrich-company.industry}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: get-lead
method: GET
- type: http
namespace: zoominfo
baseUri: "https://api.zoominfo.com/search"
authentication:
type: bearer
token: "$secrets.zoominfo_token"
resources:
- name: companies
path: "/company"
operations:
- name: search-company
method: POST
- type: http
namespace: salesforce-update
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: update-lead
method: PATCH
Registers a new supplier in SAP Ariba and creates the corresponding vendor master record in SAP S/4HANA, notifying the procurement team via Teams.
naftiko: "0.5"
info:
label: "SAP Ariba Supplier Onboarding"
description: "Registers a new supplier in SAP Ariba and creates the corresponding vendor master record in SAP S/4HANA, notifying the procurement team via Teams."
tags:
- procurement
- sap-ariba
- sap
- supplier-management
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: onboard-supplier
description: "Given supplier name and country, register the supplier in SAP Ariba, create the SAP vendor master record, and notify the procurement manager via Teams."
inputParameters:
- name: supplier_name
type: string
description: "Legal name of the supplier."
- name: supplier_country
type: string
description: "Two-letter ISO country code for the supplier."
- name: procurement_manager_upn
type: string
description: "UPN of the procurement manager for notification."
steps:
- name: register-ariba
type: call
call: sap-ariba.create-supplier
with:
supplierName: "{{supplier_name}}"
country: "{{supplier_country}}"
- name: create-vendor
type: call
call: sap.create-vendor
with:
vendorName: "{{supplier_name}}"
country: "{{supplier_country}}"
aribaId: "{{register-ariba.supplierId}}"
- name: notify-procurement
type: call
call: msteams.send-message
with:
recipient_upn: "{{procurement_manager_upn}}"
text: "Supplier {{supplier_name}} onboarded. Ariba ID: {{register-ariba.supplierId}}, SAP Vendor: {{create-vendor.vendorId}}"
consumes:
- type: http
namespace: sap-ariba
baseUri: "https://openapi.ariba.com/api/supplier/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: suppliers
path: "/suppliers"
operations:
- name: create-supplier
method: POST
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: vendors
path: "/A_Supplier"
operations:
- name: create-vendor
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/chats"
operations:
- name: send-message
method: POST
Extracts cost center budget vs. actuals from SAP S/4HANA and pushes the variance data to Power BI for retail finance reporting.
naftiko: "0.5"
info:
label: "SAP Budget vs Actuals Reporting"
description: "Extracts cost center budget vs. actuals from SAP S/4HANA and pushes the variance data to Power BI for retail finance reporting."
tags:
- finance
- erp
- sap
- power-bi
- reporting
capability:
exposes:
- type: mcp
namespace: finance-reporting
port: 8080
tools:
- name: publish-budget-variance
description: "Given a fiscal period and cost center, extract budget vs. actuals from SAP S/4HANA and push rows to the Power BI finance dashboard dataset."
inputParameters:
- name: fiscal_period
type: string
description: "Fiscal period in YYYYMM format (e.g., 202603)."
- name: cost_center
type: string
description: "SAP cost center code."
steps:
- name: get-actuals
type: call
call: sap.get-cost-center-actuals
with:
fiscalPeriod: "{{fiscal_period}}"
costCenter: "{{cost_center}}"
- name: push-to-powerbi
type: call
call: powerbi.push-rows
with:
datasetId: "$secrets.powerbi_finance_dataset_id"
tableName: "BudgetVariance"
rows: "{{get-actuals.rows}}"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/YY1_COSTCENTERACTUALS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: cost-center-actuals
path: "/CostCenterActuals"
inputParameters:
- name: fiscalPeriod
in: query
- name: costCenter
in: query
operations:
- name: get-cost-center-actuals
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-rows
path: "/datasets/{{datasetId}}/tables/{{tableName}}/rows"
inputParameters:
- name: datasetId
in: path
- name: tableName
in: path
operations:
- name: push-rows
method: POST
Retrieves pending expense reports from SAP Concur for a cost center and routes high-value reports to the manager for approval via Teams.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Review"
description: "Retrieves pending expense reports from SAP Concur for a cost center and routes high-value reports to the manager for approval via Teams."
tags:
- finance
- expense-management
- sap-concur
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: expense-ops
port: 8080
tools:
- name: review-pending-expenses
description: "Retrieve pending expense reports from SAP Concur for a given cost center. Flag reports above the policy threshold and send approval requests to the submitter's manager via Teams."
inputParameters:
- name: cost_center
type: string
description: "Cost center code to retrieve pending expense reports for."
- name: threshold_usd
type: number
description: "Policy threshold in USD above which manager approval is required."
steps:
- name: get-reports
type: call
call: concur.list-expense-reports
with:
costCenter: "{{cost_center}}"
approvalStatus: "pending"
- name: notify-manager
type: call
call: msteams.send-message
with:
recipient_upn: "{{get-reports.managerEmail}}"
text: "Expense reports pending approval for cost center {{cost_center}} — reports above ${{threshold_usd}} require your review."
consumes:
- type: http
namespace: concur
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/expense/reports"
inputParameters:
- name: costCenter
in: query
- name: approvalStatus
in: query
operations:
- name: list-expense-reports
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/chats"
operations:
- name: send-message
method: POST
Generates general ledger balance reports by pulling SAP GL data, enriching with Snowflake cost allocations, and publishing to SharePoint.
naftiko: "0.5"
info:
label: "SAP GL Account Balance Report"
description: "Generates general ledger balance reports by pulling SAP GL data, enriching with Snowflake cost allocations, and publishing to SharePoint."
tags:
- procurement
- sap
- snowflake
- sharepoint
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: generate-gl-report
description: "Given a company code and period, pull SAP GL balances, enrich with Snowflake allocations, and upload to SharePoint."
inputParameters:
- name: company_code
type: string
description: "SAP company code."
- name: fiscal_period
type: string
description: "Fiscal period (e.g., 2026-03)."
steps:
- name: get-gl-balances
type: call
call: sap.get-gl-balances
with:
company_code: "{{company_code}}"
period: "{{fiscal_period}}"
- name: get-allocations
type: call
call: snowflake.run-query
with:
statement: "SELECT gl_account, allocation_pct, cost_center FROM COST_ALLOCATIONS WHERE company='{{company_code}}' AND period='{{fiscal_period}}'"
- name: upload-report
type: call
call: sharepoint.upload-file
with:
folder: "/Finance Reports/GL/{{fiscal_period}}"
filename: "{{company_code}}_gl_report.xlsx"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: gl-balances
path: "/A_GLAccountBalance"
operations:
- name: get-gl-balances
method: GET
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites/lowes.sharepoint.com"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive
path: "/drive/root:/{{folder}}/{{filename}}:/content"
operations:
- name: upload-file
method: PUT
Posts goods receipts in SAP by verifying the purchase order, creating the material document, and notifying accounts payable via Teams.
naftiko: "0.5"
info:
label: "SAP Goods Receipt Posting"
description: "Posts goods receipts in SAP by verifying the purchase order, creating the material document, and notifying accounts payable via Teams."
tags:
- supply-chain
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: warehouse-ops
port: 8080
tools:
- name: post-goods-receipt
description: "Given a PO number and received quantities, verify the SAP PO, post the goods receipt, and notify AP."
inputParameters:
- name: po_number
type: string
description: "SAP purchase order number."
- name: received_qty
type: integer
description: "Total received quantity."
steps:
- name: verify-po
type: call
call: sap.get-po
with:
po_number: "{{po_number}}"
- name: post-receipt
type: call
call: sap.post-goods-receipt
with:
po_number: "{{po_number}}"
quantity: "{{received_qty}}"
movement_type: "101"
- name: notify-ap
type: call
call: msteams.send-message
with:
channel_id: "accounts-payable"
text: "Goods receipt posted: PO {{po_number}} from {{verify-po.vendor}}, Qty {{received_qty}}. Doc: {{post-receipt.document_number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- name: material-documents
path: "/A_MaterialDocumentHeader"
operations:
- name: post-goods-receipt
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and inventory category.
naftiko: "0.5"
info:
label: "SAP Material Master Lookup"
description: "Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and inventory category."
tags:
- inventory
- sap
- erp
capability:
exposes:
- type: mcp
namespace: erp
port: 8080
tools:
- name: get-material-master
description: "Look up an SAP material master record by material number. Returns description, base unit of measure, and material group."
inputParameters:
- name: material_number
type: string
description: "SAP material number (18-character alphanumeric)."
call: sap.get-material
with:
material_number: "{{material_number}}"
outputParameters:
- name: description
type: string
mapping: "$.d.MaterialDescription"
- name: base_uom
type: string
mapping: "$.d.BaseUnit"
- name: material_group
type: string
mapping: "$.d.MaterialGroup"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Product('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material
method: GET
Looks up a purchase order in SAP S/4HANA by PO number and returns current approval status, vendor, and line-item totals.
naftiko: "0.5"
info:
label: "SAP Purchase Order Status Lookup"
description: "Looks up a purchase order in SAP S/4HANA by PO number and returns current approval status, vendor, and line-item totals."
tags:
- finance
- procurement
- sap
- erp
capability:
exposes:
- type: mcp
namespace: erp
port: 8080
tools:
- name: get-purchase-order
description: "Look up an SAP purchase order by PO number. Returns header status, vendor name, total amount, and currency. Use for procurement approval workflows and spend tracking."
inputParameters:
- name: po_number
type: string
description: "SAP purchase order number (10-digit numeric string)."
call: sap.get-po
with:
po_number: "{{po_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OverallStatus"
- name: vendor
type: string
mapping: "$.d.Supplier.CompanyName"
- name: total_value
type: string
mapping: "$.d.TotalAmount"
- name: currency
type: string
mapping: "$.d.TransactionCurrency"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
Retrieves vendor master data from SAP by vendor number, returning company name, payment terms, and purchasing group.
naftiko: "0.5"
info:
label: "SAP Vendor Master Lookup"
description: "Retrieves vendor master data from SAP by vendor number, returning company name, payment terms, and purchasing group."
tags:
- procurement
- sap
- supply-chain
capability:
exposes:
- type: mcp
namespace: erp
port: 8080
tools:
- name: get-vendor-master
description: "Look up SAP vendor master by vendor number. Returns vendor name, payment terms, and purchasing organization."
inputParameters:
- name: vendor_number
type: string
description: "SAP vendor account number."
call: sap.get-vendor
with:
vendor_number: "{{vendor_number}}"
outputParameters:
- name: vendor_name
type: string
mapping: "$.d.SupplierName"
- name: payment_terms
type: string
mapping: "$.d.PaymentTerms"
- name: purchasing_org
type: string
mapping: "$.d.PurchasingOrganization"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: suppliers
path: "/A_Supplier('{{vendor_number}}')"
inputParameters:
- name: vendor_number
in: path
operations:
- name: get-vendor
method: GET
Pulls historical sales data from Snowflake, runs a demand forecast via Azure Machine Learning, and updates SAP material requirements planning with projected quantities.
naftiko: "0.5"
info:
label: "Seasonal Demand Forecast Pipeline"
description: "Pulls historical sales data from Snowflake, runs a demand forecast via Azure Machine Learning, and updates SAP material requirements planning with projected quantities."
tags:
- supply-chain
- snowflake
- azure-machine-learning
- sap
capability:
exposes:
- type: mcp
namespace: demand-planning
port: 8080
tools:
- name: run-seasonal-forecast
description: "Given a product category and forecast horizon, pull historical data from Snowflake, generate Azure ML predictions, and update SAP MRP."
inputParameters:
- name: category_code
type: string
description: "Product category code for forecasting."
- name: horizon_weeks
type: integer
description: "Number of weeks to forecast."
steps:
- name: get-history
type: call
call: snowflake.run-query
with:
statement: "SELECT week, units_sold FROM SALES_HISTORY WHERE category='{{category_code}}' ORDER BY week DESC LIMIT 104"
- name: run-forecast
type: call
call: azureml.invoke-endpoint
with:
endpoint: "demand-forecast-v2"
payload: "{{get-history.results}}"
horizon: "{{horizon_weeks}}"
- name: update-mrp
type: call
call: sap.update-forecast
with:
category: "{{category_code}}"
forecast_data: "{{run-forecast.predictions}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: azureml
baseUri: "https://lowes-ml.westus2.inference.ml.azure.com"
authentication:
type: bearer
token: "$secrets.azureml_token"
resources:
- name: endpoints
path: "/score"
operations:
- name: invoke-endpoint
method: POST
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV_01"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: forecasts
path: "/A_MRPMaterial"
operations:
- name: update-forecast
method: PATCH
Creates a ServiceNow change request for a planned system change, routes to the CAB for approval, and notifies the requester via Teams.
naftiko: "0.5"
info:
label: "ServiceNow Change Request Approval"
description: "Creates a ServiceNow change request for a planned system change, routes to the CAB for approval, and notifies the requester via Teams."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: itsm
port: 8080
tools:
- name: submit-change-request
description: "Given a change description, risk level, and planned date, create a ServiceNow change request assigned to the Change Advisory Board and notify the requester via Teams."
inputParameters:
- name: short_description
type: string
description: "Brief description of the planned change."
- name: risk
type: string
description: "Risk level: low, medium, or high."
- name: implementation_date
type: string
description: "Planned implementation date in YYYY-MM-DD format."
- name: requester_upn
type: string
description: "UPN of the change requester."
steps:
- name: create-change
type: call
call: servicenow.create-change
with:
short_description: "{{short_description}}"
risk: "{{risk}}"
start_date: "{{implementation_date}}"
assignment_group: "CAB"
- name: notify-requester
type: call
call: msteams.send-message
with:
recipient_upn: "{{requester_upn}}"
text: "Change request {{create-change.number}} submitted and assigned to CAB. Risk: {{risk}}, Planned date: {{implementation_date}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/chats"
operations:
- name: send-message
method: POST
Retrieves the current status and priority of a ServiceNow incident by incident number.
naftiko: "0.5"
info:
label: "ServiceNow Incident Status Lookup"
description: "Retrieves the current status and priority of a ServiceNow incident by incident number."
tags:
- itsm
- servicenow
- store-ops
capability:
exposes:
- type: mcp
namespace: itsm
port: 8080
tools:
- name: get-incident-status
description: "Look up a ServiceNow incident by number. Returns state, priority, assigned group, and short description."
inputParameters:
- name: incident_number
type: string
description: "ServiceNow incident number (e.g., INC0012345)."
call: servicenow.get-incident
with:
incident_number: "{{incident_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result.state"
- name: priority
type: string
mapping: "$.result.priority"
- name: assignment_group
type: string
mapping: "$.result.assignment_group.display_value"
consumes:
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident?sysparm_query=number={{incident_number}}"
inputParameters:
- name: incident_number
in: query
operations:
- name: get-incident
method: GET
Searches SharePoint Online for store operations documents matching a keyword query.
naftiko: "0.5"
info:
label: "SharePoint Store Document Search"
description: "Searches SharePoint Online for store operations documents matching a keyword query."
tags:
- document-management
- sharepoint
- store-ops
capability:
exposes:
- type: mcp
namespace: documents
port: 8080
tools:
- name: search-store-docs
description: "Search SharePoint for store operations documents by keyword. Returns matching file names, URLs, and authors."
inputParameters:
- name: query
type: string
description: "Search keyword or phrase."
call: sharepoint.search
with:
query: "{{query}}"
outputParameters:
- name: results
type: array
mapping: "$.value"
- name: total_count
type: integer
mapping: "$.totalCount"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites/lowes.sharepoint.com"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: search
path: "/drive/root/search(q='{{query}}')"
inputParameters:
- name: query
in: query
operations:
- name: search
method: GET
Monitors Snowflake data pipeline task completion for retail analytics and opens a Jira issue when failures exceed threshold.
naftiko: "0.5"
info:
label: "Snowflake Retail Data Pipeline Health"
description: "Monitors Snowflake data pipeline task completion for retail analytics and opens a Jira issue when failures exceed threshold."
tags:
- data
- analytics
- snowflake
- jira
- monitoring
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: check-retail-pipeline-health
description: "Query Snowflake for failed pipeline tasks in the retail analytics database over the past N hours. Create a Jira issue and alert the data engineering Teams channel if failures exceed the threshold."
inputParameters:
- name: database
type: string
description: "Snowflake database name to monitor (e.g., RETAIL_ANALYTICS)."
- name: hours_back
type: integer
description: "Number of hours to look back for failures."
- name: failure_threshold
type: integer
description: "Failure count above which an alert is triggered."
steps:
- name: get-task-history
type: call
call: snowflake.query-task-history
with:
database: "{{database}}"
hoursBack: "{{hours_back}}"
- name: create-issue
type: call
call: jira.create-issue
with:
project_key: "DATA"
issuetype: "Bug"
summary: "Snowflake pipeline failures in {{database}}"
description: "{{get-task-history.failureCount}} failures in last {{hours_back}}h"
- name: alert-team
type: call
call: msteams.post-channel-message
with:
channel_id: "data-engineering"
text: "Pipeline alert: {{get-task-history.failureCount}} failures in {{database}} (last {{hours_back}}h). Jira: {{create-issue.key}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: task-history
path: "/databases/{{database}}/schemas/information_schema/tasks"
inputParameters:
- name: database
in: path
operations:
- name: query-task-history
method: GET
- type: http
namespace: jira
baseUri: "https://lowes.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/data/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Queries the Snowflake data warehouse for daily sales totals by store number and date range.
naftiko: "0.5"
info:
label: "Snowflake Store Sales Query"
description: "Queries the Snowflake data warehouse for daily sales totals by store number and date range."
tags:
- analytics
- snowflake
- store-ops
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: query-store-sales
description: "Query daily sales totals from Snowflake for a given store and date range. Returns gross sales, net sales, and transaction count."
inputParameters:
- name: store_number
type: string
description: "Lowe's store number."
- name: start_date
type: string
description: "Start date in YYYY-MM-DD format."
- name: end_date
type: string
description: "End date in YYYY-MM-DD format."
call: snowflake.run-query
with:
store_number: "{{store_number}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
outputParameters:
- name: gross_sales
type: number
mapping: "$.data[0].GROSS_SALES"
- name: net_sales
type: number
mapping: "$.data[0].NET_SALES"
- name: transaction_count
type: integer
mapping: "$.data[0].TXN_COUNT"
consumes:
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: queries
path: "/statements"
operations:
- name: run-query
method: POST
Monitors social media engagement by pulling HubSpot campaign data, Google Analytics referral traffic, and storing engagement metrics in Snowflake for trend analysis.
naftiko: "0.5"
info:
label: "Social Media Engagement Pipeline"
description: "Monitors social media engagement by pulling HubSpot campaign data, Google Analytics referral traffic, and storing engagement metrics in Snowflake for trend analysis."
tags:
- marketing
- hubspot
- google-analytics
- snowflake
capability:
exposes:
- type: mcp
namespace: marketing-ops
port: 8080
tools:
- name: track-social-engagement
description: "Given a campaign ID, pull HubSpot social metrics, Google Analytics referral data, and persist in Snowflake."
inputParameters:
- name: campaign_id
type: string
description: "Marketing campaign ID."
- name: platform
type: string
description: "Social platform (facebook, instagram, twitter)."
steps:
- name: get-campaign-data
type: call
call: hubspot.get-campaign-metrics
with:
campaign_id: "{{campaign_id}}"
- name: get-referrals
type: call
call: ga.get-report
with:
source: "{{platform}}"
campaign: "{{campaign_id}}"
- name: store-metrics
type: call
call: snowflake.run-query
with:
statement: "INSERT INTO SOCIAL_ENGAGEMENT VALUES ('{{campaign_id}}', '{{platform}}', {{get-campaign-data.impressions}}, {{get-referrals.sessions}}, CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: campaigns
path: "/marketing/v3/campaigns/{{campaign_id}}"
inputParameters:
- name: campaign_id
in: path
operations:
- name: get-campaign-metrics
method: GET
- type: http
namespace: ga
baseUri: "https://analyticsdata.googleapis.com/v1beta"
authentication:
type: bearer
token: "$secrets.google_analytics_token"
resources:
- name: reports
path: "/properties/lowes:runReport"
operations:
- name: get-report
method: POST
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Runs a saved search in Splunk to retrieve recent security events filtered by severity level.
naftiko: "0.5"
info:
label: "Splunk Security Event Search"
description: "Runs a saved search in Splunk to retrieve recent security events filtered by severity level."
tags:
- security
- splunk
- infrastructure
capability:
exposes:
- type: mcp
namespace: security
port: 8080
tools:
- name: search-security-events
description: "Execute a Splunk saved search for security events by severity. Returns event count, top source IPs, and event types."
inputParameters:
- name: severity
type: string
description: "Severity level filter (critical, high, medium, low)."
- name: time_range
type: string
description: "Time range for the search (e.g., -24h, -7d)."
call: splunk.run-search
with:
severity: "{{severity}}"
time_range: "{{time_range}}"
outputParameters:
- name: event_count
type: integer
mapping: "$.results.count"
- name: top_sources
type: array
mapping: "$.results.top_sources"
consumes:
- type: http
namespace: splunk
baseUri: "https://lowes-splunk.splunkcloud.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: searches
path: "/search/jobs"
operations:
- name: run-search
method: POST
When an associate separation is recorded in Workday, deactivates Okta access, disables the Microsoft 365 account, and notifies the store manager via Teams.
naftiko: "0.5"
info:
label: "Store Associate Offboarding"
description: "When an associate separation is recorded in Workday, deactivates Okta access, disables the Microsoft 365 account, and notifies the store manager via Teams."
tags:
- hr
- offboarding
- workday
- okta
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID, revoke Okta SSO access, disable Microsoft 365 account, and notify the store manager via Teams on completion."
inputParameters:
- name: employee_id
type: string
description: "Workday worker ID of the departing associate."
- name: last_day
type: string
description: "Last working day in YYYY-MM-DD format."
steps:
- name: get-worker
type: call
call: workday.get-worker
with:
worker_id: "{{employee_id}}"
- name: deactivate-okta
type: call
call: okta.deactivate-user
with:
userId: "{{get-worker.work_email}}"
- name: disable-m365
type: call
call: msgraph.update-user
with:
user_id: "{{get-worker.work_email}}"
accountEnabled: "false"
- name: notify-manager
type: call
call: msteams.send-message
with:
recipient_upn: "{{get-worker.manager_email}}"
text: "Offboarding complete for {{get-worker.full_name}} (last day {{last_day}}). System access has been revoked."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/lowes/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://lowes.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: users
path: "/users/{{userId}}/lifecycle/deactivate"
inputParameters:
- name: userId
in: path
operations:
- name: deactivate-user
method: POST
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: update-user
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/chats"
operations:
- name: send-message
method: POST
Orchestrates store compliance audits by pulling the checklist from Confluence, creating ServiceNow audit tasks, and uploading findings to SharePoint.
naftiko: "0.5"
info:
label: "Store Compliance Audit Orchestrator"
description: "Orchestrates store compliance audits by pulling the checklist from Confluence, creating ServiceNow audit tasks, and uploading findings to SharePoint."
tags:
- store-ops
- confluence
- servicenow
- sharepoint
capability:
exposes:
- type: mcp
namespace: compliance
port: 8080
tools:
- name: run-compliance-audit
description: "Given a store number and audit type, fetch Confluence checklist, create ServiceNow audit tasks, and upload findings to SharePoint."
inputParameters:
- name: store_number
type: string
description: "Store number."
- name: audit_type
type: string
description: "Audit type (safety, operational, financial)."
steps:
- name: get-checklist
type: call
call: confluence.get-page
with:
title: "{{audit_type}}_audit_checklist"
space: "COMPLIANCE"
- name: create-audit-task
type: call
call: servicenow.create-task
with:
short_description: "{{audit_type}} compliance audit — Store {{store_number}}"
assignment_group: "Compliance_Auditors"
- name: upload-findings
type: call
call: sharepoint.upload-file
with:
folder: "/Audit Reports/Store_{{store_number}}"
filename: "{{audit_type}}_audit_report.pdf"
consumes:
- type: http
namespace: confluence
baseUri: "https://lowes.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content"
operations:
- name: get-page
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites/lowes.sharepoint.com"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive
path: "/drive/root:/{{folder}}/{{filename}}:/content"
operations:
- name: upload-file
method: PUT
Reconciles daily store sales by comparing Snowflake POS transaction totals against SAP financial postings and flagging discrepancies in ServiceNow.
naftiko: "0.5"
info:
label: "Store Daily Sales Reconciliation"
description: "Reconciles daily store sales by comparing Snowflake POS transaction totals against SAP financial postings and flagging discrepancies in ServiceNow."
tags:
- store-ops
- snowflake
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: reconcile-daily-sales
description: "Given a store number and date, compare Snowflake POS totals with SAP financial postings and create ServiceNow tickets for variances."
inputParameters:
- name: store_number
type: string
description: "Store number."
- name: date
type: string
description: "Business date in YYYY-MM-DD format."
steps:
- name: get-pos-totals
type: call
call: snowflake.run-query
with:
statement: "SELECT SUM(amount) as pos_total, COUNT(*) as txn_count FROM POS_TRANSACTIONS WHERE store='{{store_number}}' AND business_date='{{date}}'"
- name: get-sap-postings
type: call
call: sap.get-journal-entries
with:
plant: "{{store_number}}"
posting_date: "{{date}}"
- name: flag-variance
type: call
call: servicenow.create-incident
with:
short_description: "Sales reconciliation variance: Store {{store_number}} — {{date}}"
description: "POS total: {{get-pos-totals.results[0].pos_total}}, SAP total: {{get-sap-postings.total}}"
category: "finance"
assignment_group: "Store_Accounting"
consumes:
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: journal-entries
path: "/A_JournalEntryItemBasic"
operations:
- name: get-journal-entries
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Activates the emergency contact tree by pulling store associate lists from Workday, sending mass Teams notifications, and creating a ServiceNow incident record.
naftiko: "0.5"
info:
label: "Store Emergency Contact Tree Activation"
description: "Activates the emergency contact tree by pulling store associate lists from Workday, sending mass Teams notifications, and creating a ServiceNow incident record."
tags:
- store-ops
- workday
- microsoft-teams
- servicenow
capability:
exposes:
- type: mcp
namespace: emergency-ops
port: 8080
tools:
- name: activate-contact-tree
description: "Given a store number and emergency type, pull Workday associate list, send Teams notifications, and create ServiceNow record."
inputParameters:
- name: store_number
type: string
description: "Store number."
- name: emergency_type
type: string
description: "Emergency type (fire, medical, security, weather)."
- name: message
type: string
description: "Emergency notification message."
steps:
- name: get-associates
type: call
call: workday.get-store-roster
with:
store: "{{store_number}}"
- name: send-notifications
type: call
call: msteams.send-message
with:
channel_id: "store-{{store_number}}-emergency"
text: "EMERGENCY ({{emergency_type}}): {{message}}. All associates at Store {{store_number}} please acknowledge."
- name: create-record
type: call
call: servicenow.create-incident
with:
short_description: "Emergency: {{emergency_type}} — Store {{store_number}}"
category: "emergency"
priority: "1"
assignment_group: "Store_Management"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: rosters
path: "/lowes/workers"
operations:
- name: get-store-roster
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Schedules preventive maintenance for store equipment by querying the asset registry in ServiceNow, creating work orders, and notifying the facilities team via Teams.
naftiko: "0.5"
info:
label: "Store Equipment Maintenance Scheduler"
description: "Schedules preventive maintenance for store equipment by querying the asset registry in ServiceNow, creating work orders, and notifying the facilities team via Teams."
tags:
- store-ops
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: facilities
port: 8080
tools:
- name: schedule-equipment-maintenance
description: "Given a store number and equipment type, look up ServiceNow assets due for maintenance, create work orders, and notify the facilities team."
inputParameters:
- name: store_number
type: string
description: "Store number."
- name: equipment_type
type: string
description: "Equipment type (forklift, hvac, compressor, lighting)."
steps:
- name: get-assets
type: call
call: servicenow.get-assets
with:
store: "{{store_number}}"
type: "{{equipment_type}}"
maintenance_due: "true"
- name: create-work-order
type: call
call: servicenow.create-work-order
with:
short_description: "Preventive maintenance: {{equipment_type}} — Store {{store_number}}"
asset_list: "{{get-assets.results}}"
assignment_group: "Facilities_Maintenance"
- name: notify-facilities
type: call
call: msteams.send-message
with:
channel_id: "facilities-maintenance"
text: "Maintenance scheduled for {{get-assets.count}} {{equipment_type}} units at Store {{store_number}}. Work order: {{create-work-order.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: assets
path: "/table/alm_asset"
operations:
- name: get-assets
method: GET
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
When a cycle count discrepancy is detected in SAP, creates a ServiceNow investigation ticket, notifies the store manager via Teams, and updates the inventory adjustment log in Snowflake.
naftiko: "0.5"
info:
label: "Store Inventory Cycle Count Orchestrator"
description: "When a cycle count discrepancy is detected in SAP, creates a ServiceNow investigation ticket, notifies the store manager via Teams, and updates the inventory adjustment log in Snowflake."
tags:
- inventory
- sap
- servicenow
- microsoft-teams
- snowflake
capability:
exposes:
- type: mcp
namespace: inventory-ops
port: 8080
tools:
- name: handle-cycle-count-discrepancy
description: "Given an SAP material number and store, orchestrate discrepancy resolution: look up SAP inventory, create a ServiceNow ticket, notify the store manager via Teams, and log the adjustment in Snowflake."
inputParameters:
- name: material_number
type: string
description: "SAP material number with discrepancy."
- name: store_number
type: string
description: "Store where discrepancy was found."
- name: expected_qty
type: integer
description: "Expected quantity from system."
- name: actual_qty
type: integer
description: "Actual counted quantity."
steps:
- name: get-material
type: call
call: sap.get-material
with:
material_number: "{{material_number}}"
- name: create-ticket
type: call
call: servicenow.create-incident
with:
short_description: "Cycle count discrepancy: {{get-material.description}} — Store {{store_number}}"
category: "inventory"
assignment_group: "Store_Inventory"
- name: notify-manager
type: call
call: msteams.send-message
with:
channel_id: "store-{{store_number}}-ops"
text: "Inventory discrepancy for {{get-material.description}}: expected {{expected_qty}}, counted {{actual_qty}}. Ticket: {{create-ticket.number}}"
- name: log-adjustment
type: call
call: snowflake.run-query
with:
statement: "INSERT INTO INVENTORY_ADJUSTMENTS VALUES ('{{material_number}}', '{{store_number}}', {{expected_qty}}, {{actual_qty}}, CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Product('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Optimizes store labor scheduling by pulling traffic forecasts from Google Analytics, sales projections from Snowflake, and updating shift plans in Workday.
naftiko: "0.5"
info:
label: "Store Labor Forecast Optimizer"
description: "Optimizes store labor scheduling by pulling traffic forecasts from Google Analytics, sales projections from Snowflake, and updating shift plans in Workday."
tags:
- store-ops
- google-analytics
- snowflake
- workday
capability:
exposes:
- type: mcp
namespace: workforce
port: 8080
tools:
- name: optimize-labor-schedule
description: "Given a store and week, pull Google Analytics traffic forecast, Snowflake sales projections, and update Workday shift schedules."
inputParameters:
- name: store_number
type: string
description: "Store number."
- name: week_start
type: string
description: "Week start date in YYYY-MM-DD format."
steps:
- name: get-traffic-forecast
type: call
call: ga.get-report
with:
store: "{{store_number}}"
start_date: "{{week_start}}"
- name: get-sales-projection
type: call
call: snowflake.run-query
with:
statement: "SELECT day_of_week, projected_sales, projected_transactions FROM LABOR_FORECAST WHERE store='{{store_number}}' AND week_start='{{week_start}}'"
- name: update-schedule
type: call
call: workday.update-schedule
with:
store: "{{store_number}}"
week: "{{week_start}}"
traffic_data: "{{get-traffic-forecast.sessions}}"
sales_data: "{{get-sales-projection.results}}"
consumes:
- type: http
namespace: ga
baseUri: "https://analyticsdata.googleapis.com/v1beta"
authentication:
type: bearer
token: "$secrets.google_analytics_token"
resources:
- name: reports
path: "/properties/lowes:runReport"
operations:
- name: get-report
method: POST
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: schedules
path: "/lowes/schedules"
operations:
- name: update-schedule
method: PUT
Responds to store network outages by checking Datadog network monitors, creating a priority ServiceNow incident, and escalating to the NOC via Teams.
naftiko: "0.5"
info:
label: "Store Network Outage Response"
description: "Responds to store network outages by checking Datadog network monitors, creating a priority ServiceNow incident, and escalating to the NOC via Teams."
tags:
- infrastructure
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: network-ops
port: 8080
tools:
- name: handle-network-outage
description: "Given a store number and alert, check Datadog network health, create ServiceNow P1 incident, and escalate to NOC."
inputParameters:
- name: store_number
type: string
description: "Affected store number."
- name: alert_id
type: string
description: "Datadog alert ID."
steps:
- name: get-network-status
type: call
call: datadog.get-monitor
with:
monitor_id: "{{alert_id}}"
- name: create-p1
type: call
call: servicenow.create-incident
with:
short_description: "Network outage: Store {{store_number}}"
category: "network"
priority: "1"
assignment_group: "Network_Operations"
- name: escalate-noc
type: call
call: msteams.send-message
with:
channel_id: "noc-critical"
text: "P1 Network outage at Store {{store_number}}. Status: {{get-network-status.overall_state}}. Ticket: {{create-p1.number}}. Immediate attention required."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Automates the daily store opening process by verifying POS system health in Datadog, confirming associate schedules in Workday, and posting the opening status to Teams.
naftiko: "0.5"
info:
label: "Store Opening Checklist Orchestrator"
description: "Automates the daily store opening process by verifying POS system health in Datadog, confirming associate schedules in Workday, and posting the opening status to Teams."
tags:
- store-ops
- datadog
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: store-ops
port: 8080
tools:
- name: run-opening-checklist
description: "Given a store number, verify Datadog POS monitor health, check Workday scheduled associates, and post opening readiness to Teams."
inputParameters:
- name: store_number
type: string
description: "Lowe's store number."
- name: date
type: string
description: "Opening date in YYYY-MM-DD format."
steps:
- name: check-pos
type: call
call: datadog.get-monitor
with:
monitor_id: "pos-store-{{store_number}}"
- name: get-schedule
type: call
call: workday.get-schedule
with:
store_number: "{{store_number}}"
date: "{{date}}"
- name: post-status
type: call
call: msteams.send-message
with:
channel_id: "store-{{store_number}}-ops"
text: "Store {{store_number}} opening checklist: POS status={{check-pos.overall_state}}, Scheduled associates={{get-schedule.headcount}}. Ready to open."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: schedules
path: "/lowes/schedules"
operations:
- name: get-schedule
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Verifies planogram compliance by pulling the expected layout from SharePoint, comparing against current inventory positions in SAP, and logging deviations in ServiceNow.
naftiko: "0.5"
info:
label: "Store Planogram Compliance Check"
description: "Verifies planogram compliance by pulling the expected layout from SharePoint, comparing against current inventory positions in SAP, and logging deviations in ServiceNow."
tags:
- store-ops
- sharepoint
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: merchandising
port: 8080
tools:
- name: check-planogram-compliance
description: "Given a store and aisle, retrieve the SharePoint planogram, compare SAP inventory positions, and create ServiceNow tasks for deviations."
inputParameters:
- name: store_number
type: string
description: "Store number."
- name: aisle_id
type: string
description: "Aisle identifier."
steps:
- name: get-planogram
type: call
call: sharepoint.get-file
with:
path: "/Planograms/Store_{{store_number}}/{{aisle_id}}.json"
- name: get-positions
type: call
call: sap.get-bin-positions
with:
plant: "{{store_number}}"
aisle: "{{aisle_id}}"
- name: log-deviations
type: call
call: servicenow.create-task
with:
short_description: "Planogram deviation: Store {{store_number}} Aisle {{aisle_id}}"
assignment_group: "Merchandising_Ops"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites/lowes.sharepoint.com"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/drive/root:/{{path}}:/content"
operations:
- name: get-file
method: GET
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_WAREHOUSE_MGMT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: bins
path: "/A_WarehouseBin"
operations:
- name: get-bin-positions
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Tracks store remodel projects by pulling project milestones from ServiceNow, budget data from SAP, and posting progress reports to Confluence.
naftiko: "0.5"
info:
label: "Store Remodel Project Tracker"
description: "Tracks store remodel projects by pulling project milestones from ServiceNow, budget data from SAP, and posting progress reports to Confluence."
tags:
- store-ops
- servicenow
- sap
- confluence
capability:
exposes:
- type: mcp
namespace: construction
port: 8080
tools:
- name: track-remodel-project
description: "Given a project ID and store number, pull ServiceNow milestones, SAP budget status, and post a Confluence progress report."
inputParameters:
- name: project_id
type: string
description: "ServiceNow project ID."
- name: store_number
type: string
description: "Store being remodeled."
steps:
- name: get-milestones
type: call
call: servicenow.get-project
with:
project_id: "{{project_id}}"
- name: get-budget
type: call
call: sap.get-project-budget
with:
project: "{{project_id}}"
plant: "{{store_number}}"
- name: post-report
type: call
call: confluence.create-page
with:
space: "STORE_REMODELS"
title: "Remodel Progress: Store {{store_number}} — {{get-milestones.current_phase}}"
body: "Budget spent: {{get-budget.actual}} of {{get-budget.planned}}. Completion: {{get-milestones.percent_complete}}%."
consumes:
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: projects
path: "/table/pm_project/{{project_id}}"
inputParameters:
- name: project_id
in: path
operations:
- name: get-project
method: GET
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_PROJECT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: projects
path: "/A_Project"
operations:
- name: get-project-budget
method: GET
- type: http
namespace: confluence
baseUri: "https://lowes.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
path: "/content"
operations:
- name: create-page
method: POST
When a safety incident is reported, creates a ServiceNow incident, notifies the district safety manager via Teams, and logs the event in Workday for the affected associate.
naftiko: "0.5"
info:
label: "Store Safety Incident Response"
description: "When a safety incident is reported, creates a ServiceNow incident, notifies the district safety manager via Teams, and logs the event in Workday for the affected associate."
tags:
- store-ops
- servicenow
- microsoft-teams
- workday
capability:
exposes:
- type: mcp
namespace: safety-ops
port: 8080
tools:
- name: handle-safety-incident
description: "Given incident details and employee ID, create a ServiceNow safety ticket, send Teams notification to safety team, and log the incident in Workday."
inputParameters:
- name: employee_id
type: string
description: "Workday worker ID of affected associate."
- name: store_number
type: string
description: "Store number where incident occurred."
- name: incident_description
type: string
description: "Description of the safety incident."
steps:
- name: get-worker
type: call
call: workday.get-worker
with:
worker_id: "{{employee_id}}"
- name: create-safety-ticket
type: call
call: servicenow.create-incident
with:
short_description: "Safety incident: {{incident_description}} — Store {{store_number}}"
category: "safety"
priority: "1"
assignment_group: "EHS_Safety"
- name: notify-safety-manager
type: call
call: msteams.send-message
with:
channel_id: "district-safety"
text: "Safety incident at Store {{store_number}} involving {{get-worker.full_name}}: {{incident_description}}. Ticket: {{create-safety-ticket.number}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/lowes/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Responds to security camera alerts by creating a ServiceNow security incident, pulling Splunk access logs, and notifying store asset protection via Teams.
naftiko: "0.5"
info:
label: "Store Security Camera Alert Response"
description: "Responds to security camera alerts by creating a ServiceNow security incident, pulling Splunk access logs, and notifying store asset protection via Teams."
tags:
- security
- servicenow
- splunk
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: handle-camera-alert
description: "Given a store number and camera zone, create a ServiceNow security incident, pull Splunk access logs, and notify asset protection."
inputParameters:
- name: store_number
type: string
description: "Store number."
- name: camera_zone
type: string
description: "Camera zone identifier."
- name: alert_type
type: string
description: "Alert type (motion, tamper, offline)."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Camera alert: {{alert_type}} — Store {{store_number}} Zone {{camera_zone}}"
category: "security"
priority: "2"
assignment_group: "Asset_Protection"
- name: get-access-logs
type: call
call: splunk.run-search
with:
query: "index=security store={{store_number}} zone={{camera_zone}}"
time_range: "-1h"
- name: notify-ap
type: call
call: msteams.send-message
with:
channel_id: "asset-protection-alerts"
text: "Camera {{alert_type}} alert at Store {{store_number}} Zone {{camera_zone}}. {{get-access-logs.event_count}} related security events. Ticket: {{create-incident.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: splunk
baseUri: "https://lowes-splunk.splunkcloud.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: searches
path: "/search/jobs"
operations:
- name: run-search
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Initiates a shrinkage investigation by pulling loss data from Snowflake, creating a ServiceNow case, and uploading evidence documents to Box.
naftiko: "0.5"
info:
label: "Store Shrinkage Investigation Workflow"
description: "Initiates a shrinkage investigation by pulling loss data from Snowflake, creating a ServiceNow case, and uploading evidence documents to Box."
tags:
- store-ops
- snowflake
- servicenow
- box
capability:
exposes:
- type: mcp
namespace: loss-prevention
port: 8080
tools:
- name: open-shrinkage-investigation
description: "Given a store number and department, pull Snowflake loss metrics, create a ServiceNow investigation case, and prepare a Box evidence folder."
inputParameters:
- name: store_number
type: string
description: "Store number."
- name: department
type: string
description: "Department with elevated shrinkage."
- name: period
type: string
description: "Reporting period (e.g., 2026-Q1)."
steps:
- name: get-loss-data
type: call
call: snowflake.run-query
with:
statement: "SELECT category, total_loss, shrink_rate FROM SHRINKAGE_METRICS WHERE store='{{store_number}}' AND dept='{{department}}' AND period='{{period}}'"
- name: create-case
type: call
call: servicenow.create-incident
with:
short_description: "Shrinkage investigation: Store {{store_number}} — {{department}}"
category: "loss_prevention"
assignment_group: "Asset_Protection"
- name: create-folder
type: call
call: box.create-folder
with:
name: "Investigation_{{store_number}}_{{department}}_{{period}}"
parent_id: "shrinkage_investigations"
consumes:
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: box
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: folders
path: "/folders"
operations:
- name: create-folder
method: POST
Manages store signage updates by pulling promotional details from Salesforce, generating print requests in ServiceNow, and notifying visual merchandising via Teams.
naftiko: "0.5"
info:
label: "Store Signage Update Workflow"
description: "Manages store signage updates by pulling promotional details from Salesforce, generating print requests in ServiceNow, and notifying visual merchandising via Teams."
tags:
- store-ops
- salesforce
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: merchandising
port: 8080
tools:
- name: update-store-signage
description: "Given a promotion ID and store list, pull Salesforce promo details, create ServiceNow print requests, and notify merchandising."
inputParameters:
- name: promotion_id
type: string
description: "Salesforce promotion ID."
- name: store_list
type: string
description: "Comma-separated store numbers."
steps:
- name: get-promotion
type: call
call: salesforce.get-promotion
with:
promotion_id: "{{promotion_id}}"
- name: create-print-request
type: call
call: servicenow.create-task
with:
short_description: "Signage update: {{get-promotion.name}}"
description: "Stores: {{store_list}}. Start: {{get-promotion.start_date}}, End: {{get-promotion.end_date}}"
assignment_group: "Visual_Merchandising"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "visual-merchandising"
text: "New signage request: {{get-promotion.name}} for stores {{store_list}}. Task: {{create-print-request.number}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://lowes.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: promotions
path: "/sobjects/Promotion__c/{{promotion_id}}"
inputParameters:
- name: promotion_id
in: path
operations:
- name: get-promotion
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Responds to severe weather events by checking affected store inventory in SAP, adjusting staffing in Workday, and posting operational alerts to Teams.
naftiko: "0.5"
info:
label: "Store Weather Impact Response"
description: "Responds to severe weather events by checking affected store inventory in SAP, adjusting staffing in Workday, and posting operational alerts to Teams."
tags:
- store-ops
- sap
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: emergency-ops
port: 8080
tools:
- name: respond-weather-impact
description: "Given a region and weather event type, check SAP emergency inventory, adjust Workday staffing, and post Teams alerts."
inputParameters:
- name: region
type: string
description: "Affected geographic region."
- name: event_type
type: string
description: "Weather event (hurricane, blizzard, flood, tornado)."
- name: affected_stores
type: string
description: "Comma-separated store numbers."
steps:
- name: check-emergency-stock
type: call
call: sap.get-emergency-inventory
with:
region: "{{region}}"
category: "emergency_supplies"
- name: adjust-staffing
type: call
call: workday.update-schedule
with:
stores: "{{affected_stores}}"
mode: "emergency"
- name: post-alert
type: call
call: msteams.send-message
with:
channel_id: "operations-emergency"
text: "Weather alert ({{event_type}}): {{region}}. Affected stores: {{affected_stores}}. Emergency stock: {{check-emergency-stock.available_units}} units. Staffing adjusted."
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/A_MatlStkInAcctMod"
operations:
- name: get-emergency-inventory
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: schedules
path: "/lowes/schedules"
operations:
- name: update-schedule
method: PUT
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Monitors store WiFi performance by pulling Datadog network metrics, correlating with Dynatrace application health, and creating ServiceNow tickets for degradation.
naftiko: "0.5"
info:
label: "Store WiFi Performance Monitoring"
description: "Monitors store WiFi performance by pulling Datadog network metrics, correlating with Dynatrace application health, and creating ServiceNow tickets for degradation."
tags:
- infrastructure
- datadog
- dynatrace
- servicenow
capability:
exposes:
- type: mcp
namespace: network-ops
port: 8080
tools:
- name: monitor-wifi-performance
description: "Given a store number, check Datadog WiFi metrics, correlate Dynatrace app impact, and create ServiceNow tickets."
inputParameters:
- name: store_number
type: string
description: "Store number."
steps:
- name: get-wifi-metrics
type: call
call: datadog.get-monitor
with:
monitor_id: "wifi-store-{{store_number}}"
- name: check-app-impact
type: call
call: dynatrace.get-host
with:
host_id: "pos-store-{{store_number}}"
- name: create-ticket
type: call
call: servicenow.create-incident
with:
short_description: "WiFi degradation: Store {{store_number}}"
description: "WiFi status: {{get-wifi-metrics.overall_state}}, POS health: {{check-app-impact.state}}"
category: "network"
assignment_group: "Store_IT"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: dynatrace
baseUri: "https://lowes.live.dynatrace.com/api/v2"
authentication:
type: bearer
token: "$secrets.dynatrace_token"
resources:
- name: entities
path: "/entities/{{host_id}}"
inputParameters:
- name: host_id
in: path
operations:
- name: get-host
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Reconciles supplier payments by matching SAP invoices against Oracle payment records and posting discrepancies to Snowflake for audit review.
naftiko: "0.5"
info:
label: "Supplier Payment Reconciliation"
description: "Reconciles supplier payments by matching SAP invoices against Oracle payment records and posting discrepancies to Snowflake for audit review."
tags:
- procurement
- sap
- oracle
- snowflake
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: reconcile-supplier-payments
description: "Given a vendor number and period, match SAP invoices against Oracle payments and log discrepancies in Snowflake."
inputParameters:
- name: vendor_number
type: string
description: "SAP vendor number."
- name: period
type: string
description: "Fiscal period (e.g., 2026-03)."
steps:
- name: get-invoices
type: call
call: sap.get-invoices
with:
vendor: "{{vendor_number}}"
period: "{{period}}"
- name: get-payments
type: call
call: oracle.get-payments
with:
supplier_id: "{{vendor_number}}"
period: "{{period}}"
- name: log-discrepancies
type: call
call: snowflake.run-query
with:
statement: "INSERT INTO PAYMENT_RECONCILIATION SELECT * FROM TABLE(RESULT_SCAN('{{get-invoices.query_id}}')) EXCEPT SELECT * FROM TABLE(RESULT_SCAN('{{get-payments.query_id}}'))"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_SupplierInvoice"
operations:
- name: get-invoices
method: GET
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: payments
path: "/payablesPayments"
operations:
- name: get-payments
method: GET
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
When a shipment delay is detected in Oracle, retrieves vendor details from SAP, creates a ServiceNow problem ticket, and notifies the supply chain team via Teams.
naftiko: "0.5"
info:
label: "Supply Chain Shipment Delay Escalation"
description: "When a shipment delay is detected in Oracle, retrieves vendor details from SAP, creates a ServiceNow problem ticket, and notifies the supply chain team via Teams."
tags:
- supply-chain
- oracle
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: escalate-shipment-delay
description: "Given a purchase order and shipment ID, look up Oracle shipment status, get SAP vendor info, create a ServiceNow escalation ticket, and notify the supply chain channel."
inputParameters:
- name: po_number
type: string
description: "SAP purchase order number."
- name: shipment_id
type: string
description: "Oracle shipment tracking ID."
steps:
- name: get-po
type: call
call: sap.get-po
with:
po_number: "{{po_number}}"
- name: get-shipment
type: call
call: oracle.get-shipment
with:
shipment_id: "{{shipment_id}}"
- name: create-problem
type: call
call: servicenow.create-incident
with:
short_description: "Shipment delay: PO {{po_number}} from {{get-po.vendor}} — ETA slipped"
category: "supply_chain"
priority: "2"
assignment_group: "Supply_Chain_Ops"
- name: notify-team
type: call
call: msteams.send-message
with:
channel_id: "supply-chain-alerts"
text: "Shipment {{shipment_id}} for PO {{po_number}} ({{get-po.vendor}}) is delayed. Ticket: {{create-problem.number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: shipments
path: "/shipments/{{shipment_id}}"
inputParameters:
- name: shipment_id
in: path
operations:
- name: get-shipment
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
operations:
- name: send-message
method: POST
Queries Teradata for inventory aging data by product category, returning stock age buckets and total on-hand units.
naftiko: "0.5"
info:
label: "Teradata Inventory Aging Report"
description: "Queries Teradata for inventory aging data by product category, returning stock age buckets and total on-hand units."
tags:
- inventory
- teradata
- supply-chain
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: get-inventory-aging
description: "Query Teradata for inventory aging breakdown by category. Returns on-hand quantity and age distribution buckets."
inputParameters:
- name: category_code
type: string
description: "Product category code."
call: teradata.run-query
with:
category_code: "{{category_code}}"
outputParameters:
- name: total_on_hand
type: integer
mapping: "$.results[0].total_on_hand"
- name: aging_buckets
type: object
mapping: "$.results[0].age_distribution"
consumes:
- type: http
namespace: teradata
baseUri: "https://lowes-teradata.teradata.com/api/query/v1"
authentication:
type: basic
username: "$secrets.teradata_user"
password: "$secrets.teradata_password"
resources:
- name: queries
path: "/systems/lowes_edw/queries"
operations:
- name: run-query
method: POST
Triggers a Terraform Cloud workspace run to provision retail store infrastructure, creates a Jira tracking task, and notifies the DevOps team via Teams.
naftiko: "0.5"
info:
label: "Terraform Infrastructure Provisioning"
description: "Triggers a Terraform Cloud workspace run to provision retail store infrastructure, creates a Jira tracking task, and notifies the DevOps team via Teams."
tags:
- cloud
- devops
- terraform
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: infra-provisioning
port: 8080
tools:
- name: provision-store-infrastructure
description: "Given a Terraform Cloud workspace and change description, trigger an infrastructure run, create a Jira task to track it, and post status to the DevOps Teams channel."
inputParameters:
- name: workspace_id
type: string
description: "Terraform Cloud workspace ID for the store infrastructure."
- name: change_description
type: string
description: "Description of the infrastructure change being applied."
- name: teams_channel_id
type: string
description: "DevOps Teams channel ID for status updates."
steps:
- name: create-run
type: call
call: terraform.create-run
with:
workspaceId: "{{workspace_id}}"
message: "{{change_description}}"
- name: create-task
type: call
call: jira.create-issue
with:
project_key: "INFRA"
issuetype: "Task"
summary: "Terraform: {{change_description}}"
description: "Workspace: {{workspace_id}} | Run: {{create-run.runId}}"
- name: notify-devops
type: call
call: msteams.post-channel-message
with:
channel_id: "{{teams_channel_id}}"
text: "Infrastructure run triggered: {{change_description}} | Workspace: {{workspace_id}} | Jira: {{create-task.key}}"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/runs"
operations:
- name: create-run
method: POST
- type: http
namespace: jira
baseUri: "https://lowes.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/devops/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Validates a vendor invoice against the SAP purchase order and goods receipt, then routes discrepancies to an approver via ServiceNow and Teams.
naftiko: "0.5"
info:
label: "Vendor Invoice Three-Way Match"
description: "Validates a vendor invoice against the SAP purchase order and goods receipt, then routes discrepancies to an approver via ServiceNow and Teams."
tags:
- finance
- procurement
- sap
- servicenow
- approval
capability:
exposes:
- type: mcp
namespace: ap-ops
port: 8080
tools:
- name: validate-invoice
description: "Given a vendor invoice number and SAP PO number, perform three-way match in SAP, create a ServiceNow task for any discrepancy, and notify the AP manager via Teams."
inputParameters:
- name: invoice_number
type: string
description: "Vendor invoice number."
- name: po_number
type: string
description: "Associated SAP purchase order number."
- name: ap_manager_upn
type: string
description: "UPN of the accounts payable manager for escalation."
steps:
- name: get-po
type: call
call: sap.get-po
with:
po_number: "{{po_number}}"
- name: create-discrepancy-task
type: call
call: servicenow.create-task
with:
short_description: "Invoice discrepancy: {{invoice_number}} vs PO {{po_number}}"
assigned_to: "{{ap_manager_upn}}"
description: "PO status: {{get-po.status}}, PO amount: {{get-po.total_value}} {{get-po.currency}}"
- name: notify-ap-manager
type: call
call: msteams.send-message
with:
recipient_upn: "{{ap_manager_upn}}"
text: "Invoice {{invoice_number}} requires review — PO {{po_number}} has discrepancies. ServiceNow: {{create-discrepancy-task.number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/chats"
operations:
- name: send-message
method: POST
Onboards new vendors by creating the vendor master in SAP, verifying compliance documents in Box, and provisioning vendor portal access via SailPoint.
naftiko: "0.5"
info:
label: "Vendor Onboarding Compliance Pipeline"
description: "Onboards new vendors by creating the vendor master in SAP, verifying compliance documents in Box, and provisioning vendor portal access via SailPoint."
tags:
- supply-chain
- sap
- box
- sailpoint
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: onboard-vendor
description: "Given vendor details, create SAP vendor master, verify Box compliance documents, and provision SailPoint portal access."
inputParameters:
- name: vendor_name
type: string
description: "Vendor company name."
- name: tax_id
type: string
description: "Vendor tax identification number."
- name: compliance_folder_id
type: string
description: "Box folder ID containing compliance documents."
steps:
- name: create-vendor
type: call
call: sap.create-vendor
with:
name: "{{vendor_name}}"
tax_id: "{{tax_id}}"
- name: verify-docs
type: call
call: box.get-folder-items
with:
folder_id: "{{compliance_folder_id}}"
- name: provision-access
type: call
call: sailpoint.create-identity
with:
display_name: "{{vendor_name}}"
type: "vendor"
vendor_id: "{{create-vendor.vendor_number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: suppliers
path: "/A_Supplier"
operations:
- name: create-vendor
method: POST
- type: http
namespace: box
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: folders
path: "/folders/{{folder_id}}/items"
inputParameters:
- name: folder_id
in: path
operations:
- name: get-folder-items
method: GET
- type: http
namespace: sailpoint
baseUri: "https://lowes.api.identitynow.com/v3"
authentication:
type: bearer
token: "$secrets.sailpoint_token"
resources:
- name: identities
path: "/accounts"
operations:
- name: create-identity
method: POST
Generates a vendor performance scorecard by pulling delivery metrics from SAP, quality data from Snowflake, and publishing the report to SharePoint.
naftiko: "0.5"
info:
label: "Vendor Performance Scorecard Generator"
description: "Generates a vendor performance scorecard by pulling delivery metrics from SAP, quality data from Snowflake, and publishing the report to SharePoint."
tags:
- supply-chain
- sap
- snowflake
- sharepoint
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: generate-vendor-scorecard
description: "Given a vendor number and period, compile delivery metrics from SAP, quality scores from Snowflake, and publish a scorecard to SharePoint."
inputParameters:
- name: vendor_number
type: string
description: "SAP vendor number."
- name: period
type: string
description: "Reporting period (e.g., 2026-Q1)."
steps:
- name: get-vendor
type: call
call: sap.get-vendor
with:
vendor_number: "{{vendor_number}}"
- name: get-delivery-metrics
type: call
call: snowflake.run-query
with:
statement: "SELECT on_time_rate, fill_rate, defect_rate FROM VENDOR_METRICS WHERE vendor_id='{{vendor_number}}' AND period='{{period}}'"
- name: upload-scorecard
type: call
call: sharepoint.upload-file
with:
folder: "/Shared Documents/Vendor Scorecards"
filename: "{{get-vendor.vendor_name}}_{{period}}_scorecard.pdf"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: suppliers
path: "/A_Supplier('{{vendor_number}}')"
inputParameters:
- name: vendor_number
in: path
operations:
- name: get-vendor
method: GET
- type: http
namespace: snowflake
baseUri: "https://lowes.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites/lowes.sharepoint.com"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive
path: "/drive/root:/{{folder}}/{{filename}}:/content"
operations:
- name: upload-file
method: PUT
Verifies incoming shipments at the warehouse by matching the SAP purchase order against Oracle receiving records and creating discrepancy tickets in ServiceNow.
naftiko: "0.5"
info:
label: "Warehouse Receiving Verification"
description: "Verifies incoming shipments at the warehouse by matching the SAP purchase order against Oracle receiving records and creating discrepancy tickets in ServiceNow."
tags:
- supply-chain
- sap
- oracle
- servicenow
capability:
exposes:
- type: mcp
namespace: warehouse-ops
port: 8080
tools:
- name: verify-receiving
description: "Given a PO number and receiving document, compare SAP PO quantities with Oracle receiving records and create ServiceNow tickets for discrepancies."
inputParameters:
- name: po_number
type: string
description: "SAP purchase order number."
- name: receiving_doc
type: string
description: "Oracle receiving document number."
steps:
- name: get-po
type: call
call: sap.get-po
with:
po_number: "{{po_number}}"
- name: get-receipt
type: call
call: oracle.get-receipt
with:
doc_number: "{{receiving_doc}}"
- name: create-discrepancy
type: call
call: servicenow.create-incident
with:
short_description: "Receiving discrepancy: PO {{po_number}} vs Receipt {{receiving_doc}}"
category: "warehouse"
assignment_group: "Warehouse_Receiving"
consumes:
- type: http
namespace: sap
baseUri: "https://lowes-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- type: http
namespace: oracle
baseUri: "https://lowes-oracle.oraclecloud.com/fscmRestApi/resources/v1"
authentication:
type: basic
username: "$secrets.oracle_user"
password: "$secrets.oracle_password"
resources:
- name: receipts
path: "/receivingTransactions/{{doc_number}}"
inputParameters:
- name: doc_number
in: path
operations:
- name: get-receipt
method: GET
- type: http
namespace: servicenow
baseUri: "https://lowes.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Retrieves an employee profile from Workday by worker ID, returning name, department, job title, and location.
naftiko: "0.5"
info:
label: "Workday Employee Profile Lookup"
description: "Retrieves an employee profile from Workday by worker ID, returning name, department, job title, and location."
tags:
- hr
- workday
- store-ops
capability:
exposes:
- type: mcp
namespace: hr
port: 8080
tools:
- name: get-employee-profile
description: "Look up a Workday employee profile by worker ID. Returns full name, job title, department, and supervisory org."
inputParameters:
- name: worker_id
type: string
description: "Workday worker ID."
call: workday.get-worker-profile
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: full_name
type: string
mapping: "$.worker.name.formatted"
- name: job_title
type: string
mapping: "$.worker.position.title"
- name: department
type: string
mapping: "$.worker.organization.name"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/lowes/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker-profile
method: GET
Creates a job requisition in Workday when headcount is approved and opens a Jira ticket in the talent acquisition board.
naftiko: "0.5"
info:
label: "Workday Open Position Requisition"
description: "Creates a job requisition in Workday when headcount is approved and opens a Jira ticket in the talent acquisition board."
tags:
- hr
- recruiting
- workday
- jira
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: open-job-requisition
description: "Given a job title, department, and hiring manager Workday ID, create a job requisition in Workday and a corresponding Jira ticket in the TA project for sourcing tracking."
inputParameters:
- name: job_title
type: string
description: "Job title for the open position."
- name: department
type: string
description: "Department requesting the headcount."
- name: hiring_manager_id
type: string
description: "Workday worker ID of the hiring manager."
steps:
- name: create-requisition
type: call
call: workday.create-job-requisition
with:
jobTitle: "{{job_title}}"
department: "{{department}}"
hiringManagerId: "{{hiring_manager_id}}"
- name: create-ta-ticket
type: call
call: jira.create-issue
with:
project_key: "TA"
issuetype: "Task"
summary: "Recruit: {{job_title}} — {{department}}"
description: "Workday requisition: {{create-requisition.requisitionId}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: job-requisitions
path: "/lowes/jobRequisitions"
operations:
- name: create-job-requisition
method: POST
- type: http
namespace: jira
baseUri: "https://lowes.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
When an employee changes roles in Workday, updates Okta group assignments and notifies the employee and new manager via Teams.
naftiko: "0.5"
info:
label: "Workday Role Change Access Sync"
description: "When an employee changes roles in Workday, updates Okta group assignments and notifies the employee and new manager via Teams."
tags:
- hr
- identity
- workday
- okta
- access-management
capability:
exposes:
- type: mcp
namespace: hr-identity
port: 8080
tools:
- name: sync-role-change
description: "Given a Workday employee ID and new/old Okta group IDs, remove the user from the old role group, add them to the new role group, and send a Teams notification to the employee."
inputParameters:
- name: employee_id
type: string
description: "Workday worker ID of the employee changing roles."
- name: new_role
type: string
description: "New job role or title."
- name: okta_new_group_id
type: string
description: "Okta group ID for the new role."
- name: okta_old_group_id
type: string
description: "Okta group ID for the previous role."
steps:
- name: get-worker
type: call
call: workday.get-worker
with:
worker_id: "{{employee_id}}"
- name: remove-old-group
type: call
call: okta.remove-user-from-group
with:
groupId: "{{okta_old_group_id}}"
userId: "{{get-worker.work_email}}"
- name: add-new-group
type: call
call: okta.add-user-to-group
with:
groupId: "{{okta_new_group_id}}"
userId: "{{get-worker.work_email}}"
- name: notify-employee
type: call
call: msteams.send-message
with:
recipient_upn: "{{get-worker.work_email}}"
text: "Your role has been updated to {{new_role}}. System access has been adjusted to reflect your new responsibilities."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/lowes/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://lowes.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: group-members
path: "/groups/{{groupId}}/users/{{userId}}"
inputParameters:
- name: groupId
in: path
- name: userId
in: path
operations:
- name: remove-user-from-group
method: DELETE
- name: add-user-to-group
method: PUT
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/chats"
operations:
- name: send-message
method: POST