Costco Capabilities
Naftiko 0.5 capability definitions for Costco - 100 capabilities showing integration workflows and service orchestrations.
When traffic drops, queries Snowflake, creates Jira ticket, and alerts digital team via Slack.
naftiko: "0.5"
info:
label: "Adobe Analytics Traffic Drop Investigation"
description: "When traffic drops, queries Snowflake, creates Jira ticket, and alerts digital team via Slack."
tags:
- analytics
- adobe-analytics
- snowflake
- jira
- slack
capability:
exposes:
- type: mcp
namespace: digital-ops
port: 8080
tools:
- name: investigate-traffic-drop
description: "Given report suite and date, investigate and alert."
inputParameters:
- name: report_suite
in: body
type: string
description: "Report suite."
- name: drop_date
in: body
type: string
description: "Date."
- name: drop_percentage
in: body
type: string
description: "Drop percentage."
steps:
- name: query-data
type: call
call: snowflake.execute-statement
with:
statement: "SELECT channel, SUM(sessions) as sessions FROM DIGITAL.WEB_ANALYTICS WHERE report_date = '{{drop_date}}' GROUP BY channel ORDER BY sessions DESC"
- name: create-ticket
type: call
call: jira.create-issue
with:
project: DIGITAL
issue_type: Task
summary: "Traffic drop: {{drop_percentage}}% on {{drop_date}}"
- name: alert
type: call
call: slack.post-message
with:
channel: "digital-alerts"
text: "Traffic drop {{drop_percentage}}% on {{drop_date}}. Jira: {{create-ticket.key}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When AWS Cost Anomaly Detection flags an unexpected spend spike, creates a ServiceNow ticket and alerts the FinOps team in Teams.
naftiko: "0.5"
info:
label: "AWS Cost Anomaly Alert Handler"
description: "When AWS Cost Anomaly Detection flags an unexpected spend spike, creates a ServiceNow ticket and alerts the FinOps team in Teams."
tags:
- cloud
- finops
- aws
- servicenow
- microsoft-teams
- cost-management
capability:
exposes:
- type: mcp
namespace: cloud-finops
port: 8080
tools:
- name: handle-aws-cost-anomaly
description: "Given an AWS account ID, service name, and anomaly amount, create a ServiceNow cost ticket and alert the FinOps team in Teams."
inputParameters:
- name: aws_account_id
in: body
type: string
description: "The AWS account ID where the anomaly occurred."
- name: anomaly_amount
in: body
type: number
description: "The anomalous incremental spend in USD."
- name: aws_service
in: body
type: string
description: "The AWS service driving the spend spike."
steps:
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "AWS cost anomaly: {{aws_service}} in {{aws_account_id}} +${{anomaly_amount}}"
category: "cloud_cost"
urgency: "2"
- name: alert-finops
type: call
call: "msteams.post-channel-message"
with:
channelId: "finops-team"
message: "AWS cost spike: {{aws_service}} in {{aws_account_id}} +${{anomaly_amount}} | ServiceNow: {{create-ticket.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
Checks Azure resource health status.
naftiko: "0.5"
info:
label: "Azure Resource Health Check"
description: "Checks Azure resource health status."
tags:
- cloud
- azure
- infrastructure
capability:
exposes:
- type: mcp
namespace: cloud-ops
port: 8080
tools:
- name: check-resource-health
description: "Given an Azure resource ID, return health status."
inputParameters:
- name: resource_id
in: body
type: string
description: "Azure resource ID."
call: azure.get-health
with:
resource_id: "{{resource_id}}"
outputParameters:
- name: availability_state
type: string
mapping: "$.properties.availabilityState"
consumes:
- type: http
namespace: azure
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: resource-health
path: "/{{resource_id}}/providers/Microsoft.ResourceHealth/availabilityStatuses/current?api-version=2023-07-01"
inputParameters:
- name: resource_id
in: path
operations:
- name: get-health
method: GET
When AWS cost anomaly is detected, creates Jira ticket and alerts FinOps Slack.
naftiko: "0.5"
info:
label: "Cloud Cost Spike Investigation"
description: "When AWS cost anomaly is detected, creates Jira ticket and alerts FinOps Slack."
tags:
- cloud
- finops
- aws
- jira
- slack
capability:
exposes:
- type: mcp
namespace: finops
port: 8080
tools:
- name: investigate-cost-spike
description: "Given an AWS account and date, investigate and alert."
inputParameters:
- name: aws_account_id
in: body
type: string
description: "AWS account ID."
- name: anomaly_date
in: body
type: string
description: "Date YYYY-MM-DD."
steps:
- name: get-cost
type: call
call: snowflake.execute-statement
with:
statement: "SELECT service, SUM(cost) as total FROM FINOPS.AWS_BILLING WHERE account_id = '{{aws_account_id}}' AND usage_date = '{{anomaly_date}}' GROUP BY service ORDER BY total DESC"
- name: create-ticket
type: call
call: jira.create-issue
with:
project: FINOPS
issue_type: Task
summary: "Cost anomaly: {{aws_account_id}} on {{anomaly_date}}"
- name: alert
type: call
call: slack.post-message
with:
channel: "finops-alerts"
text: "Cost spike in {{aws_account_id}} on {{anomaly_date}}. Jira: {{create-ticket.key}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When Datadog fires a critical alert, creates a ServiceNow incident, pages on-call via PagerDuty, and notifies ops Slack.
naftiko: "0.5"
info:
label: "Datadog Alert to PagerDuty Escalation"
description: "When Datadog fires a critical alert, creates a ServiceNow incident, pages on-call via PagerDuty, and notifies ops Slack."
tags:
- observability
- datadog
- pagerduty
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: incident-ops
port: 8080
tools:
- name: handle-critical-alert
description: "Given an alert ID, create incident, page on-call, and notify ops."
inputParameters:
- name: alert_id
in: body
type: string
description: "Datadog alert ID."
- name: alert_title
in: body
type: string
description: "Alert title."
- name: service_name
in: body
type: string
description: "Affected service."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
category: application
urgency: 1
short_description: "[P1] {{alert_title}} — {{service_name}}"
- name: page-oncall
type: call
call: pagerduty.create-incident
with:
service_id: "{{service_name}}"
title: "{{alert_title}}"
urgency: high
- name: notify
type: call
call: slack.post-message
with:
channel: "oncall-alerts"
text: "P1: {{alert_title}} on {{service_name}}. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a Datadog monitor fires for a production infrastructure issue, creates a ServiceNow P1 incident and pages the on-call team in Teams.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Alert to ServiceNow"
description: "When a Datadog monitor fires for a production infrastructure issue, creates a ServiceNow P1 incident and pages the on-call team in Teams."
tags:
- observability
- itsm
- datadog
- servicenow
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: infra-ops
port: 8080
tools:
- name: handle-infra-alert
description: "Given a Datadog monitor ID and alert message, create a ServiceNow P1 incident and page the on-call team in Teams."
inputParameters:
- name: monitor_id
in: body
type: string
description: "The Datadog monitor ID that triggered."
- name: monitor_name
in: body
type: string
description: "The Datadog monitor name."
- name: alert_message
in: body
type: string
description: "The alert message body from Datadog."
steps:
- name: get-monitor
type: call
call: "datadog.get-monitor"
with:
monitor_id: "{{monitor_id}}"
- name: create-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Infra alert: {{monitor_name}}"
description: "{{alert_message}}\nMonitor: {{monitor_id}}\nState: {{get-monitor.overall_state}}"
urgency: "1"
- name: page-oncall
type: call
call: "msteams.post-channel-message"
with:
channelId: "infra-oncall"
message: "P1 Alert: {{monitor_name}} | ServiceNow: {{create-incident.number}} | {{alert_message}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
Checks a Datadog monitor status by ID.
naftiko: "0.5"
info:
label: "Datadog Monitor Status Check"
description: "Checks a Datadog monitor status by ID."
tags:
- observability
- datadog
- monitoring
capability:
exposes:
- type: mcp
namespace: monitoring
port: 8080
tools:
- name: get-monitor-status
description: "Given a Datadog monitor ID, return status."
inputParameters:
- name: monitor_id
in: body
type: string
description: "Monitor ID."
call: datadog.get-monitor
with:
monitor_id: "{{monitor_id}}"
outputParameters:
- name: overall_state
type: string
mapping: "$.overall_state"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
Queries Snowflake demand forecast, identifies SKUs below safety stock, and creates SAP replenishment POs.
naftiko: "0.5"
info:
label: "Demand Forecast to Replenishment Order"
description: "Queries Snowflake demand forecast, identifies SKUs below safety stock, and creates SAP replenishment POs."
tags:
- supply-chain
- snowflake
- sap
- slack
- replenishment
capability:
exposes:
- type: mcp
namespace: replenishment
port: 8080
tools:
- name: trigger-replenishment
description: "Given a warehouse and category, check stock and create POs."
inputParameters:
- name: warehouse_id
in: body
type: string
description: "Warehouse ID."
- name: category
in: body
type: string
description: "Product category."
steps:
- name: get-low-stock
type: call
call: snowflake.execute-statement
with:
statement: "SELECT sku, on_hand_qty, reorder_qty FROM SUPPLY_CHAIN.REPLENISHMENT_VIEW WHERE warehouse_id = '{{warehouse_id}}' AND category = '{{category}}' AND on_hand_qty < safety_stock"
- name: create-po
type: call
call: sap.create-purchase-order
with:
items: "{{get-low-stock.results}}"
warehouse_id: "{{warehouse_id}}"
- name: notify
type: call
call: slack.post-message
with:
channel: "supply-chain-ops"
text: "Replenishment for warehouse {{warehouse_id}}: {{get-low-stock.row_count}} items. PO: {{create-po.po_number}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder"
operations:
- name: create-purchase-order
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Detects fulfillment delays in Snowflake, creates a Jira issue, updates the Salesforce member case, and notifies logistics via Slack.
naftiko: "0.5"
info:
label: "E-Commerce Order Fulfillment Issue Pipeline"
description: "Detects fulfillment delays in Snowflake, creates a Jira issue, updates the Salesforce member case, and notifies logistics via Slack."
tags:
- ecommerce
- snowflake
- jira
- salesforce
- slack
capability:
exposes:
- type: mcp
namespace: fulfillment-issue
port: 8080
tools:
- name: handle-delay
description: "Orchestrate fulfillment delay investigation and member notification."
inputParameters:
- name: order_id
in: body
type: string
description: "Order ID."
- name: member_id
in: body
type: string
description: "Member ID."
steps:
- name: get-order-details
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT order_date, expected_delivery, current_status, warehouse_id FROM ECOMMERCE.ORDERS WHERE order_id = '{{order_id}}'"
- name: create-jira
type: call
call: "jira.create-issue"
with:
project: "ECOM"
summary: "Fulfillment delay: Order {{order_id}}"
description: "Order status: {{get-order-details.results[0].current_status}}. Expected delivery: {{get-order-details.results[0].expected_delivery}}."
issuetype: "Bug"
- name: update-case
type: call
call: "salesforce.create-case"
with:
subject: "Order {{order_id}} fulfillment delay"
member_id: "{{member_id}}"
description: "Investigating delay. Jira: {{create-jira.key}}."
- name: notify-logistics
type: call
call: "slack.post-message"
with:
channel: "logistics-ops"
text: "Fulfillment delay: Order {{order_id}} from Warehouse {{get-order-details.results[0].warehouse_id}}. Jira: {{create-jira.key}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a Workday termination is processed, deactivates Okta access, disables the Microsoft 365 account, and closes open ServiceNow tickets.
naftiko: "0.5"
info:
label: "Employee Offboarding Access Revocation"
description: "When a Workday termination is processed, deactivates Okta access, disables the Microsoft 365 account, and closes open ServiceNow tickets."
tags:
- hr
- offboarding
- workday
- okta
- servicenow
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID and termination date, deactivate Okta, disable the Microsoft Graph account, and resolve open ServiceNow tickets."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday worker ID for the departing employee."
- name: termination_date
in: body
type: string
description: "Termination date in YYYY-MM-DD format."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: deactivate-okta
type: call
call: "okta.deactivate-user"
with:
login: "{{get-worker.work_email}}"
- name: disable-m365
type: call
call: "msgraph.update-user"
with:
userPrincipalName: "{{get-worker.work_email}}"
accountEnabled: "false"
- name: close-tickets
type: call
call: "servicenow.close-user-tickets"
with:
caller_id: "{{get-worker.work_email}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/costco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: users
path: "/users/{{login}}/lifecycle/deactivate"
inputParameters:
- name: login
in: path
operations:
- name: deactivate-user
method: POST
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{userPrincipalName}}"
inputParameters:
- name: userPrincipalName
in: path
operations:
- name: update-user
method: PATCH
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: close-user-tickets
method: PATCH
Creates a ServiceNow incident for food safety reports, pulls affected product data from SAP, notifies store operations via Slack, and creates a Salesforce case for supplier follow-up.
naftiko: "0.5"
info:
label: "Food Safety Incident Pipeline"
description: "Creates a ServiceNow incident for food safety reports, pulls affected product data from SAP, notifies store operations via Slack, and creates a Salesforce case for supplier follow-up."
tags:
- food-safety
- servicenow
- sap
- slack
- salesforce
capability:
exposes:
- type: mcp
namespace: food-safety
port: 8080
tools:
- name: report-incident
description: "Orchestrate food safety incident response."
inputParameters:
- name: product_code
in: body
type: string
description: "Product code."
- name: warehouse_id
in: body
type: string
description: "Warehouse where issue found."
- name: description
in: body
type: string
description: "Incident description."
steps:
- name: create-incident
type: call
call: "servicenow.create-record"
with:
table: "incident"
short_description: "Food safety: {{product_code}} at Warehouse {{warehouse_id}}"
description: "{{description}}"
urgency: "1"
- name: get-product-info
type: call
call: "sap.get-material"
with:
material_number: "{{product_code}}"
- name: notify-ops
type: call
call: "slack.post-message"
with:
channel: "food-safety-alerts"
text: "FOOD SAFETY ALERT: {{get-product-info.description}} ({{product_code}}) at Warehouse {{warehouse_id}}. Incident: {{create-incident.number}}."
- name: create-supplier-case
type: call
call: "salesforce.create-case"
with:
subject: "Food safety: {{product_code}} - {{get-product-info.description}}"
description: "{{description}}. Warehouse: {{warehouse_id}}."
priority: "Critical"
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/{{table}}"
inputParameters:
- name: table
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Material('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, logs a Datadog event, and alerts the engineering team in Teams.
naftiko: "0.5"
info:
label: "GitHub CI/CD Pipeline Failure Handler"
description: "On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, logs a Datadog event, and alerts the engineering team in Teams."
tags:
- devops
- cicd
- github
- jira
- datadog
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: devops-cicd
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions workflow failure, create a Jira bug, log a Datadog event, and alert the engineering Teams channel."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in owner/repo format."
- name: workflow_name
in: body
type: string
description: "The name of the failed GitHub Actions workflow."
- name: branch
in: body
type: string
description: "The branch on which the failure occurred."
- name: run_id
in: body
type: string
description: "The GitHub Actions workflow run ID."
steps:
- name: get-run-details
type: call
call: "github.get-workflow-run"
with:
repo: "{{repo}}"
run_id: "{{run_id}}"
- name: create-jira-bug
type: call
call: "jira.create-issue"
with:
projectKey: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repo}} / {{branch}} — {{workflow_name}}"
description: "Run: {{run_id}}\nConclusion: {{get-run-details.conclusion}}"
- name: log-datadog
type: call
call: "datadog.create-event"
with:
title: "CI Failure: {{repo}} {{workflow_name}}"
text: "Branch: {{branch}}, Run: {{run_id}}"
alert_type: "error"
- name: alert-team
type: call
call: "msteams.post-channel-message"
with:
channelId: "engineering-alerts"
message: "CI Failure: {{repo}} | Branch: {{branch}} | Workflow: {{workflow_name}} | Jira: {{create-jira-bug.key}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-runs
path: "/repos/{{repo}}/actions/runs/{{run_id}}"
inputParameters:
- name: repo
in: path
- name: run_id
in: path
operations:
- name: get-workflow-run
method: GET
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
When a GitHub release is published, creates a ServiceNow change request and notifies engineering via Slack.
naftiko: "0.5"
info:
label: "GitHub Release to ServiceNow Change"
description: "When a GitHub release is published, creates a ServiceNow change request and notifies engineering via Slack."
tags:
- devops
- github
- servicenow
- slack
- change-management
capability:
exposes:
- type: mcp
namespace: release-ops
port: 8080
tools:
- name: process-release
description: "Given a repo and release tag, create change request and notify engineering."
inputParameters:
- name: repo_name
in: body
type: string
description: "Repository."
- name: release_tag
in: body
type: string
description: "Release tag."
steps:
- name: get-release
type: call
call: github.get-release
with:
repo_name: "{{repo_name}}"
tag: "{{release_tag}}"
- name: create-change
type: call
call: servicenow.create-change
with:
short_description: "Release {{release_tag}} for {{repo_name}}"
description: "{{get-release.body}}"
- name: notify
type: call
call: slack.post-message
with:
channel: "engineering-releases"
text: "Release {{release_tag}} for {{repo_name}}. Change: {{create-change.number}}."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: releases
path: "/repos/{{repo_name}}/releases/tags/{{tag}}"
inputParameters:
- name: repo_name
in: path
- name: tag
in: path
operations:
- name: get-release
method: GET
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Looks up a GitHub repository and returns description and default branch.
naftiko: "0.5"
info:
label: "GitHub Repository Info"
description: "Looks up a GitHub repository and returns description and default branch."
tags:
- devops
- github
- repository
capability:
exposes:
- type: mcp
namespace: devops
port: 8080
tools:
- name: get-repo-info
description: "Given a repo name, return description and branch."
inputParameters:
- name: repo_name
in: body
type: string
description: "Repository in org/repo format."
call: github.get-repo
with:
repo_name: "{{repo_name}}"
outputParameters:
- name: description
type: string
mapping: "$.description"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: repos
path: "/repos/{{repo_name}}"
inputParameters:
- name: repo_name
in: path
operations:
- name: get-repo
method: GET
Scans GitHub Dependabot alerts for critical vulnerabilities, creates Jira security tickets, and notifies the security team in Teams.
naftiko: "0.5"
info:
label: "GitHub Security Vulnerability Triage"
description: "Scans GitHub Dependabot alerts for critical vulnerabilities, creates Jira security tickets, and notifies the security team in Teams."
tags:
- security
- devops
- github
- jira
- microsoft-teams
- vulnerability-management
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: triage-vulnerability-alerts
description: "Given a GitHub repository, retrieve critical Dependabot alerts, create Jira security tickets, and post a summary to the security Teams channel."
inputParameters:
- name: repo
in: body
type: string
description: "GitHub repository in owner/repo format."
steps:
- name: get-alerts
type: call
call: "github.get-dependabot-alerts"
with:
repo: "{{repo}}"
severity: "critical"
- name: create-security-ticket
type: call
call: "jira.create-issue"
with:
projectKey: "SEC"
issuetype: "Security"
summary: "Critical vulnerability: {{get-alerts.advisory_summary}}"
description: "Package: {{get-alerts.package_name}}\nCVSS: {{get-alerts.cvss_score}}\nRepo: {{repo}}"
- name: notify-security
type: call
call: "msteams.post-channel-message"
with:
channelId: "security-team"
message: "Critical vulnerability in {{repo}}: {{get-alerts.advisory_summary}} | Jira: {{create-security-ticket.key}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: dependabot-alerts
path: "/repos/{{repo}}/dependabot/alerts"
inputParameters:
- name: repo
in: path
- name: severity
in: query
operations:
- name: get-dependabot-alerts
method: GET
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
Uses Anthropic Claude to summarize procurement contracts and policy documents from SharePoint and posts the key points to the relevant Teams channel.
naftiko: "0.5"
info:
label: "Intelligent Document Summarization"
description: "Uses Anthropic Claude to summarize procurement contracts and policy documents from SharePoint and posts the key points to the relevant Teams channel."
tags:
- ai
- automation
- anthropic
- sharepoint
- microsoft-teams
- document-management
capability:
exposes:
- type: mcp
namespace: ai-docs
port: 8080
tools:
- name: summarize-document
description: "Given a SharePoint file path and target Teams channel, retrieve the document, send to Claude for summarization, and post the summary to Teams."
inputParameters:
- name: site_id
in: body
type: string
description: "The SharePoint site ID containing the document."
- name: file_path
in: body
type: string
description: "The relative file path in SharePoint."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel ID to post the summary to."
steps:
- name: get-document
type: call
call: "sharepoint.get-file-content"
with:
siteId: "{{site_id}}"
filePath: "{{file_path}}"
- name: summarize
type: call
call: "anthropic.create-message"
with:
model: "claude-3-5-sonnet-20241022"
content: "Summarize this business document in 3-5 key bullet points: {{get-document.content}}"
- name: post-summary
type: call
call: "msteams.post-channel-message"
with:
channelId: "{{teams_channel_id}}"
message: "Document summary for {{file_path}}:\n{{summarize.content}}"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/sites/{{siteId}}/drive/root:{{filePath}}:/content"
inputParameters:
- name: siteId
in: path
- name: filePath
in: path
operations:
- name: get-file-content
method: GET
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
Retrieves a Jira issue by key and returns summary and status.
naftiko: "0.5"
info:
label: "Jira Issue Lookup"
description: "Retrieves a Jira issue by key and returns summary and status."
tags:
- devops
- jira
- issue-tracking
capability:
exposes:
- type: mcp
namespace: issue-tracking
port: 8080
tools:
- name: get-issue
description: "Given a Jira issue key, return summary and status."
inputParameters:
- name: issue_key
in: body
type: string
description: "Jira issue key."
call: jira.get-issue
with:
issue_key: "{{issue_key}}"
outputParameters:
- name: summary
type: string
mapping: "$.fields.summary"
consumes:
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue/{{issue_key}}"
inputParameters:
- name: issue_key
in: path
operations:
- name: get-issue
method: GET
Retrieves completed Jira sprint data and posts a velocity summary to the engineering team's Teams channel.
naftiko: "0.5"
info:
label: "Jira Sprint Velocity Report"
description: "Retrieves completed Jira sprint data and posts a velocity summary to the engineering team's Teams channel."
tags:
- devops
- engineering
- jira
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: engineering-reporting
port: 8080
tools:
- name: publish-sprint-velocity
description: "Given a Jira board ID and sprint ID, retrieve completed issues and story points, then post a velocity summary to the engineering Teams channel."
inputParameters:
- name: board_id
in: body
type: string
description: "The Jira software board ID."
- name: sprint_id
in: body
type: string
description: "The Jira sprint ID to report on."
steps:
- name: get-sprint-issues
type: call
call: "jira.get-sprint-issues"
with:
boardId: "{{board_id}}"
sprintId: "{{sprint_id}}"
- name: post-velocity
type: call
call: "msteams.post-channel-message"
with:
channelId: "engineering-team"
message: "Sprint {{sprint_id}} complete: {{get-sprint-issues.completedIssues}} issues, {{get-sprint-issues.completedPoints}} story points."
consumes:
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: sprint-issues
path: "/board/{{boardId}}/sprint/{{sprintId}}/issue"
inputParameters:
- name: boardId
in: path
- name: sprintId
in: path
operations:
- name: get-sprint-issues
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
When a pod enters CrashLoopBackOff, collects logs via Datadog, creates ServiceNow incident, and pages on-call.
naftiko: "0.5"
info:
label: "Kubernetes Pod CrashLoop Responder"
description: "When a pod enters CrashLoopBackOff, collects logs via Datadog, creates ServiceNow incident, and pages on-call."
tags:
- infrastructure
- kubernetes
- datadog
- servicenow
- pagerduty
capability:
exposes:
- type: mcp
namespace: k8s-ops
port: 8080
tools:
- name: handle-crashloop
description: "Given namespace and pod, collect logs, create incident, and page on-call."
inputParameters:
- name: namespace
in: body
type: string
description: "Namespace."
- name: pod_name
in: body
type: string
description: "Pod name."
- name: cluster
in: body
type: string
description: "Cluster."
steps:
- name: get-logs
type: call
call: datadog.search-logs
with:
query: "kube_namespace:{{namespace}} pod_name:{{pod_name}}"
- name: create-incident
type: call
call: servicenow.create-incident
with:
category: infrastructure
urgency: 1
short_description: "CrashLoop: {{pod_name}} in {{namespace}}/{{cluster}}"
- name: page-oncall
type: call
call: pagerduty.create-incident
with:
service_id: "{{cluster}}-k8s"
title: "CrashLoop: {{pod_name}}"
urgency: high
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: logs
path: "/logs/events/search"
operations:
- name: search-logs
method: POST
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
When a member complaint is received, creates a Salesforce case, looks up the order in SAP, and notifies member services via Slack.
naftiko: "0.5"
info:
label: "Member Complaint to Case and Refund"
description: "When a member complaint is received, creates a Salesforce case, looks up the order in SAP, and notifies member services via Slack."
tags:
- customer-service
- salesforce
- sap
- slack
- refund
capability:
exposes:
- type: mcp
namespace: member-services
port: 8080
tools:
- name: process-member-complaint
description: "Given member email and order number, create case, look up order, and notify team."
inputParameters:
- name: member_email
in: body
type: string
description: "Member email."
- name: order_number
in: body
type: string
description: "Order number."
- name: complaint
in: body
type: string
description: "Complaint description."
steps:
- name: lookup-order
type: call
call: sap.get-sales-order
with:
order_number: "{{order_number}}"
- name: create-case
type: call
call: salesforce.create-case
with:
subject: "Member complaint: Order {{order_number}}"
description: "{{complaint}}"
contact_email: "{{member_email}}"
- name: notify
type: call
call: slack.post-message
with:
channel: "member-services"
text: "New complaint case {{create-case.case_number}} for order {{order_number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales-orders
path: "/A_SalesOrder('{{order_number}}')"
inputParameters:
- name: order_number
in: path
operations:
- name: get-sales-order
method: GET
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Queries Snowflake for suspicious member transactions, creates a Salesforce case, flags the account in Okta, and notifies loss prevention via Microsoft Teams.
naftiko: "0.5"
info:
label: "Member Fraud Detection Pipeline"
description: "Queries Snowflake for suspicious member transactions, creates a Salesforce case, flags the account in Okta, and notifies loss prevention via Microsoft Teams."
tags:
- fraud
- snowflake
- salesforce
- okta
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: fraud-detection
port: 8080
tools:
- name: investigate-fraud
description: "Orchestrate fraud detection and account flagging."
inputParameters:
- name: member_id
in: body
type: string
description: "Member ID."
- name: alert_type
in: body
type: string
description: "Type of fraud alert."
steps:
- name: query-transactions
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT transaction_id, amount, warehouse_id, transaction_date FROM SECURITY.SUSPICIOUS_TRANSACTIONS WHERE member_id = '{{member_id}}' AND alert_type = '{{alert_type}}'"
- name: create-case
type: call
call: "salesforce.create-case"
with:
subject: "Fraud alert: Member {{member_id}} - {{alert_type}}"
description: "Suspicious transactions: {{query-transactions.row_count}}."
priority: "High"
- name: flag-account
type: call
call: "okta.update-user"
with:
user_id: "{{member_id}}"
profile_status: "fraud_review"
- name: notify-lp
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.loss_prevention_channel"
text: "Fraud alert: Member {{member_id}} ({{alert_type}}). {{query-transactions.row_count}} suspicious transactions. Case: {{create-case.id}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: apiKey
key: "$secrets.okta_api_token"
resources:
- name: users
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: update-user
method: PUT
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Queries Snowflake for members approaching renewal, updates Salesforce contacts, and sends reminders via marketing automation.
naftiko: "0.5"
info:
label: "Membership Renewal Reminder Orchestrator"
description: "Queries Snowflake for members approaching renewal, updates Salesforce contacts, and sends reminders via marketing automation."
tags:
- membership
- snowflake
- salesforce
- slack
- marketing
capability:
exposes:
- type: mcp
namespace: membership-ops
port: 8080
tools:
- name: send-renewal-reminders
description: "Given a renewal window, find expiring memberships and trigger reminders."
inputParameters:
- name: days_before_expiry
in: body
type: string
description: "Days before expiry to send reminder."
steps:
- name: get-expiring
type: call
call: snowflake.execute-statement
with:
statement: "SELECT member_id, email, membership_type, expiry_date FROM MEMBERSHIP.MEMBERS WHERE expiry_date = DATEADD(day, {{days_before_expiry}}, CURRENT_DATE()) AND renewal_status = 'PENDING'"
- name: update-salesforce
type: call
call: salesforce.update-contacts
with:
members: "{{get-expiring.results}}"
renewal_reminder_sent: true
- name: notify-marketing
type: call
call: slack.post-message
with:
channel: "membership-marketing"
text: "Renewal reminders sent to {{get-expiring.row_count}} members expiring in {{days_before_expiry}} days."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/composite/sobjects"
operations:
- name: update-contacts
method: PATCH
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Identifies eligible members in Snowflake, updates membership tier in Salesforce, sends upgrade notification via Slack, and logs in ServiceNow.
naftiko: "0.5"
info:
label: "Membership Tier Upgrade Pipeline"
description: "Identifies eligible members in Snowflake, updates membership tier in Salesforce, sends upgrade notification via Slack, and logs in ServiceNow."
tags:
- membership
- snowflake
- salesforce
- slack
- servicenow
capability:
exposes:
- type: mcp
namespace: tier-upgrade
port: 8080
tools:
- name: process-upgrade
description: "Orchestrate membership tier upgrade for eligible members."
inputParameters:
- name: member_id
in: body
type: string
description: "Member ID."
steps:
- name: check-eligibility
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT current_tier, annual_spend, eligible_tier FROM MEMBERSHIP.TIER_ELIGIBILITY WHERE member_id = '{{member_id}}'"
- name: update-tier
type: call
call: "salesforce.update-record"
with:
object: "Account"
member_id: "{{member_id}}"
tier: "{{check-eligibility.results[0].eligible_tier}}"
- name: log-upgrade
type: call
call: "servicenow.create-record"
with:
table: "u_membership_changes"
member_id: "{{member_id}}"
previous_tier: "{{check-eligibility.results[0].current_tier}}"
new_tier: "{{check-eligibility.results[0].eligible_tier}}"
- name: notify-team
type: call
call: "slack.post-message"
with:
channel: "membership-ops"
text: "Member {{member_id}} upgraded from {{check-eligibility.results[0].current_tier}} to {{check-eligibility.results[0].eligible_tier}}. Annual spend: {{check-eligibility.results[0].annual_spend}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: records
path: "/sobjects/{{object}}"
inputParameters:
- name: object
in: path
operations:
- name: update-record
method: PATCH
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/{{table}}"
inputParameters:
- name: table
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Lists channels in a Microsoft Teams team.
naftiko: "0.5"
info:
label: "Microsoft Teams Channel List"
description: "Lists channels in a Microsoft Teams team."
tags:
- communication
- microsoft-teams
- collaboration
capability:
exposes:
- type: mcp
namespace: collaboration
port: 8080
tools:
- name: list-channels
description: "Given a team ID, return channels."
inputParameters:
- name: team_id
in: body
type: string
description: "Team ID."
call: msteams.list-channels
with:
team_id: "{{team_id}}"
outputParameters:
- name: channels
type: array
mapping: "$.value"
consumes:
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{team_id}}/channels"
inputParameters:
- name: team_id
in: path
operations:
- name: list-channels
method: GET
When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Okta access, and sends a Microsoft Teams welcome message.
naftiko: "0.5"
info:
label: "New Employee Onboarding Orchestrator"
description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Okta access, and sends a Microsoft Teams welcome message."
tags:
- hr
- onboarding
- workday
- servicenow
- okta
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence: open a ServiceNow ticket, provision Okta, and send a Teams welcome."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "Employee start date in YYYY-MM-DD format."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: create-snow-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-worker.full_name}}"
category: "hr_onboarding"
- name: activate-okta
type: call
call: "okta.create-user"
with:
login: "{{get-worker.work_email}}"
firstName: "{{get-worker.first_name}}"
lastName: "{{get-worker.last_name}}"
- name: send-welcome
type: call
call: "msteams.post-message"
with:
recipient: "{{get-worker.work_email}}"
message: "Welcome to Costco, {{get-worker.first_name}}! Your onboarding ticket: {{create-snow-ticket.number}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/costco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/chats/messages"
operations:
- name: post-message
method: POST
Reads new hire data from Workday, creates Okta account, provisions ServiceNow assets, and sends welcome email via Microsoft Teams.
naftiko: "0.5"
info:
label: "New Hire IT Provisioning Pipeline"
description: "Reads new hire data from Workday, creates Okta account, provisions ServiceNow assets, and sends welcome email via Microsoft Teams."
tags:
- onboarding
- workday
- okta
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: it-provisioning
port: 8080
tools:
- name: provision-new-hire
description: "Orchestrate IT provisioning for new employees."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee ID."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
employee_id: "{{employee_id}}"
- name: create-okta-user
type: call
call: "okta.create-user"
with:
firstName: "{{get-employee.first_name}}"
lastName: "{{get-employee.last_name}}"
email: "{{get-employee.email}}"
department: "{{get-employee.department}}"
- name: provision-assets
type: call
call: "servicenow.create-request"
with:
short_description: "IT setup for {{get-employee.first_name}} {{get-employee.last_name}}"
category: "New Hire Provisioning"
department: "{{get-employee.department}}"
- name: send-welcome
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.hr_onboarding_channel"
text: "New hire provisioned: {{get-employee.first_name}} {{get-employee.last_name}} ({{get-employee.department}}). Okta: {{create-okta-user.id}}. IT Request: {{provision-assets.number}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
authentication:
type: basic
username: "$secrets.workday_user"
password: "$secrets.workday_password"
resources:
- name: workers
path: "/Human_Resources/Worker/{{employee_id}}"
inputParameters:
- name: employee_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: apiKey
key: "$secrets.okta_api_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a new vendor is approved, creates SAP vendor master, opens ServiceNow ticket, and notifies procurement via Slack.
naftiko: "0.5"
info:
label: "New Vendor Onboarding Orchestrator"
description: "When a new vendor is approved, creates SAP vendor master, opens ServiceNow ticket, and notifies procurement via Slack."
tags:
- procurement
- sap
- servicenow
- slack
- vendor-management
capability:
exposes:
- type: mcp
namespace: vendor-ops
port: 8080
tools:
- name: onboard-vendor
description: "Given vendor details, create SAP record, ServiceNow ticket, and notify."
inputParameters:
- name: vendor_name
in: body
type: string
description: "Vendor name."
- name: vendor_tax_id
in: body
type: string
description: "Tax ID."
- name: category
in: body
type: string
description: "Category."
steps:
- name: create-vendor
type: call
call: sap.create-vendor
with:
vendor_name: "{{vendor_name}}"
tax_id: "{{vendor_tax_id}}"
- name: open-ticket
type: call
call: servicenow.create-request
with:
category: vendor_onboarding
short_description: "Vendor onboarding: {{vendor_name}}"
- name: notify
type: call
call: slack.post-message
with:
channel: "procurement-onboarding"
text: "Vendor {{vendor_name}} onboarded. SAP: {{create-vendor.vendor_id}}. Ticket: {{open-ticket.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: suppliers
path: "/A_Supplier"
operations:
- name: create-vendor
method: POST
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves group membership details for a user in Okta by email address.
naftiko: "0.5"
info:
label: "Okta Group Membership Lookup"
description: "Retrieves group membership details for a user in Okta by email address."
tags:
- identity
- okta
- access-management
capability:
exposes:
- type: mcp
namespace: okta-groups
port: 8080
tools:
- name: get-user-groups
description: "Look up Okta group memberships for a user."
inputParameters:
- name: user_email
in: body
type: string
description: "User email address."
call: "okta.get-user-groups"
with:
user_id: "{{user_email}}"
outputParameters:
- name: groups
type: array
mapping: "$.groups"
consumes:
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: apiKey
key: "$secrets.okta_api_token"
resources:
- name: users
path: "/users/{{user_id}}/groups"
inputParameters:
- name: user_id
in: path
operations:
- name: get-user-groups
method: GET
When Okta detects suspicious login, creates security incident, suspends sessions, and alerts SOC.
naftiko: "0.5"
info:
label: "Okta Suspicious Login Handler"
description: "When Okta detects suspicious login, creates security incident, suspends sessions, and alerts SOC."
tags:
- security
- okta
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: threat-response
port: 8080
tools:
- name: handle-suspicious-login
description: "Given event ID and user, create incident, suspend sessions, and alert SOC."
inputParameters:
- name: event_id
in: body
type: string
description: "Okta event ID."
- name: user_login
in: body
type: string
description: "User email."
steps:
- name: get-event
type: call
call: okta.get-event
with:
event_id: "{{event_id}}"
- name: suspend-sessions
type: call
call: okta.clear-sessions
with:
user_login: "{{user_login}}"
- name: create-incident
type: call
call: servicenow.create-incident
with:
category: security
urgency: 1
short_description: "Suspicious login: {{user_login}} from {{get-event.client_ip}}"
- name: alert
type: call
call: slack.post-message
with:
channel: "soc-alerts"
text: "Suspicious login: {{user_login}} from {{get-event.client_ip}}. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_token"
resources:
- name: events
path: "/logs?filter=uuid+eq+\"{{event_id}}\""
inputParameters:
- name: event_id
in: query
operations:
- name: get-event
method: GET
- name: sessions
path: "/users/{{user_login}}/sessions"
inputParameters:
- name: user_login
in: path
operations:
- name: clear-sessions
method: DELETE
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves Okta users with privileged group assignments for a quarterly access review and uploads the report to SharePoint.
naftiko: "0.5"
info:
label: "Okta User Access Review"
description: "Retrieves Okta users with privileged group assignments for a quarterly access review and uploads the report to SharePoint."
tags:
- identity
- security
- okta
- sharepoint
- access-management
capability:
exposes:
- type: mcp
namespace: identity-ops
port: 8080
tools:
- name: run-access-review
description: "Given an Okta group ID and SharePoint site ID, retrieve all active group members and upload the access review report to SharePoint."
inputParameters:
- name: group_id
in: body
type: string
description: "The Okta group ID to review for privileged access."
- name: sharepoint_site_id
in: body
type: string
description: "The SharePoint site ID where the report should be uploaded."
steps:
- name: get-group-members
type: call
call: "okta.get-group-members"
with:
groupId: "{{group_id}}"
- name: upload-report
type: call
call: "sharepoint.create-file"
with:
siteId: "{{sharepoint_site_id}}"
fileName: "access-review-{{group_id}}.json"
content: "{{get-group-members.members}}"
consumes:
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: group-members
path: "/groups/{{groupId}}/users"
inputParameters:
- name: groupId
in: path
operations:
- name: get-group-members
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/sites/{{siteId}}/drive/root/children"
inputParameters:
- name: siteId
in: path
operations:
- name: create-file
method: POST
Looks up an Okta user by email and returns profile and status.
naftiko: "0.5"
info:
label: "Okta User Profile Lookup"
description: "Looks up an Okta user by email and returns profile and status."
tags:
- security
- okta
- identity
capability:
exposes:
- type: mcp
namespace: identity
port: 8080
tools:
- name: get-user-profile
description: "Given an Okta login email, return user profile."
inputParameters:
- name: user_login
in: body
type: string
description: "User login email."
call: okta.get-user
with:
user_login: "{{user_login}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_token"
resources:
- name: users
path: "/users/{{user_login}}"
inputParameters:
- name: user_login
in: path
operations:
- name: get-user
method: GET
Retrieves current on-call engineer for a PagerDuty schedule.
naftiko: "0.5"
info:
label: "PagerDuty On-Call Lookup"
description: "Retrieves current on-call engineer for a PagerDuty schedule."
tags:
- operations
- pagerduty
- on-call
capability:
exposes:
- type: mcp
namespace: operations
port: 8080
tools:
- name: get-oncall
description: "Given a schedule ID, return on-call user."
inputParameters:
- name: schedule_id
in: body
type: string
description: "Schedule ID."
call: pagerduty.get-oncall
with:
schedule_id: "{{schedule_id}}"
outputParameters:
- name: user_name
type: string
mapping: "$.schedule.final_schedule.rendered_schedule_entries[0].user.summary"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: schedules
path: "/schedules/{{schedule_id}}"
inputParameters:
- name: schedule_id
in: path
operations:
- name: get-oncall
method: GET
Checks Power BI dataset refresh status.
naftiko: "0.5"
info:
label: "Power BI Dataset Refresh Status"
description: "Checks Power BI dataset refresh status."
tags:
- analytics
- power-bi
- reporting
capability:
exposes:
- type: mcp
namespace: analytics
port: 8080
tools:
- name: get-refresh-status
description: "Given a dataset ID, return refresh status."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Dataset GUID."
call: power-bi.get-refresh
with:
dataset_id: "{{dataset_id}}"
outputParameters:
- name: status
type: string
mapping: "$.value[0].status"
consumes:
- type: http
namespace: power-bi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/refreshes?$top=1"
inputParameters:
- name: dataset_id
in: path
operations:
- name: get-refresh
method: GET
Triggers a Power BI dataset refresh for the retail sales dashboard and notifies the analytics team in Teams when complete.
naftiko: "0.5"
info:
label: "Power BI Retail Sales Dashboard Refresh"
description: "Triggers a Power BI dataset refresh for the retail sales dashboard and notifies the analytics team in Teams when complete."
tags:
- data
- analytics
- power-bi
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: bi-reporting
port: 8080
tools:
- name: trigger-sales-dashboard-refresh
description: "Given a Power BI workspace ID and dataset ID, trigger a dataset refresh for the retail sales dashboard and notify the analytics team in Teams."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Power BI workspace (group) ID."
- name: dataset_id
in: body
type: string
description: "The Power BI dataset ID to refresh."
steps:
- name: trigger-refresh
type: call
call: "powerbi.refresh-dataset"
with:
workspaceId: "{{workspace_id}}"
datasetId: "{{dataset_id}}"
- name: notify-analytics
type: call
call: "msteams.post-channel-message"
with:
channelId: "analytics-team"
message: "Power BI retail sales dataset {{dataset_id}} refresh triggered in workspace {{workspace_id}}."
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/groups/{{workspaceId}}/datasets/{{datasetId}}/refreshes"
inputParameters:
- name: workspaceId
in: path
- name: datasetId
in: path
operations:
- name: refresh-dataset
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
Triggers a Power BI dataset refresh for warehouse operational KPI dashboards.
naftiko: "0.5"
info:
label: "Power BI Warehouse KPI Refresh"
description: "Triggers a Power BI dataset refresh for warehouse operational KPI dashboards."
tags:
- analytics
- power-bi
- warehouse-operations
capability:
exposes:
- type: mcp
namespace: warehouse-kpi
port: 8080
tools:
- name: refresh-kpi-dashboard
description: "Trigger a Power BI refresh for warehouse KPIs."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Power BI dataset ID."
call: "powerbi.refresh-dataset"
with:
group_id: "$secrets.powerbi_workspace_id"
dataset_id: "{{dataset_id}}"
outputParameters:
- name: request_id
type: string
mapping: "$.requestId"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: group_id
in: path
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
Creates a product master in SAP, sets up a Salesforce marketing campaign, stores product data in Snowflake, and announces via Slack.
naftiko: "0.5"
info:
label: "Private Label Product Launch Pipeline"
description: "Creates a product master in SAP, sets up a Salesforce marketing campaign, stores product data in Snowflake, and announces via Slack."
tags:
- product-launch
- sap
- salesforce
- snowflake
- slack
capability:
exposes:
- type: mcp
namespace: product-launch
port: 8080
tools:
- name: launch-product
description: "Orchestrate Kirkland Signature product launch setup."
inputParameters:
- name: product_name
in: body
type: string
description: "Product name."
- name: category
in: body
type: string
description: "Product category."
- name: launch_date
in: body
type: string
description: "Planned launch date."
steps:
- name: create-material
type: call
call: "sap.create-material-master"
with:
description: "{{product_name}}"
material_group: "{{category}}"
brand: "Kirkland Signature"
- name: create-campaign
type: call
call: "salesforce.create-campaign"
with:
name: "Launch: {{product_name}}"
start_date: "{{launch_date}}"
type: "Product Launch"
- name: store-product-data
type: call
call: "snowflake.execute-statement"
with:
statement: "INSERT INTO PRODUCT.LAUNCHES (product_name, category, launch_date, sap_material, sf_campaign) VALUES ('{{product_name}}', '{{category}}', '{{launch_date}}', '{{create-material.material_number}}', '{{create-campaign.id}}')"
- name: announce-launch
type: call
call: "slack.post-message"
with:
channel: "merchandising"
text: "New Kirkland product launch: {{product_name}} ({{category}}). Launch date: {{launch_date}}. SAP: {{create-material.material_number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Material"
operations:
- name: create-material-master
method: POST
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: campaigns
path: "/sobjects/Campaign"
operations:
- name: create-campaign
method: POST
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a recall is initiated, queries SAP for affected warehouses, creates Salesforce case, and broadcasts to warehouse managers via Teams.
naftiko: "0.5"
info:
label: "Product Recall Notification Orchestrator"
description: "When a recall is initiated, queries SAP for affected warehouses, creates Salesforce case, and broadcasts to warehouse managers via Teams."
tags:
- compliance
- sap
- salesforce
- microsoft-teams
- product-safety
capability:
exposes:
- type: mcp
namespace: product-safety
port: 8080
tools:
- name: process-recall
description: "Given material number and recall reason, find affected warehouses and notify."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number."
- name: recall_reason
in: body
type: string
description: "Recall reason."
steps:
- name: get-affected
type: call
call: sap.get-stock-by-plant
with:
material_number: "{{material_number}}"
- name: create-case
type: call
call: salesforce.create-case
with:
subject: "Recall: {{material_number}}"
description: "{{recall_reason}}. Warehouses: {{get-affected.plant_count}}."
priority: Critical
- name: notify
type: call
call: msteams.send-channel-message
with:
team_id: warehouse-managers
channel: recalls
text: "RECALL: {{material_number}}. {{recall_reason}}. {{get-affected.plant_count}} warehouses. Case: {{create-case.case_number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/A_MatlStkInAcctMod?$filter=Material eq '{{material_number}}'"
inputParameters:
- name: material_number
in: query
operations:
- name: get-stock-by-plant
method: GET
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
Queries Snowflake for compliance metrics, creates SharePoint report, and notifies compliance team via Teams.
naftiko: "0.5"
info:
label: "Quarterly Compliance Audit Report"
description: "Queries Snowflake for compliance metrics, creates SharePoint report, and notifies compliance team via Teams."
tags:
- compliance
- snowflake
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: compliance
port: 8080
tools:
- name: generate-report
description: "Given quarter and year, query metrics and notify."
inputParameters:
- name: fiscal_quarter
in: body
type: string
description: "Quarter."
- name: fiscal_year
in: body
type: string
description: "Year."
steps:
- name: query
type: call
call: snowflake.execute-statement
with:
statement: "SELECT control_area, pass_count, fail_count FROM COMPLIANCE.QUARTERLY_METRICS WHERE fiscal_quarter = '{{fiscal_quarter}}' AND fiscal_year = '{{fiscal_year}}'"
- name: create-report
type: call
call: sharepoint.create-document
with:
name: "Compliance-{{fiscal_quarter}}-{{fiscal_year}}.xlsx"
data: "{{query.results}}"
- name: notify
type: call
call: msteams.send-channel-message
with:
team_id: compliance-team
channel: general
text: "Compliance report for {{fiscal_quarter}} {{fiscal_year}}: {{create-report.web_url}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: documents
path: "/sites/costco.sharepoint.com/drive/root:/{{name}}:/content"
inputParameters:
- name: name
in: path
operations:
- name: create-document
method: PUT
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
When a high-priority Salesforce member service case is escalated, creates a ServiceNow P2 ticket and notifies the member services team in Teams.
naftiko: "0.5"
info:
label: "Salesforce Case Escalation to ServiceNow"
description: "When a high-priority Salesforce member service case is escalated, creates a ServiceNow P2 ticket and notifies the member services team in Teams."
tags:
- customer-support
- crm
- salesforce
- servicenow
- microsoft-teams
- escalation
capability:
exposes:
- type: mcp
namespace: support-ops
port: 8080
tools:
- name: handle-case-escalation
description: "Given a Salesforce case ID, retrieve case details and create a linked ServiceNow ticket, then notify the member services team in Teams."
inputParameters:
- name: case_id
in: body
type: string
description: "The Salesforce case record ID."
steps:
- name: get-case
type: call
call: "salesforce.get-case"
with:
caseId: "{{case_id}}"
- name: create-snow-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Escalated case: {{get-case.Subject}}"
description: "Salesforce Case: {{case_id}}\nMember: {{get-case.AccountName}}\nDetails: {{get-case.Description}}"
urgency: "2"
- name: notify-support-team
type: call
call: "msteams.post-channel-message"
with:
channelId: "member-services"
message: "Case escalated: {{get-case.Subject}} | Member: {{get-case.AccountName}} | ServiceNow: {{create-snow-ticket.number}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{caseId}}"
inputParameters:
- name: caseId
in: path
operations:
- name: get-case
method: GET
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
Retrieves Costco Wholesale member account details from Salesforce given a member number, returning membership tier, status, and open cases.
naftiko: "0.5"
info:
label: "Salesforce Member Account Lookup"
description: "Retrieves Costco Wholesale member account details from Salesforce given a member number, returning membership tier, status, and open cases."
tags:
- crm
- member-management
- salesforce
capability:
exposes:
- type: mcp
namespace: member-ops
port: 8080
tools:
- name: get-member-account
description: "Given a Costco member number, retrieve the member account details including membership tier, status, and open service cases from Salesforce."
inputParameters:
- name: member_number
in: body
type: string
description: "The Costco member number."
call: "salesforce.get-account"
with:
memberNumber: "{{member_number}}"
outputParameters:
- name: account_id
type: string
mapping: "$.records[0].Id"
- name: member_name
type: string
mapping: "$.records[0].Name"
- name: membership_tier
type: string
mapping: "$.records[0].MembershipTier__c"
- name: status
type: string
mapping: "$.records[0].Status__c"
consumes:
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/query"
inputParameters:
- name: memberNumber
in: query
operations:
- name: get-account
method: GET
When a Salesforce B2B opportunity is marked Closed Won, creates a matching SAP S/4HANA sales order and notifies the account team in Teams.
naftiko: "0.5"
info:
label: "Salesforce Opportunity to SAP Sales Order Sync"
description: "When a Salesforce B2B opportunity is marked Closed Won, creates a matching SAP S/4HANA sales order and notifies the account team in Teams."
tags:
- crm
- sales
- salesforce
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: crm-opportunity
port: 8080
tools:
- name: sync-closed-opportunity
description: "Given a Salesforce opportunity ID that closed Won, create an SAP S/4HANA sales order and notify the account team in Teams."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity record ID."
steps:
- name: get-opportunity
type: call
call: "salesforce.get-opportunity"
with:
opportunity_id: "{{opportunity_id}}"
- name: create-sales-order
type: call
call: "sap-sd.create-sales-order"
with:
customerName: "{{get-opportunity.AccountName}}"
amount: "{{get-opportunity.Amount}}"
currency: "{{get-opportunity.CurrencyIsoCode}}"
- name: notify-team
type: call
call: "msteams.post-channel-message"
with:
channelId: "sales-team"
message: "Opportunity {{get-opportunity.Name}} Closed Won. SAP Sales Order {{create-sales-order.salesOrderId}} created."
consumes:
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunity_id}}"
inputParameters:
- name: opportunity_id
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: sap-sd
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales-orders
path: "/A_SalesOrder"
operations:
- name: create-sales-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
Retrieves vendor account details and contract status from Salesforce.
naftiko: "0.5"
info:
label: "Salesforce Vendor Account Lookup"
description: "Retrieves vendor account details and contract status from Salesforce."
tags:
- vendor-management
- salesforce
- procurement
capability:
exposes:
- type: mcp
namespace: vendor-account
port: 8080
tools:
- name: get-vendor-account
description: "Look up vendor account details in Salesforce."
inputParameters:
- name: vendor_name
in: body
type: string
description: "Vendor name."
call: "salesforce.query-account"
with:
query: "SELECT Id, Name, Type, Contract_Status__c, Annual_Revenue__c FROM Account WHERE Name = '{{vendor_name}}' AND Type = 'Vendor'"
outputParameters:
- name: account
type: object
mapping: "$.records[0]"
consumes:
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: queries
path: "/query"
operations:
- name: query-account
method: GET
Checks contract compliance in SAP Ariba, compares spend in Snowflake, creates a Jira compliance ticket, and notifies procurement via Slack.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Compliance Pipeline"
description: "Checks contract compliance in SAP Ariba, compares spend in Snowflake, creates a Jira compliance ticket, and notifies procurement via Slack."
tags:
- compliance
- sap-ariba
- snowflake
- jira
- slack
capability:
exposes:
- type: mcp
namespace: contract-compliance
port: 8080
tools:
- name: check-compliance
description: "Audit vendor contract compliance against actual spend."
inputParameters:
- name: vendor_id
in: body
type: string
description: "Vendor ID."
- name: contract_id
in: body
type: string
description: "Contract ID."
steps:
- name: get-contract
type: call
call: "ariba.get-contract"
with:
contract_id: "{{contract_id}}"
- name: get-spend
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT SUM(amount) as total_spend, COUNT(*) as po_count FROM PROCUREMENT.VENDOR_SPEND WHERE vendor_id = '{{vendor_id}}' AND contract_id = '{{contract_id}}'"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project: "PROC"
summary: "Contract compliance: {{vendor_id}} - {{contract_id}}"
description: "Contract value: {{get-contract.total_value}}. Actual spend: {{get-spend.results[0].total_spend}}. PO count: {{get-spend.results[0].po_count}}."
issuetype: "Task"
- name: notify-procurement
type: call
call: "slack.post-message"
with:
channel: "procurement-compliance"
text: "Contract compliance review: Vendor {{vendor_id}}. Spend: {{get-spend.results[0].total_spend}} vs contract: {{get-contract.total_value}}. Jira: {{create-ticket.key}}."
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/contract-compliance/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: contracts
path: "/contracts/{{contract_id}}"
inputParameters:
- name: contract_id
in: path
operations:
- name: get-contract
method: GET
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Registers a new supplier in SAP Ariba, creates the vendor master in SAP S/4HANA, and notifies the procurement team in Teams.
naftiko: "0.5"
info:
label: "SAP Ariba Supplier Onboarding"
description: "Registers a new supplier in SAP Ariba, creates the vendor master in SAP S/4HANA, and notifies the procurement team in Teams."
tags:
- procurement
- supplier-management
- sap-ariba
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supplier-onboarding
port: 8080
tools:
- name: onboard-supplier
description: "Given supplier name, email, and country, register in SAP Ariba, create the SAP vendor master, and notify the procurement team in Teams."
inputParameters:
- name: supplier_name
in: body
type: string
description: "Legal name of the supplier."
- name: supplier_email
in: body
type: string
description: "Primary contact email for the supplier."
- name: country_code
in: body
type: string
description: "ISO 2-letter country code."
steps:
- name: register-ariba
type: call
call: "ariba.create-supplier"
with:
name: "{{supplier_name}}"
email: "{{supplier_email}}"
country: "{{country_code}}"
- name: create-vendor-master
type: call
call: "sap-erp.create-vendor"
with:
companyName: "{{supplier_name}}"
aribaId: "{{register-ariba.supplierId}}"
country: "{{country_code}}"
- name: notify-procurement
type: call
call: "msteams.post-channel-message"
with:
channelId: "procurement-team"
message: "New supplier onboarded: {{supplier_name}} | Ariba ID: {{register-ariba.supplierId}} | SAP Vendor: {{create-vendor-master.vendorId}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: suppliers
path: "/suppliers"
operations:
- name: create-supplier
method: POST
- type: http
namespace: sap-erp
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: vendors
path: "/A_BusinessPartner"
operations:
- name: create-vendor
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
When an expense report is submitted in SAP Concur, retrieves the details and routes the approval request to the manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Approval"
description: "When an expense report is submitted in SAP Concur, retrieves the details and routes the approval request to the manager via Microsoft Teams."
tags:
- finance
- expense-management
- sap-concur
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: expense-approval
port: 8080
tools:
- name: approve-expense-report
description: "Given an SAP Concur expense report ID and manager email, retrieve report details and send an approval request to the manager in Teams."
inputParameters:
- name: report_id
in: body
type: string
description: "The SAP Concur expense report ID."
- name: manager_email
in: body
type: string
description: "The Microsoft Teams UPN of the approving manager."
steps:
- name: get-report
type: call
call: "concur.get-expense-report"
with:
reportId: "{{report_id}}"
- name: send-approval
type: call
call: "msteams.post-message"
with:
recipient: "{{manager_email}}"
message: "Expense approval needed: Report {{report_id}} for {{get-report.Total}} {{get-report.CurrencyCode}} by {{get-report.OwnerName}}."
consumes:
- type: http
namespace: concur
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/expense/reports/{{reportId}}"
inputParameters:
- name: reportId
in: path
operations:
- name: get-expense-report
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/chats/messages"
operations:
- name: post-message
method: POST
Detects travel policy violations in SAP Concur, creates a Workday notification, logs in Jira, and alerts the manager via Slack.
naftiko: "0.5"
info:
label: "SAP Concur Travel Policy Violation Pipeline"
description: "Detects travel policy violations in SAP Concur, creates a Workday notification, logs in Jira, and alerts the manager via Slack."
tags:
- travel
- sap-concur
- workday
- jira
- slack
capability:
exposes:
- type: mcp
namespace: travel-violations
port: 8080
tools:
- name: handle-violation
description: "Process travel policy violations."
inputParameters:
- name: report_id
in: body
type: string
description: "Concur expense report ID."
steps:
- name: get-report
type: call
call: "concur.get-expense-report"
with:
report_id: "{{report_id}}"
- name: get-employee
type: call
call: "workday.get-worker"
with:
employee_id: "{{get-report.employee_id}}"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project: "TRAVEL"
summary: "Policy violation: Report {{report_id}}"
description: "Employee: {{get-employee.name}}. Amount: {{get-report.total}}. Violation: {{get-report.violation_type}}."
issuetype: "Task"
- name: notify-manager
type: call
call: "slack.post-message"
with:
channel: "{{get-employee.manager_slack}}"
text: "Travel policy violation by {{get-employee.name}}: {{get-report.violation_type}}. Amount: {{get-report.total}}. Jira: {{create-ticket.key}}."
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: reports
path: "/expense/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-expense-report
method: GET
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
authentication:
type: basic
username: "$secrets.workday_user"
password: "$secrets.workday_password"
resources:
- name: workers
path: "/Human_Resources/Worker/{{employee_id}}"
inputParameters:
- name: employee_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a SAP delivery is delayed, creates ServiceNow incident and notifies logistics via Slack.
naftiko: "0.5"
info:
label: "SAP Delivery Delay Escalation"
description: "When a SAP delivery is delayed, creates ServiceNow incident and notifies logistics via Slack."
tags:
- logistics
- sap
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: logistics
port: 8080
tools:
- name: escalate-delay
description: "Given a delivery number, check delay, create incident, and alert."
inputParameters:
- name: delivery_number
in: body
type: string
description: "SAP delivery number."
steps:
- name: get-delivery
type: call
call: sap.get-delivery
with:
delivery_number: "{{delivery_number}}"
- name: create-incident
type: call
call: servicenow.create-incident
with:
category: logistics
urgency: 2
short_description: "Delivery delay: {{delivery_number}} — {{get-delivery.delay_days}} days"
- name: notify
type: call
call: slack.post-message
with:
channel: "logistics-ops"
text: "Delivery {{delivery_number}} delayed {{get-delivery.delay_days}} days. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_OUTBOUND_DELIVERY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: deliveries
path: "/A_OutbDeliveryHeader('{{delivery_number}}')"
inputParameters:
- name: delivery_number
in: path
operations:
- name: get-delivery
method: GET
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
At month end, retrieves the SAP S/4HANA period close status for all company codes and posts the consolidated checklist to the finance Teams channel.
naftiko: "0.5"
info:
label: "SAP Finance Period Close Status Check"
description: "At month end, retrieves the SAP S/4HANA period close status for all company codes and posts the consolidated checklist to the finance Teams channel."
tags:
- finance
- erp
- sap
- microsoft-teams
- period-close
capability:
exposes:
- type: mcp
namespace: finance-close
port: 8080
tools:
- name: check-period-close-status
description: "Given a fiscal year and period, retrieve the SAP period close status for all Costco company codes and post the status to the finance Teams channel."
inputParameters:
- name: fiscal_year
in: body
type: string
description: "The fiscal year, e.g. 2025."
- name: fiscal_period
in: body
type: string
description: "The fiscal period number, e.g. 03 for March."
steps:
- name: get-close-status
type: call
call: "sap-finance.get-period-status"
with:
fiscalYear: "{{fiscal_year}}"
fiscalPeriod: "{{fiscal_period}}"
- name: post-status
type: call
call: "msteams.post-channel-message"
with:
channelId: "finance-team"
message: "Period close FY{{fiscal_year}} P{{fiscal_period}}: Open items={{get-close-status.openItems}}, Blocked postings={{get-close-status.blockedPostings}}"
consumes:
- type: http
namespace: sap-finance
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_FIGL_PERIOD_LOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: period-status
path: "/A_AccountingPeriodLock"
inputParameters:
- name: fiscalYear
in: query
- name: fiscalPeriod
in: query
operations:
- name: get-period-status
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
Queries SAP for period-close status, aggregates in Snowflake, and posts readiness to finance Teams channel.
naftiko: "0.5"
info:
label: "SAP Financial Close Readiness"
description: "Queries SAP for period-close status, aggregates in Snowflake, and posts readiness to finance Teams channel."
tags:
- finance
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: check-close-readiness
description: "Given fiscal period, query close tasks and post readiness."
inputParameters:
- name: fiscal_period
in: body
type: string
description: "Fiscal period."
- name: company_code
in: body
type: string
description: "Company code."
steps:
- name: get-tasks
type: call
call: sap.get-close-tasks
with:
fiscal_period: "{{fiscal_period}}"
company_code: "{{company_code}}"
- name: aggregate
type: call
call: snowflake.execute-statement
with:
statement: "SELECT task_category, COUNT(*) as total, SUM(CASE WHEN status='COMPLETE' THEN 1 ELSE 0 END) as done FROM FINANCE.CLOSE_TASKS WHERE fiscal_period = '{{fiscal_period}}' GROUP BY task_category"
- name: post
type: call
call: msteams.send-channel-message
with:
team_id: finance-team
channel: period-close
text: "Close readiness for {{fiscal_period}}: {{aggregate.results}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_FINANCIALPERIODCLOSE"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: close-tasks
path: "/A_FinPeriodCloseTask"
operations:
- name: get-close-tasks
method: GET
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
Compares SAP goods receipt with purchase order quantities, creates a Jira issue for variances, and notifies the receiving team via Slack.
naftiko: "0.5"
info:
label: "SAP Goods Receipt Discrepancy Pipeline"
description: "Compares SAP goods receipt with purchase order quantities, creates a Jira issue for variances, and notifies the receiving team via Slack."
tags:
- receiving
- sap
- jira
- slack
capability:
exposes:
- type: mcp
namespace: goods-receipt-discrepancy
port: 8080
tools:
- name: check-receipt
description: "Validate goods receipt against purchase order."
inputParameters:
- name: po_number
in: body
type: string
description: "SAP purchase order number."
- name: warehouse_id
in: body
type: string
description: "Receiving warehouse."
steps:
- name: get-po-details
type: call
call: "sap.get-purchase-order"
with:
po_number: "{{po_number}}"
- name: get-receipt
type: call
call: "sap.get-goods-receipt"
with:
po_number: "{{po_number}}"
- name: create-issue
type: call
call: "jira.create-issue"
with:
project: "WHSE"
summary: "Goods receipt discrepancy: PO {{po_number}}"
description: "PO items: {{get-po-details.item_count}}. Received items: {{get-receipt.item_count}}."
issuetype: "Bug"
- name: notify-receiving
type: call
call: "slack.post-message"
with:
channel: "warehouse-{{warehouse_id}}-receiving"
text: "Receipt discrepancy for PO {{po_number}}. Jira: {{create-issue.key}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-purchase-order
method: GET
- name: goods-receipts
path: "/A_PurchaseOrder('{{po_number}}')/to_GoodsReceipt"
inputParameters:
- name: po_number
in: path
operations:
- name: get-goods-receipt
method: GET
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a goods receipt is posted in SAP, updates Snowflake inventory and notifies the warehouse Slack channel.
naftiko: "0.5"
info:
label: "SAP Goods Receipt to Inventory Update"
description: "When a goods receipt is posted in SAP, updates Snowflake inventory and notifies the warehouse Slack channel."
tags:
- supply-chain
- sap
- snowflake
- slack
- inventory
capability:
exposes:
- type: mcp
namespace: warehouse-ops
port: 8080
tools:
- name: process-goods-receipt
description: "Given a SAP goods receipt number, update Snowflake and notify warehouse."
inputParameters:
- name: gr_document
in: body
type: string
description: "SAP goods receipt number."
- name: warehouse_id
in: body
type: string
description: "Warehouse ID."
steps:
- name: get-receipt
type: call
call: sap.get-goods-receipt
with:
gr_document: "{{gr_document}}"
- name: update-inventory
type: call
call: snowflake.execute-statement
with:
statement: "UPDATE SUPPLY_CHAIN.INVENTORY SET on_hand_qty = on_hand_qty + {{get-receipt.quantity}} WHERE sku = '{{get-receipt.material}}' AND warehouse_id = '{{warehouse_id}}'"
- name: notify
type: call
call: slack.post-message
with:
channel: "warehouse-{{warehouse_id}}"
text: "Goods receipt {{gr_document}}: {{get-receipt.quantity}} units of {{get-receipt.material}} at warehouse {{warehouse_id}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: material-documents
path: "/A_MaterialDocumentHeader('{{gr_document}}')"
inputParameters:
- name: gr_document
in: path
operations:
- name: get-goods-receipt
method: GET
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves current inventory stock levels from SAP S/4HANA for a given product and warehouse, for use in replenishment planning and buyer reporting.
naftiko: "0.5"
info:
label: "SAP Inventory Stock Overview"
description: "Retrieves current inventory stock levels from SAP S/4HANA for a given product and warehouse, for use in replenishment planning and buyer reporting."
tags:
- supply-chain
- inventory
- sap
- reporting
capability:
exposes:
- type: mcp
namespace: inventory-ops
port: 8080
tools:
- name: get-stock-overview
description: "Given a SAP material number and plant code, retrieve on-hand stock quantity, unit of measure, and warehouse location. Use for replenishment planning and buyer review."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number for the product."
- name: plant_code
in: body
type: string
description: "The SAP plant (warehouse/location) code."
call: "sap-inventory.get-stock"
with:
materialNumber: "{{material_number}}"
plantCode: "{{plant_code}}"
outputParameters:
- name: unrestricted_stock
type: number
mapping: "$.d.MatlStkInAcctMod.UnrestrictedWarehousingQuantity"
- name: unit_of_measure
type: string
mapping: "$.d.MatlStkInAcctMod.BaseUnit"
- name: storage_location
type: string
mapping: "$.d.MatlStkInAcctMod.StorageLocation"
consumes:
- type: http
namespace: sap-inventory
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/A_MatlStkInAcctMod(Material='{{materialNumber}}',Plant='{{plantCode}}')"
inputParameters:
- name: materialNumber
in: path
- name: plantCode
in: path
operations:
- name: get-stock
method: GET
Retrieves material master data from SAP for a given material number including description, category, and stock levels.
naftiko: "0.5"
info:
label: "SAP Material Master Lookup"
description: "Retrieves material master data from SAP for a given material number including description, category, and stock levels."
tags:
- inventory
- sap
- material-management
capability:
exposes:
- type: mcp
namespace: material-master
port: 8080
tools:
- name: get-material
description: "Look up material master record by material number."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number."
call: "sap.get-material"
with:
material_number: "{{material_number}}"
outputParameters:
- name: description
type: string
mapping: "$.d.MaterialDescription"
- name: category
type: string
mapping: "$.d.MaterialGroup"
- name: stock_quantity
type: number
mapping: "$.d.UnrestrictedStock"
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Material('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material
method: GET
Looks up an SAP S/4HANA purchase order by number and returns structured header status, vendor name, and total value for procurement review.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Looks up an SAP S/4HANA purchase order by number and returns structured header status, vendor name, and total value for procurement review."
tags:
- procurement
- finance
- sap
- erp
capability:
exposes:
- type: mcp
namespace: procurement
port: 8080
tools:
- name: get-purchase-order
description: "Given a PO number, retrieve the SAP purchase order status, vendor name, total value, and line items. Use for procurement approvals and spend visibility."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number, e.g. 4500012345."
call: "sap-erp.get-po"
with:
po_number: "{{po_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OverallStatus"
- name: vendor
type: string
mapping: "$.d.Supplier.CompanyName"
- name: total_value
type: string
mapping: "$.d.TotalAmount"
- name: currency
type: string
mapping: "$.d.TransactionCurrency"
consumes:
- type: http
namespace: sap-erp
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
Retrieves pricing rules from Snowflake, updates SAP pricing conditions, refreshes Power BI pricing dashboard, and notifies merchandising via Slack.
naftiko: "0.5"
info:
label: "Seasonal Pricing Update Pipeline"
description: "Retrieves pricing rules from Snowflake, updates SAP pricing conditions, refreshes Power BI pricing dashboard, and notifies merchandising via Slack."
tags:
- pricing
- snowflake
- sap
- power-bi
- slack
capability:
exposes:
- type: mcp
namespace: seasonal-pricing
port: 8080
tools:
- name: update-pricing
description: "Orchestrate seasonal pricing updates across systems."
inputParameters:
- name: season
in: body
type: string
description: "Season identifier."
- name: category
in: body
type: string
description: "Product category."
steps:
- name: get-pricing-rules
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT sku, current_price, new_price, discount_pct FROM PRICING.SEASONAL_RULES WHERE season = '{{season}}' AND category = '{{category}}'"
- name: update-sap
type: call
call: "sap.update-pricing-conditions"
with:
season: "{{season}}"
items: "{{get-pricing-rules.results}}"
- name: refresh-dashboard
type: call
call: "powerbi.refresh-dataset"
with:
group_id: "$secrets.powerbi_workspace_id"
dataset_id: "$secrets.pricing_dataset_id"
- name: notify-merchandising
type: call
call: "slack.post-message"
with:
channel: "merchandising"
text: "Seasonal pricing updated: {{season}} / {{category}}. {{get-pricing-rules.row_count}} SKUs updated. Dashboard refreshing."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/SD_PRICING_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: pricing
path: "/A_PricingCondition"
operations:
- name: update-pricing-conditions
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: group_id
in: path
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Queries Snowflake for seasonal demand, creates Workday requisitions, and notifies HR via Teams.
naftiko: "0.5"
info:
label: "Seasonal Workforce Planning"
description: "Queries Snowflake for seasonal demand, creates Workday requisitions, and notifies HR via Teams."
tags:
- hr
- workforce-planning
- snowflake
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: workforce-planning
port: 8080
tools:
- name: plan-seasonal-hiring
description: "Given region and season, query demand and create requisitions."
inputParameters:
- name: region
in: body
type: string
description: "Region."
- name: season
in: body
type: string
description: "Season."
steps:
- name: get-forecast
type: call
call: snowflake.execute-statement
with:
statement: "SELECT warehouse_id, AVG(peak_headcount) as avg_peak FROM HR.SEASONAL_DEMAND WHERE region = '{{region}}' AND season = '{{season}}' GROUP BY warehouse_id"
- name: create-requisitions
type: call
call: workday.create-requisition
with:
region: "{{region}}"
job_profile: "Seasonal Warehouse Worker"
positions: "{{get-forecast.total_positions}}"
- name: notify
type: call
call: msteams.send-channel-message
with:
team_id: regional-hr
channel: "{{region}}"
text: "Seasonal hiring for {{region}} ({{season}}): {{get-forecast.total_positions}} positions."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: requisitions
path: "/costco/jobRequisitions"
operations:
- name: create-requisition
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
When a GitHub security advisory is detected, creates a Jira ticket and alerts security Slack channel.
naftiko: "0.5"
info:
label: "Security Vulnerability Remediation Tracker"
description: "When a GitHub security advisory is detected, creates a Jira ticket and alerts security Slack channel."
tags:
- security
- github
- jira
- slack
- vulnerability
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: track-vulnerability
description: "Given a repo and advisory ID, create ticket and alert security."
inputParameters:
- name: repo_name
in: body
type: string
description: "GitHub repository."
- name: advisory_id
in: body
type: string
description: "Advisory ID."
steps:
- name: get-advisory
type: call
call: github.get-advisory
with:
repo_name: "{{repo_name}}"
advisory_id: "{{advisory_id}}"
- name: create-ticket
type: call
call: jira.create-issue
with:
project: SEC
issue_type: Bug
summary: "{{get-advisory.severity}}: {{get-advisory.summary}} in {{repo_name}}"
- name: notify
type: call
call: slack.post-message
with:
channel: "security-alerts"
text: "{{get-advisory.severity}} in {{repo_name}}: {{get-advisory.summary}}. Jira: {{create-ticket.key}}."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: advisories
path: "/repos/{{repo_name}}/security-advisories/{{advisory_id}}"
inputParameters:
- name: repo_name
in: path
- name: advisory_id
in: path
operations:
- name: get-advisory
method: GET
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves IT asset details from the ServiceNow CMDB for a specified warehouse location.
naftiko: "0.5"
info:
label: "ServiceNow Asset Inventory Lookup"
description: "Retrieves IT asset details from the ServiceNow CMDB for a specified warehouse location."
tags:
- it-assets
- servicenow
- cmdb
capability:
exposes:
- type: mcp
namespace: asset-inventory
port: 8080
tools:
- name: get-assets
description: "Look up IT assets by warehouse location."
inputParameters:
- name: location
in: body
type: string
description: "Warehouse location name."
call: "servicenow.get-assets"
with:
location: "{{location}}"
outputParameters:
- name: assets
type: array
mapping: "$.result"
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cmdb
path: "/table/alm_hardware"
operations:
- name: get-assets
method: GET
Creates a ServiceNow standard change request for planned system maintenance, associates affected CIs, and notifies stakeholders in Teams.
naftiko: "0.5"
info:
label: "ServiceNow Change Request for System Maintenance"
description: "Creates a ServiceNow standard change request for planned system maintenance, associates affected CIs, and notifies stakeholders in Teams."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: change-management
port: 8080
tools:
- name: open-change-request
description: "Given a change description, affected CIs, and planned window, create a ServiceNow change request and notify IT operations in Teams."
inputParameters:
- name: change_description
in: body
type: string
description: "Description of the planned change."
- name: affected_ci
in: body
type: string
description: "Comma-separated list of affected configuration items."
- name: planned_start
in: body
type: string
description: "Planned change start in ISO 8601 format."
- name: planned_end
in: body
type: string
description: "Planned change end in ISO 8601 format."
steps:
- name: create-change
type: call
call: "servicenow.create-change"
with:
short_description: "{{change_description}}"
type: "standard"
start_date: "{{planned_start}}"
end_date: "{{planned_end}}"
cmdb_ci: "{{affected_ci}}"
- name: notify-it-ops
type: call
call: "msteams.post-channel-message"
with:
channelId: "it-operations"
message: "Change {{create-change.number}} scheduled: {{change_description}} | Window: {{planned_start}} to {{planned_end}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
Retrieves a ServiceNow incident by number and returns status and priority.
naftiko: "0.5"
info:
label: "ServiceNow Incident Lookup"
description: "Retrieves a ServiceNow incident by number and returns status and priority."
tags:
- itsm
- servicenow
- incident
capability:
exposes:
- type: mcp
namespace: itsm
port: 8080
tools:
- name: get-incident
description: "Given a ServiceNow incident number, return status and priority."
inputParameters:
- name: incident_number
in: body
type: string
description: "Incident number."
call: servicenow.get-incident
with:
incident_number: "{{incident_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result[0].state"
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident?sysparm_query=number={{incident_number}}"
inputParameters:
- name: incident_number
in: query
operations:
- name: get-incident
method: GET
When an incident approaches SLA breach, pages on-call and notifies ops Slack.
naftiko: "0.5"
info:
label: "ServiceNow SLA Breach Escalation"
description: "When an incident approaches SLA breach, pages on-call and notifies ops Slack."
tags:
- itsm
- servicenow
- pagerduty
- slack
- sla
capability:
exposes:
- type: mcp
namespace: sla-mgmt
port: 8080
tools:
- name: escalate-sla
description: "Given incident number, page on-call and notify ops."
inputParameters:
- name: incident_number
in: body
type: string
description: "Incident number."
steps:
- name: get-incident
type: call
call: servicenow.get-incident
with:
incident_number: "{{incident_number}}"
- name: page
type: call
call: pagerduty.create-incident
with:
service_id: "{{get-incident.assignment_group}}"
title: "SLA breach risk: {{incident_number}}"
urgency: high
- name: notify
type: call
call: slack.post-message
with:
channel: "ops-escalations"
text: "SLA breach imminent: {{incident_number}}. On-call paged."
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident?sysparm_query=number={{incident_number}}"
inputParameters:
- name: incident_number
in: query
operations:
- name: get-incident
method: GET
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Searches SharePoint for documents matching keywords.
naftiko: "0.5"
info:
label: "SharePoint Document Search"
description: "Searches SharePoint for documents matching keywords."
tags:
- knowledge
- sharepoint
- document-management
capability:
exposes:
- type: mcp
namespace: documents
port: 8080
tools:
- name: search-documents
description: "Given keywords, return matching documents."
inputParameters:
- name: search_query
in: body
type: string
description: "Search keywords."
call: sharepoint.search-docs
with:
search_query: "{{search_query}}"
outputParameters:
- name: results
type: array
mapping: "$.value"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: search
path: "/sites/costco.sharepoint.com/drive/root/search(q='{{search_query}}')"
inputParameters:
- name: search_query
in: query
operations:
- name: search-docs
method: GET
Retrieves recent messages from a Slack channel.
naftiko: "0.5"
info:
label: "Slack Channel History Lookup"
description: "Retrieves recent messages from a Slack channel."
tags:
- communication
- slack
- messaging
capability:
exposes:
- type: mcp
namespace: messaging
port: 8080
tools:
- name: get-channel-history
description: "Given a Slack channel ID, return recent messages."
inputParameters:
- name: channel_id
in: body
type: string
description: "Slack channel ID."
call: slack.get-history
with:
channel_id: "{{channel_id}}"
outputParameters:
- name: messages
type: array
mapping: "$.messages"
consumes:
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: conversations
path: "/conversations.history?channel={{channel_id}}&limit=20"
inputParameters:
- name: channel_id
in: query
operations:
- name: get-history
method: GET
When Snowflake DQ checks fail, creates a Jira ticket and posts to data-ops Slack.
naftiko: "0.5"
info:
label: "Snowflake Data Quality Alert to Jira"
description: "When Snowflake DQ checks fail, creates a Jira ticket and posts to data-ops Slack."
tags:
- data-engineering
- snowflake
- jira
- slack
- data-quality
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: handle-dq-failure
description: "Given a table and check type, create ticket and notify."
inputParameters:
- name: table_name
in: body
type: string
description: "Table name."
- name: check_type
in: body
type: string
description: "Check type."
steps:
- name: get-failures
type: call
call: snowflake.execute-statement
with:
statement: "SELECT check_name, actual_value FROM DATA_OPS.DQ_RESULTS WHERE table_name = '{{table_name}}' AND check_type = '{{check_type}}' AND status = 'FAIL' LIMIT 5"
- name: create-ticket
type: call
call: jira.create-issue
with:
project: DATA
issue_type: Bug
summary: "DQ failure: {{check_type}} on {{table_name}}"
- name: notify
type: call
call: slack.post-message
with:
channel: "data-ops-alerts"
text: "DQ {{check_type}} failed on {{table_name}}. Jira: {{create-ticket.key}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Runs data quality checks in Snowflake, creates a Jira bug for failures, posts alerts to Slack, and logs the issue in ServiceNow.
naftiko: "0.5"
info:
label: "Snowflake ETL Data Quality Pipeline"
description: "Runs data quality checks in Snowflake, creates a Jira bug for failures, posts alerts to Slack, and logs the issue in ServiceNow."
tags:
- data-quality
- snowflake
- jira
- slack
- servicenow
capability:
exposes:
- type: mcp
namespace: etl-data-quality
port: 8080
tools:
- name: check-data-quality
description: "Run data quality validation and alert on failures."
inputParameters:
- name: pipeline_name
in: body
type: string
description: "ETL pipeline name."
- name: run_id
in: body
type: string
description: "Pipeline run ID."
steps:
- name: run-checks
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT check_name, status, row_count, failure_count FROM DATA_QUALITY.VALIDATION_RESULTS WHERE pipeline_name = '{{pipeline_name}}' AND run_id = '{{run_id}}' AND status = 'FAILED'"
- name: create-bug
type: call
call: "jira.create-issue"
with:
project: "DATA"
summary: "DQ failure: {{pipeline_name}} run {{run_id}}"
description: "Failed checks: {{run-checks.row_count}}. Details: {{run-checks.results}}."
issuetype: "Bug"
- name: alert-team
type: call
call: "slack.post-message"
with:
channel: "data-engineering"
text: "Data quality failure: {{pipeline_name}} run {{run_id}}. {{run-checks.row_count}} checks failed. Jira: {{create-bug.key}}."
- name: log-incident
type: call
call: "servicenow.create-record"
with:
table: "incident"
short_description: "ETL data quality failure: {{pipeline_name}}"
description: "Run: {{run_id}}. Failed checks: {{run-checks.row_count}}. Jira: {{create-bug.key}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/{{table}}"
inputParameters:
- name: table
in: path
operations:
- name: create-record
method: POST
When a Snowflake task fails, creates Jira ticket and alerts data-ops Slack.
naftiko: "0.5"
info:
label: "Snowflake ETL Pipeline Failure Handler"
description: "When a Snowflake task fails, creates Jira ticket and alerts data-ops Slack."
tags:
- data-engineering
- snowflake
- jira
- slack
- etl
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: handle-etl-failure
description: "Given a task name, query failure details, create ticket, and notify."
inputParameters:
- name: task_name
in: body
type: string
description: "Snowflake task."
steps:
- name: get-error
type: call
call: snowflake.execute-statement
with:
statement: "SELECT error_code, error_message FROM TABLE(INFORMATION_SCHEMA.TASK_HISTORY(TASK_NAME=>'{{task_name}}', RESULT_LIMIT=>1)) WHERE state = 'FAILED'"
- name: create-ticket
type: call
call: jira.create-issue
with:
project: DATA
issue_type: Bug
summary: "ETL failure: {{task_name}}"
- name: notify
type: call
call: slack.post-message
with:
channel: "data-ops-alerts"
text: "ETL {{task_name}} failed. Jira: {{create-ticket.key}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Queries Snowflake for a member's recent purchase history including items, amounts, and warehouse locations.
naftiko: "0.5"
info:
label: "Snowflake Member Purchase History"
description: "Queries Snowflake for a member's recent purchase history including items, amounts, and warehouse locations."
tags:
- analytics
- snowflake
- membership
capability:
exposes:
- type: mcp
namespace: member-purchases
port: 8080
tools:
- name: get-purchase-history
description: "Retrieve member purchase history from Snowflake."
inputParameters:
- name: member_id
in: body
type: string
description: "Costco member ID."
- name: days_back
in: body
type: number
description: "Number of days to look back."
call: "snowflake.execute-statement"
with:
statement: "SELECT transaction_date, item_description, quantity, amount, warehouse_name FROM RETAIL.MEMBER_TRANSACTIONS WHERE member_id = '{{member_id}}' AND transaction_date >= DATEADD(day, -{{days_back}}, CURRENT_DATE()) ORDER BY transaction_date DESC"
outputParameters:
- name: transactions
type: array
mapping: "$.data"
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
Validates freshness and completeness of Costco retail sales data in Snowflake and creates ServiceNow incidents for datasets that fail quality thresholds.
naftiko: "0.5"
info:
label: "Snowflake Retail Analytics Data Quality Monitor"
description: "Validates freshness and completeness of Costco retail sales data in Snowflake and creates ServiceNow incidents for datasets that fail quality thresholds."
tags:
- data
- analytics
- snowflake
- servicenow
- data-quality
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: check-sales-data-quality
description: "Given a Snowflake retail sales table and freshness threshold, validate data completeness and recency, and open a ServiceNow incident if checks fail."
inputParameters:
- name: table_name
in: body
type: string
description: "Fully qualified Snowflake table name in DATABASE.SCHEMA.TABLE format."
- name: freshness_hours
in: body
type: integer
description: "Maximum acceptable data age in hours."
steps:
- name: get-table-metadata
type: call
call: "snowflake.get-table-info"
with:
tableName: "{{table_name}}"
- name: create-dq-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Retail data quality failure: {{table_name}}"
category: "data_pipeline"
description: "Table {{table_name}} failed freshness check. Last updated: {{get-table-metadata.last_altered}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: tables
path: "/databases/tables"
inputParameters:
- name: tableName
in: query
operations:
- name: get-table-info
method: GET
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Queries Snowflake for warehouse inventory levels by SKU.
naftiko: "0.5"
info:
label: "Snowflake Warehouse Inventory Query"
description: "Queries Snowflake for warehouse inventory levels by SKU."
tags:
- supply-chain
- snowflake
- inventory
capability:
exposes:
- type: mcp
namespace: inventory
port: 8080
tools:
- name: query-warehouse-inventory
description: "Given a SKU and warehouse ID, return on-hand quantity and days of supply."
inputParameters:
- name: sku
in: body
type: string
description: "Product SKU."
- name: warehouse_id
in: body
type: string
description: "Warehouse ID."
call: snowflake.execute-query
with:
statement: "SELECT sku, on_hand_qty, days_of_supply FROM SUPPLY_CHAIN.INVENTORY WHERE sku = '{{sku}}' AND warehouse_id = '{{warehouse_id}}'"
outputParameters:
- name: on_hand_qty
type: integer
mapping: "$.data[0][1]"
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
When a warehouse reports IT outage, creates P1 ServiceNow incident, pages on-call, and notifies ops Slack.
naftiko: "0.5"
info:
label: "Store IT Outage Response"
description: "When a warehouse reports IT outage, creates P1 ServiceNow incident, pages on-call, and notifies ops Slack."
tags:
- operations
- servicenow
- pagerduty
- slack
- retail
capability:
exposes:
- type: mcp
namespace: store-ops
port: 8080
tools:
- name: handle-outage
description: "Given warehouse number and system, create incident and page on-call."
inputParameters:
- name: warehouse_number
in: body
type: string
description: "Warehouse number."
- name: affected_system
in: body
type: string
description: "Affected system."
- name: impact
in: body
type: string
description: "Impact."
steps:
- name: create-incident
type: call
call: servicenow.create-incident
with:
category: store_systems
urgency: 1
short_description: "[P1] Warehouse {{warehouse_number}} — {{affected_system}} outage"
- name: page-oncall
type: call
call: pagerduty.create-incident
with:
service_id: warehouse-systems
title: "Warehouse {{warehouse_number}} {{affected_system}} outage"
urgency: high
- name: notify
type: call
call: slack.post-message
with:
channel: "warehouse-ops-critical"
text: "P1 at Warehouse {{warehouse_number}}: {{affected_system}}. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Checks ServiceNow IT readiness, validates SAP inventory setup, verifies Okta access provisioning, and sends readiness report via Microsoft Teams.
naftiko: "0.5"
info:
label: "Store Opening Readiness Pipeline"
description: "Checks ServiceNow IT readiness, validates SAP inventory setup, verifies Okta access provisioning, and sends readiness report via Microsoft Teams."
tags:
- store-operations
- servicenow
- sap
- okta
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: store-readiness
port: 8080
tools:
- name: check-readiness
description: "Orchestrate new store opening readiness checks."
inputParameters:
- name: store_id
in: body
type: string
description: "New store identifier."
- name: opening_date
in: body
type: string
description: "Planned opening date."
steps:
- name: check-it-readiness
type: call
call: "servicenow.get-checklist"
with:
store_id: "{{store_id}}"
category: "IT_Readiness"
- name: check-inventory
type: call
call: "sap.get-inventory-status"
with:
plant: "{{store_id}}"
- name: check-access
type: call
call: "okta.get-group-members"
with:
group_name: "store-{{store_id}}-staff"
- name: send-report
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.store_ops_channel"
text: "Store {{store_id}} readiness: IT: {{check-it-readiness.complete_pct}}%. Inventory: {{check-inventory.status}}. Staff provisioned: {{check-access.member_count}}. Opening: {{opening_date}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: checklists
path: "/table/sc_task"
operations:
- name: get-checklist
method: GET
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/MM_INV_MGMT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inventory
path: "/A_PlantInventory"
operations:
- name: get-inventory-status
method: GET
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: apiKey
key: "$secrets.okta_api_token"
resources:
- name: groups
path: "/groups/{{group_name}}/users"
inputParameters:
- name: group_name
in: path
operations:
- name: get-group-members
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a price change is approved in SAP, updates Snowflake catalog and notifies merchandising via Slack.
naftiko: "0.5"
info:
label: "Store Price Change Propagation"
description: "When a price change is approved in SAP, updates Snowflake catalog and notifies merchandising via Slack."
tags:
- merchandising
- sap
- snowflake
- slack
- pricing
capability:
exposes:
- type: mcp
namespace: merchandising
port: 8080
tools:
- name: propagate-price-change
description: "Given a material number and new price, update catalog and notify."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number."
- name: new_price
in: body
type: string
description: "New price."
- name: effective_date
in: body
type: string
description: "Effective date."
steps:
- name: get-material
type: call
call: sap.get-material
with:
material_number: "{{material_number}}"
- name: update-catalog
type: call
call: snowflake.execute-statement
with:
statement: "UPDATE RETAIL.PRODUCT_CATALOG SET retail_price = {{new_price}}, price_effective_date = '{{effective_date}}' WHERE material_number = '{{material_number}}'"
- name: notify
type: call
call: slack.post-message
with:
channel: "merchandising-pricing"
text: "Price change: {{get-material.description}} ({{material_number}}): ${{new_price}} effective {{effective_date}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: products
path: "/A_Product('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material
method: GET
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Logs a quality issue in SAP, creates a Jira investigation ticket, notifies the supplier via Salesforce case, and alerts the quality team in Slack.
naftiko: "0.5"
info:
label: "Supplier Quality Issue Pipeline"
description: "Logs a quality issue in SAP, creates a Jira investigation ticket, notifies the supplier via Salesforce case, and alerts the quality team in Slack."
tags:
- quality
- sap
- jira
- salesforce
- slack
capability:
exposes:
- type: mcp
namespace: supplier-quality
port: 8080
tools:
- name: report-quality-issue
description: "Orchestrate supplier quality issue reporting and tracking."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number."
- name: supplier_name
in: body
type: string
description: "Supplier name."
- name: defect_description
in: body
type: string
description: "Description of quality defect."
steps:
- name: log-in-sap
type: call
call: "sap.create-quality-notification"
with:
material: "{{material_number}}"
notification_type: "Q2"
description: "{{defect_description}}"
- name: create-jira
type: call
call: "jira.create-issue"
with:
project: "QUALITY"
summary: "Quality issue: {{material_number}} from {{supplier_name}}"
description: "{{defect_description}}. SAP QN: {{log-in-sap.notification_number}}."
issuetype: "Bug"
- name: create-supplier-case
type: call
call: "salesforce.create-case"
with:
subject: "Quality issue: {{material_number}}"
account_name: "{{supplier_name}}"
description: "{{defect_description}}"
- name: notify-quality
type: call
call: "slack.post-message"
with:
channel: "quality-assurance"
text: "Quality issue reported: {{material_number}} from {{supplier_name}}. SAP: {{log-in-sap.notification_number}}. Jira: {{create-jira.key}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/QM_NOTIFICATION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: notifications
path: "/A_QualityNotification"
operations:
- name: create-quality-notification
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: salesforce
baseUri: "https://costco.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When Snowflake stock forecasting detects a product approaching reorder threshold, creates a ServiceNow procurement request and notifies the buying team in Teams.
naftiko: "0.5"
info:
label: "Supply Chain Replenishment Alert"
description: "When Snowflake stock forecasting detects a product approaching reorder threshold, creates a ServiceNow procurement request and notifies the buying team in Teams."
tags:
- supply-chain
- inventory
- snowflake
- servicenow
- microsoft-teams
- replenishment
capability:
exposes:
- type: mcp
namespace: replenishment-ops
port: 8080
tools:
- name: handle-reorder-alert
description: "Given a product SKU and current stock level, query Snowflake demand forecast, create a ServiceNow procurement request, and alert the buying team in Teams."
inputParameters:
- name: sku
in: body
type: string
description: "The Costco product SKU number."
- name: current_stock
in: body
type: integer
description: "The current on-hand inventory unit count."
- name: warehouse_id
in: body
type: string
description: "The warehouse or distribution center ID."
steps:
- name: get-demand-forecast
type: call
call: "snowflake.get-demand-forecast"
with:
sku: "{{sku}}"
warehouseId: "{{warehouse_id}}"
- name: create-procurement-request
type: call
call: "servicenow.create-incident"
with:
short_description: "Reorder alert: SKU {{sku}} at {{current_stock}} units"
category: "procurement"
description: "SKU: {{sku}}\nWarehouse: {{warehouse_id}}\nCurrent stock: {{current_stock}}\nForecast demand: {{get-demand-forecast.forecastedDemand}}"
- name: notify-buying-team
type: call
call: "msteams.post-channel-message"
with:
channelId: "buying-team"
message: "Reorder alert: SKU {{sku}} has {{current_stock}} units remaining. Forecasted demand: {{get-demand-forecast.forecastedDemand}}. ServiceNow: {{create-procurement-request.number}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: demand-forecast
path: "/statements"
operations:
- name: get-demand-forecast
method: POST
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: post-channel-message
method: POST
Triggers a Terraform Cloud workspace run to provision or update Costco cloud infrastructure and creates a ServiceNow change record.
naftiko: "0.5"
info:
label: "Terraform Cloud Infrastructure Provisioning"
description: "Triggers a Terraform Cloud workspace run to provision or update Costco cloud infrastructure and creates a ServiceNow change record."
tags:
- cloud
- infrastructure
- terraform
- servicenow
- change-management
capability:
exposes:
- type: mcp
namespace: infra-provisioning
port: 8080
tools:
- name: trigger-terraform-run
description: "Given a Terraform Cloud workspace ID and change description, trigger a plan and apply run and create a ServiceNow change record."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Terraform Cloud workspace ID."
- name: change_description
in: body
type: string
description: "Description of the infrastructure change."
steps:
- name: create-run
type: call
call: "terraform.create-run"
with:
workspaceId: "{{workspace_id}}"
message: "{{change_description}}"
- name: create-change-record
type: call
call: "servicenow.create-change"
with:
short_description: "Terraform infra change: {{change_description}}"
description: "Workspace: {{workspace_id}}\nRun ID: {{create-run.runId}}"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/runs"
operations:
- name: create-run
method: POST
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change
method: POST
Retrieves the current state and last run status of a Terraform Cloud workspace.
naftiko: "0.5"
info:
label: "Terraform Cloud Workspace Status"
description: "Retrieves the current state and last run status of a Terraform Cloud workspace."
tags:
- infrastructure
- terraform
- cloud-ops
capability:
exposes:
- type: mcp
namespace: terraform-status
port: 8080
tools:
- name: get-workspace-status
description: "Look up Terraform workspace run status."
inputParameters:
- name: workspace_name
in: body
type: string
description: "Terraform workspace name."
call: "terraform.get-workspace"
with:
workspace_name: "{{workspace_name}}"
outputParameters:
- name: current_run_status
type: string
mapping: "$.data.attributes.current-run.status"
- name: resource_count
type: number
mapping: "$.data.attributes.resource-count"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: workspaces
path: "/organizations/costco/workspaces/{{workspace_name}}"
inputParameters:
- name: workspace_name
in: path
operations:
- name: get-workspace
method: GET
Detects Terraform drift, creates GitHub PR, and alerts platform engineering via Slack.
naftiko: "0.5"
info:
label: "Terraform Drift Detection Remediation"
description: "Detects Terraform drift, creates GitHub PR, and alerts platform engineering via Slack."
tags:
- infrastructure
- terraform
- github
- slack
capability:
exposes:
- type: mcp
namespace: platform-eng
port: 8080
tools:
- name: handle-drift
description: "Given workspace and drift details, create PR and notify."
inputParameters:
- name: workspace
in: body
type: string
description: "Terraform workspace."
- name: resource_address
in: body
type: string
description: "Resource with drift."
- name: drift_summary
in: body
type: string
description: "Drift summary."
steps:
- name: create-pr
type: call
call: github.create-pr
with:
repo: "costco/infrastructure"
head: "fix/drift-{{workspace}}"
base: main
title: "Fix drift: {{resource_address}}"
body: "{{drift_summary}}"
- name: notify
type: call
call: slack.post-message
with:
channel: "platform-engineering"
text: "Terraform drift in {{workspace}}: {{resource_address}}. PR: {{create-pr.html_url}}."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: pulls
path: "/repos/{{repo}}/pulls"
inputParameters:
- name: repo
in: path
operations:
- name: create-pr
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a SAP invoice has a discrepancy, creates a Jira ticket and notifies the buyer via Microsoft Teams.
naftiko: "0.5"
info:
label: "Vendor Invoice Discrepancy Handler"
description: "When a SAP invoice has a discrepancy, creates a Jira ticket and notifies the buyer via Microsoft Teams."
tags:
- procurement
- finance
- sap
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: handle-invoice-discrepancy
description: "Given an invoice number, create Jira ticket and notify buyer."
inputParameters:
- name: invoice_number
in: body
type: string
description: "SAP invoice number."
- name: buyer_email
in: body
type: string
description: "Buyer email."
steps:
- name: get-invoice
type: call
call: sap.get-invoice
with:
invoice_number: "{{invoice_number}}"
- name: create-ticket
type: call
call: jira.create-issue
with:
project: PROC
issue_type: Task
summary: "Invoice discrepancy: {{invoice_number}}"
- name: notify-buyer
type: call
call: msteams.send-message
with:
recipient_upn: "{{buyer_email}}"
text: "Invoice {{invoice_number}} discrepancy: {{get-invoice.variance_amount}}. Jira: {{create-ticket.key}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_SupplierInvoice('{{invoice_number}}')"
inputParameters:
- name: invoice_number
in: path
operations:
- name: get-invoice
method: GET
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Compares SAP accounts payable with Snowflake payment records, creates a Jira ticket for discrepancies, and notifies finance via Slack.
naftiko: "0.5"
info:
label: "Vendor Payment Reconciliation Pipeline"
description: "Compares SAP accounts payable with Snowflake payment records, creates a Jira ticket for discrepancies, and notifies finance via Slack."
tags:
- finance
- sap
- snowflake
- jira
- slack
capability:
exposes:
- type: mcp
namespace: payment-reconciliation
port: 8080
tools:
- name: reconcile-payments
description: "Compare payment records and flag discrepancies."
inputParameters:
- name: vendor_id
in: body
type: string
description: "Vendor ID."
- name: period
in: body
type: string
description: "Payment period."
steps:
- name: get-sap-payables
type: call
call: "sap.get-vendor-payables"
with:
vendor_id: "{{vendor_id}}"
period: "{{period}}"
- name: get-payment-records
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT invoice_number, amount, payment_date, status FROM FINANCE.VENDOR_PAYMENTS WHERE vendor_id = '{{vendor_id}}' AND period = '{{period}}'"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project: "FIN"
summary: "Payment reconciliation: Vendor {{vendor_id}} - {{period}}"
description: "SAP total: {{get-sap-payables.total}}. Payment records: {{get-payment-records.row_count}}."
issuetype: "Task"
- name: notify-finance
type: call
call: "slack.post-message"
with:
channel: "accounts-payable"
text: "Reconciliation for vendor {{vendor_id}} ({{period}}): Jira {{create-ticket.key}}."
consumes:
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/FI_VENDOR_LINE_ITEMS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: payables
path: "/A_VendorLineItems"
operations:
- name: get-vendor-payables
method: GET
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Pulls energy consumption data from Snowflake, compares against targets in Datadog, creates a Jira sustainability ticket, and reports to facilities via Slack.
naftiko: "0.5"
info:
label: "Warehouse Energy Monitoring Pipeline"
description: "Pulls energy consumption data from Snowflake, compares against targets in Datadog, creates a Jira sustainability ticket, and reports to facilities via Slack."
tags:
- sustainability
- snowflake
- datadog
- jira
- slack
capability:
exposes:
- type: mcp
namespace: energy-monitoring
port: 8080
tools:
- name: check-energy-usage
description: "Monitor warehouse energy consumption against sustainability targets."
inputParameters:
- name: warehouse_id
in: body
type: string
description: "Warehouse ID."
- name: month
in: body
type: string
description: "Month in YYYY-MM format."
steps:
- name: get-consumption
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT total_kwh, target_kwh, variance_pct FROM SUSTAINABILITY.ENERGY_USAGE WHERE warehouse_id = '{{warehouse_id}}' AND month = '{{month}}'"
- name: get-realtime
type: call
call: "datadog.query-metrics"
with:
query: "avg:warehouse.energy.kwh{warehouse:{{warehouse_id}}}"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project: "GREEN"
summary: "Energy review: Warehouse {{warehouse_id}} - {{month}}"
description: "Consumption: {{get-consumption.results[0].total_kwh}} kWh. Target: {{get-consumption.results[0].target_kwh}} kWh. Variance: {{get-consumption.results[0].variance_pct}}%."
issuetype: "Task"
- name: notify-facilities
type: call
call: "slack.post-message"
with:
channel: "facilities-management"
text: "Energy report: Warehouse {{warehouse_id}} ({{month}}). Variance: {{get-consumption.results[0].variance_pct}}%. Jira: {{create-ticket.key}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: metrics
path: "/query"
operations:
- name: query-metrics
method: GET
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Creates a ServiceNow work order for equipment maintenance, schedules a vendor visit in SAP, and notifies the warehouse manager via Slack.
naftiko: "0.5"
info:
label: "Warehouse Equipment Maintenance Pipeline"
description: "Creates a ServiceNow work order for equipment maintenance, schedules a vendor visit in SAP, and notifies the warehouse manager via Slack."
tags:
- maintenance
- servicenow
- sap
- slack
capability:
exposes:
- type: mcp
namespace: equipment-maintenance
port: 8080
tools:
- name: schedule-maintenance
description: "Orchestrate equipment maintenance scheduling."
inputParameters:
- name: equipment_id
in: body
type: string
description: "Equipment asset ID."
- name: warehouse_id
in: body
type: string
description: "Warehouse ID."
- name: issue_description
in: body
type: string
description: "Maintenance issue description."
steps:
- name: create-work-order
type: call
call: "servicenow.create-record"
with:
table: "wm_order"
short_description: "Maintenance: {{equipment_id}} at Warehouse {{warehouse_id}}"
description: "{{issue_description}}"
- name: schedule-vendor
type: call
call: "sap.create-maintenance-order"
with:
equipment: "{{equipment_id}}"
plant: "{{warehouse_id}}"
description: "{{issue_description}}"
- name: notify-manager
type: call
call: "slack.post-message"
with:
channel: "warehouse-{{warehouse_id}}-ops"
text: "Equipment maintenance scheduled: {{equipment_id}}. Work order: {{create-work-order.number}}. SAP order: {{schedule-vendor.order_number}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/{{table}}"
inputParameters:
- name: table
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/PM_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: maintenance-orders
path: "/A_MaintenanceOrder"
operations:
- name: create-maintenance-order
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Queries Snowflake for inventory discrepancies, creates a recount task in Jira, notifies warehouse managers via Slack, and updates SAP inventory records.
naftiko: "0.5"
info:
label: "Warehouse Inventory Recount Pipeline"
description: "Queries Snowflake for inventory discrepancies, creates a recount task in Jira, notifies warehouse managers via Slack, and updates SAP inventory records."
tags:
- inventory
- snowflake
- jira
- slack
- sap
capability:
exposes:
- type: mcp
namespace: inventory-recount
port: 8080
tools:
- name: trigger-recount
description: "Orchestrate inventory recount for discrepant items."
inputParameters:
- name: warehouse_id
in: body
type: string
description: "Warehouse ID."
- name: threshold_pct
in: body
type: number
description: "Discrepancy threshold percentage."
steps:
- name: find-discrepancies
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT sku, system_qty, physical_qty, ABS(system_qty - physical_qty)/system_qty*100 as variance_pct FROM INVENTORY.CYCLE_COUNT WHERE warehouse_id = '{{warehouse_id}}' AND variance_pct > {{threshold_pct}}"
- name: create-task
type: call
call: "jira.create-issue"
with:
project: "WHSE"
summary: "Inventory recount: Warehouse {{warehouse_id}} - {{find-discrepancies.row_count}} items"
description: "Items exceeding {{threshold_pct}}% variance require recount."
issuetype: "Task"
- name: notify-manager
type: call
call: "slack.post-message"
with:
channel: "warehouse-{{warehouse_id}}-ops"
text: "Recount required: {{find-discrepancies.row_count}} items above {{threshold_pct}}% variance. Jira: {{create-task.key}}"
- name: flag-in-sap
type: call
call: "sap.update-inventory-flag"
with:
warehouse_id: "{{warehouse_id}}"
flag: "recount_pending"
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/MM_INV_MGMT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inventory
path: "/A_InventoryFlag"
operations:
- name: update-inventory-flag
method: POST
Creates a safety incident in ServiceNow, files a Workday workers comp notification, notifies safety team via Slack, and creates a follow-up task in Jira.
naftiko: "0.5"
info:
label: "Warehouse Safety Incident Pipeline"
description: "Creates a safety incident in ServiceNow, files a Workday workers comp notification, notifies safety team via Slack, and creates a follow-up task in Jira."
tags:
- safety
- servicenow
- workday
- slack
- jira
capability:
exposes:
- type: mcp
namespace: safety-incident
port: 8080
tools:
- name: report-safety-incident
description: "Orchestrate safety incident reporting and follow-up."
inputParameters:
- name: warehouse_id
in: body
type: string
description: "Warehouse ID."
- name: employee_id
in: body
type: string
description: "Employee involved."
- name: incident_description
in: body
type: string
description: "Description of the incident."
steps:
- name: create-incident
type: call
call: "servicenow.create-record"
with:
table: "u_safety_incident"
warehouse_id: "{{warehouse_id}}"
employee_id: "{{employee_id}}"
description: "{{incident_description}}"
urgency: "1"
- name: notify-workday
type: call
call: "workday.create-safety-event"
with:
employee_id: "{{employee_id}}"
event_type: "workplace_incident"
description: "{{incident_description}}"
- name: alert-safety-team
type: call
call: "slack.post-message"
with:
channel: "safety-alerts"
text: "SAFETY INCIDENT: Warehouse {{warehouse_id}}. Employee: {{employee_id}}. {{incident_description}}. ServiceNow: {{create-incident.number}}."
- name: create-followup
type: call
call: "jira.create-issue"
with:
project: "SAFETY"
summary: "Safety follow-up: Warehouse {{warehouse_id}} - {{create-incident.number}}"
description: "{{incident_description}}. Root cause analysis required."
issuetype: "Task"
priority: "High"
consumes:
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/{{table}}"
inputParameters:
- name: table
in: path
operations:
- name: create-record
method: POST
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
authentication:
type: basic
username: "$secrets.workday_user"
password: "$secrets.workday_password"
resources:
- name: safety
path: "/Safety/Safety_Event"
operations:
- name: create-safety-event
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Forecasts staffing needs from Snowflake demand data, creates Workday shift requests, posts schedules to Microsoft Teams, and logs in Jira.
naftiko: "0.5"
info:
label: "Warehouse Staffing Adjustment Pipeline"
description: "Forecasts staffing needs from Snowflake demand data, creates Workday shift requests, posts schedules to Microsoft Teams, and logs in Jira."
tags:
- workforce
- snowflake
- workday
- microsoft-teams
- jira
capability:
exposes:
- type: mcp
namespace: staffing-adjustment
port: 8080
tools:
- name: adjust-staffing
description: "Orchestrate warehouse staffing adjustments based on demand forecasts."
inputParameters:
- name: warehouse_id
in: body
type: string
description: "Warehouse ID."
- name: week
in: body
type: string
description: "Target week in YYYY-WNN format."
steps:
- name: get-forecast
type: call
call: "snowflake.execute-statement"
with:
statement: "SELECT day_of_week, predicted_traffic, recommended_staff FROM WORKFORCE.DEMAND_FORECAST WHERE warehouse_id = '{{warehouse_id}}' AND week = '{{week}}'"
- name: create-shifts
type: call
call: "workday.create-schedule"
with:
warehouse_id: "{{warehouse_id}}"
week: "{{week}}"
schedule: "{{get-forecast.results}}"
- name: post-schedule
type: call
call: "msteams.post-channel-message"
with:
channel_id: "$secrets.warehouse_{{warehouse_id}}_channel"
text: "Updated staffing schedule for week {{week}}: {{get-forecast.row_count}} shift adjustments. Schedule: {{create-shifts.url}}."
- name: track-change
type: call
call: "jira.create-issue"
with:
project: "WHSE"
summary: "Staffing adjustment: Warehouse {{warehouse_id}} - {{week}}"
description: "Demand-based adjustment. {{get-forecast.row_count}} days modified."
issuetype: "Task"
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
authentication:
type: basic
username: "$secrets.workday_user"
password: "$secrets.workday_password"
resources:
- name: schedules
path: "/Staffing/Schedule"
operations:
- name: create-schedule
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Queries Snowflake for weekly warehouse throughput metrics and posts digest to leadership Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Weekly Warehouse Performance Digest"
description: "Queries Snowflake for weekly warehouse throughput metrics and posts digest to leadership Microsoft Teams channel."
tags:
- analytics
- retail
- snowflake
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: warehouse-reporting
port: 8080
tools:
- name: publish-warehouse-performance
description: "Given a region and week ending date, query Snowflake and post digest."
inputParameters:
- name: region
in: body
type: string
description: "Region code."
- name: week_ending
in: body
type: string
description: "Week ending date."
steps:
- name: query-performance
type: call
call: snowflake.execute-statement
with:
statement: "SELECT warehouse_id, SUM(net_sales) as total_sales, SUM(member_visits) as visits FROM RETAIL.WEEKLY_METRICS WHERE region = '{{region}}' AND week_ending = '{{week_ending}}' GROUP BY warehouse_id ORDER BY total_sales DESC"
- name: post-digest
type: call
call: msteams.send-channel-message
with:
team_id: "{{region}}-leadership"
channel: performance
text: "Weekly warehouse performance for {{region}} ending {{week_ending}}: {{query-performance.row_count}} locations reported."
consumes:
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
Queries Workday for employees with incomplete benefits enrollment and sends Teams reminders.
naftiko: "0.5"
info:
label: "Workday Benefits Enrollment Reminder"
description: "Queries Workday for employees with incomplete benefits enrollment and sends Teams reminders."
tags:
- hr
- workday
- microsoft-teams
- benefits
capability:
exposes:
- type: mcp
namespace: hr-benefits
port: 8080
tools:
- name: send-reminders
description: "Given a deadline, find incomplete enrollments and send reminders."
inputParameters:
- name: enrollment_deadline
in: body
type: string
description: "Deadline YYYY-MM-DD."
steps:
- name: get-pending
type: call
call: workday.get-pending-enrollments
with:
deadline: "{{enrollment_deadline}}"
- name: send
type: call
call: msteams.send-message
with:
recipient_upn: "{{get-pending.employee_emails}}"
text: "Reminder: Benefits enrollment due by {{enrollment_deadline}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: benefits
path: "/costco/benefits/pendingEnrollments"
operations:
- name: get-pending-enrollments
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves current benefits enrollment details for an employee from Workday.
naftiko: "0.5"
info:
label: "Workday Employee Benefits Lookup"
description: "Retrieves current benefits enrollment details for an employee from Workday."
tags:
- hr
- workday
- benefits
capability:
exposes:
- type: mcp
namespace: employee-benefits
port: 8080
tools:
- name: get-benefits
description: "Look up benefits enrollment for an employee."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee ID."
call: "workday.get-benefits"
with:
employee_id: "{{employee_id}}"
outputParameters:
- name: plans
type: array
mapping: "$.Report_Entry[0].Benefit_Plans"
- name: coverage_begin
type: string
mapping: "$.Report_Entry[0].Coverage_Begin_Date"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
authentication:
type: basic
username: "$secrets.workday_user"
password: "$secrets.workday_password"
resources:
- name: benefits
path: "/Benefits/Employee_Benefits/{{employee_id}}"
inputParameters:
- name: employee_id
in: path
operations:
- name: get-benefits
method: GET
Looks up a Workday employee by worker ID and returns name, department, and job title.
naftiko: "0.5"
info:
label: "Workday Employee Lookup"
description: "Looks up a Workday employee by worker ID and returns name, department, and job title."
tags:
- hr
- workday
- employee
capability:
exposes:
- type: mcp
namespace: hr
port: 8080
tools:
- name: get-employee
description: "Given a Workday worker ID, return employee details. Use for HR inquiries."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID."
call: workday.get-worker
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: full_name
type: string
mapping: "$.d.FullName"
- name: department
type: string
mapping: "$.d.Department"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/costco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
Returns current active headcount by department and cost center from Workday for workforce planning and finance reporting.
naftiko: "0.5"
info:
label: "Workday Headcount Snapshot"
description: "Returns current active headcount by department and cost center from Workday for workforce planning and finance reporting."
tags:
- hr
- finance
- workday
- headcount
- reporting
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: get-headcount-snapshot
description: "Returns current active employee headcount grouped by department and cost center from Workday. Use for workforce planning, headcount budgeting, and finance period close."
call: "workday.get-headcount"
outputParameters:
- name: employees
type: array
mapping: "$.data"
items:
- name: employee_id
type: string
mapping: "$.id"
- name: full_name
type: string
mapping: "$.name"
- name: department
type: string
mapping: "$.department"
- name: cost_center
type: string
mapping: "$.costCenter"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/costco/workers"
operations:
- name: get-headcount
method: GET
When a requisition is created, validates SAP budget, creates ServiceNow approval, and notifies hiring manager.
naftiko: "0.5"
info:
label: "Workday Job Requisition Approval"
description: "When a requisition is created, validates SAP budget, creates ServiceNow approval, and notifies hiring manager."
tags:
- hr
- workday
- sap
- servicenow
- microsoft-teams
- recruiting
capability:
exposes:
- type: mcp
namespace: recruiting
port: 8080
tools:
- name: process-requisition
description: "Given a requisition ID, validate budget and create approval."
inputParameters:
- name: requisition_id
in: body
type: string
description: "Requisition ID."
steps:
- name: get-req
type: call
call: workday.get-requisition
with:
requisition_id: "{{requisition_id}}"
- name: check-budget
type: call
call: sap.get-cost-center-budget
with:
cost_center: "{{get-req.cost_center}}"
- name: create-approval
type: call
call: servicenow.create-request
with:
category: hr_recruiting
short_description: "Requisition: {{get-req.job_title}}"
- name: notify
type: call
call: msteams.send-message
with:
recipient_upn: "{{get-req.hiring_manager_email}}"
text: "Requisition for {{get-req.job_title}} submitted. Budget: {{check-budget.remaining}}. Ticket: {{create-approval.number}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: requisitions
path: "/costco/jobRequisitions/{{requisition_id}}"
inputParameters:
- name: requisition_id
in: path
operations:
- name: get-requisition
method: GET
- type: http
namespace: sap
baseUri: "https://costco-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: cost-centers
path: "/A_CostCenter('{{cost_center}}')"
inputParameters:
- name: cost_center
in: path
operations:
- name: get-cost-center-budget
method: GET
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Pulls current period payroll totals from Workday for finance period close and compensation reporting.
naftiko: "0.5"
info:
label: "Workday Payroll Results Export"
description: "Pulls current period payroll totals from Workday for finance period close and compensation reporting."
tags:
- hr
- finance
- workday
- payroll
- reporting
capability:
exposes:
- type: mcp
namespace: payroll-reporting
port: 8080
tools:
- name: get-payroll-results
description: "Returns current period payroll totals grouped by department from Workday. Use for finance period close, compensation analysis, and headcount cost reporting."
call: "workday.get-payroll-results"
outputParameters:
- name: total_gross_pay
type: number
mapping: "$.totals.grossPay"
- name: total_employees
type: number
mapping: "$.totals.headcount"
- name: pay_period
type: string
mapping: "$.payPeriod"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: payroll-results
path: "/costco/payrollResults"
operations:
- name: get-payroll-results
method: GET
Compares Workday payroll results with budgets in Snowflake and alerts payroll team via Teams.
naftiko: "0.5"
info:
label: "Workday Payroll Variance Alert"
description: "Compares Workday payroll results with budgets in Snowflake and alerts payroll team via Teams."
tags:
- finance
- hr
- workday
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: payroll-ops
port: 8080
tools:
- name: check-payroll-variance
description: "Given a pay period, compare payroll with budgets and alert."
inputParameters:
- name: pay_period
in: body
type: string
description: "Pay period."
steps:
- name: get-payroll
type: call
call: workday.get-payroll-results
with:
pay_period: "{{pay_period}}"
- name: log-variance
type: call
call: snowflake.execute-statement
with:
statement: "INSERT INTO FINANCE.PAYROLL_VARIANCE (pay_period, total_payroll) VALUES ('{{pay_period}}', {{get-payroll.total_amount}})"
- name: alert
type: call
call: msteams.send-channel-message
with:
team_id: payroll-team
channel: variance-alerts
text: "Payroll variance for {{pay_period}}: ${{get-payroll.total_amount}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: payroll
path: "/costco/payroll/results"
operations:
- name: get-payroll-results
method: GET
- type: http
namespace: snowflake
baseUri: "https://costco.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
Initiates performance review cycle in Workday, creates tracking tasks in Jira, sends reminders via Slack, and refreshes HR dashboards in Power BI.
naftiko: "0.5"
info:
label: "Workday Performance Review Cycle Pipeline"
description: "Initiates performance review cycle in Workday, creates tracking tasks in Jira, sends reminders via Slack, and refreshes HR dashboards in Power BI."
tags:
- hr
- workday
- jira
- slack
- power-bi
capability:
exposes:
- type: mcp
namespace: performance-reviews
port: 8080
tools:
- name: start-review-cycle
description: "Orchestrate performance review cycle initiation."
inputParameters:
- name: review_period
in: body
type: string
description: "Review period identifier."
- name: department
in: body
type: string
description: "Department name."
steps:
- name: initiate-reviews
type: call
call: "workday.create-review-cycle"
with:
period: "{{review_period}}"
department: "{{department}}"
- name: create-tracker
type: call
call: "jira.create-issue"
with:
project: "HR"
summary: "Performance reviews: {{department}} - {{review_period}}"
description: "Review cycle initiated. Employees: {{initiate-reviews.employee_count}}."
issuetype: "Epic"
- name: send-reminders
type: call
call: "slack.post-message"
with:
channel: "hr-{{department}}"
text: "Performance review cycle started for {{review_period}}. {{initiate-reviews.employee_count}} reviews to complete. Tracker: {{create-tracker.key}}."
- name: refresh-dashboard
type: call
call: "powerbi.refresh-dataset"
with:
group_id: "$secrets.powerbi_workspace_id"
dataset_id: "$secrets.hr_dataset_id"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5-impl-services1.workday.com/ccx/service/costco"
authentication:
type: basic
username: "$secrets.workday_user"
password: "$secrets.workday_password"
resources:
- name: reviews
path: "/Performance_Management/Review_Cycle"
operations:
- name: create-review-cycle
method: POST
- type: http
namespace: jira
baseUri: "https://costco.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_bot_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: group_id
in: path
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
When an employee is promoted in Workday, updates Okta groups and creates ServiceNow access request.
naftiko: "0.5"
info:
label: "Workday Promotion to Okta Role Update"
description: "When an employee is promoted in Workday, updates Okta groups and creates ServiceNow access request."
tags:
- hr
- security
- workday
- okta
- servicenow
capability:
exposes:
- type: mcp
namespace: access-mgmt
port: 8080
tools:
- name: sync-promotion-access
description: "Given a worker ID, update Okta groups and create access request."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID."
steps:
- name: get-worker
type: call
call: workday.get-worker
with:
worker_id: "{{worker_id}}"
- name: update-okta
type: call
call: okta.update-groups
with:
user_login: "{{get-worker.work_email}}"
new_groups: "{{get-worker.role_groups}}"
- name: create-request
type: call
call: servicenow.create-request
with:
category: access_management
short_description: "Access update: {{get-worker.full_name}} — {{get-worker.job_title}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/costco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_token"
resources:
- name: groups
path: "/users/{{user_login}}/groups"
inputParameters:
- name: user_login
in: path
operations:
- name: update-groups
method: PUT
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
Returns a stage-by-stage candidate summary for an open Workday job requisition for recruiting team oversight.
naftiko: "0.5"
info:
label: "Workday Recruiting Pipeline Summary"
description: "Returns a stage-by-stage candidate summary for an open Workday job requisition for recruiting team oversight."
tags:
- hr
- recruiting
- workday
- reporting
capability:
exposes:
- type: mcp
namespace: recruiting
port: 8080
tools:
- name: get-requisition-pipeline
description: "Given a Workday job requisition ID, return stage-by-stage candidate counts and the job title. Use to track open position pipeline health."
inputParameters:
- name: requisition_id
in: body
type: string
description: "The Workday job requisition ID."
call: "workday.get-job-requisition"
with:
requisitionId: "{{requisition_id}}"
outputParameters:
- name: job_title
type: string
mapping: "$.jobRequisition.jobTitle"
- name: total_candidates
type: number
mapping: "$.jobRequisition.candidateCount"
- name: open_since
type: string
mapping: "$.jobRequisition.openDate"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: job-requisitions
path: "/costco/jobRequisitions/{{requisitionId}}"
inputParameters:
- name: requisitionId
in: path
operations:
- name: get-job-requisition
method: GET
When an employee's role changes in Workday, updates Okta group memberships to match the new role's access entitlements.
naftiko: "0.5"
info:
label: "Workday Role Change Access Provisioning"
description: "When an employee's role changes in Workday, updates Okta group memberships to match the new role's access entitlements."
tags:
- hr
- identity
- workday
- okta
- access-management
capability:
exposes:
- type: mcp
namespace: hr-identity
port: 8080
tools:
- name: sync-role-access
description: "Given a Workday employee ID and new job profile, update Okta group memberships to reflect the new role's access entitlements."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday worker ID."
- name: new_job_profile
in: body
type: string
description: "The new Workday job profile name."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: assign-okta-group
type: call
call: "okta.add-user-to-group"
with:
userId: "{{get-worker.okta_user_id}}"
groupProfile: "{{new_job_profile}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/costco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_api_token"
placement: header
resources:
- name: group-members
path: "/groups/{{groupProfile}}/users/{{userId}}"
inputParameters:
- name: groupProfile
in: path
- name: userId
in: path
operations:
- name: add-user-to-group
method: PUT
When an employee is terminated in Workday, deactivates Okta account and creates a ServiceNow equipment retrieval ticket.
naftiko: "0.5"
info:
label: "Workday Termination to Okta Deprovisioning"
description: "When an employee is terminated in Workday, deactivates Okta account and creates a ServiceNow equipment retrieval ticket."
tags:
- hr
- security
- workday
- okta
- servicenow
- offboarding
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: process-termination
description: "Given a worker ID, deactivate Okta and open equipment ticket."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID."
- name: termination_date
in: body
type: string
description: "Termination date."
steps:
- name: get-worker
type: call
call: workday.get-worker
with:
worker_id: "{{worker_id}}"
- name: deactivate-okta
type: call
call: okta.deactivate-user
with:
user_login: "{{get-worker.work_email}}"
- name: open-ticket
type: call
call: servicenow.create-incident
with:
category: hr_offboarding
short_description: "Equipment retrieval: {{get-worker.full_name}} — {{termination_date}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/costco/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: okta
baseUri: "https://costco.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_token"
resources:
- name: users
path: "/users/{{user_login}}/lifecycle/deactivate"
inputParameters:
- name: user_login
in: path
operations:
- name: deactivate-user
method: POST
- type: http
namespace: servicenow
baseUri: "https://costco.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Retrieves PTO balance for a Costco employee.
naftiko: "0.5"
info:
label: "Workday Time Off Balance Check"
description: "Retrieves PTO balance for a Costco employee."
tags:
- hr
- workday
- time-off
capability:
exposes:
- type: mcp
namespace: hr
port: 8080
tools:
- name: get-time-off-balance
description: "Given a worker ID, return PTO balance."
inputParameters:
- name: worker_id
in: body
type: string
description: "Worker ID."
call: workday-pto.get-balance
with:
worker_id: "{{worker_id}}"
outputParameters:
- name: pto_balance
type: number
mapping: "$.timeOffBalance.ptoHours"
consumes:
- type: http
namespace: workday-pto
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: time-off
path: "/costco/workers/{{worker_id}}/timeOffBalance"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-balance
method: GET
Returns current vacation, PTO, and sick leave balances for a Costco employee from Workday for absence planning and manager approvals.
naftiko: "0.5"
info:
label: "Workday Time-Off Balance Lookup"
description: "Returns current vacation, PTO, and sick leave balances for a Costco employee from Workday for absence planning and manager approvals."
tags:
- hr
- workday
- absence-management
capability:
exposes:
- type: mcp
namespace: hr-absence
port: 8080
tools:
- name: get-time-off-balance
description: "Given a Workday employee ID, return the employee's current accrued vacation, PTO, and sick leave balances. Use before approving a time-off request."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday worker ID."
call: "workday.get-leave-balance"
with:
worker_id: "{{employee_id}}"
outputParameters:
- name: vacation_days
type: number
mapping: "$.leaveBalances.vacation"
- name: pto_days
type: number
mapping: "$.leaveBalances.pto"
- name: sick_days
type: number
mapping: "$.leaveBalances.sick"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: leave-balances
path: "/costco/workers/{{worker_id}}/leaveBalance"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-leave-balance
method: GET
Retrieves Zoom meeting details by ID.
naftiko: "0.5"
info:
label: "Zoom Meeting Details Lookup"
description: "Retrieves Zoom meeting details by ID."
tags:
- communication
- zoom
- meetings
capability:
exposes:
- type: mcp
namespace: communication
port: 8080
tools:
- name: get-meeting
description: "Given a Zoom meeting ID, return topic and time."
inputParameters:
- name: meeting_id
in: body
type: string
description: "Meeting ID."
call: zoom.get-meeting
with:
meeting_id: "{{meeting_id}}"
outputParameters:
- name: topic
type: string
mapping: "$.topic"
consumes:
- type: http
namespace: zoom
baseUri: "https://api.zoom.us/v2"
authentication:
type: bearer
token: "$secrets.zoom_token"
resources:
- name: meetings
path: "/meetings/{{meeting_id}}"
inputParameters:
- name: meeting_id
in: path
operations:
- name: get-meeting
method: GET