Anheuser Busch Capabilities
Naftiko 0.5 capability definitions for Anheuser Busch - 100 capabilities showing integration workflows and service orchestrations.
Extracts current year actuals from SAP controlling, loads them into Snowflake planning tables, and triggers a Power BI dataset refresh for budget dashboards.
naftiko: "0.5"
info:
label: "Annual Budget Planning Data Sync"
description: "Extracts current year actuals from SAP controlling, loads them into Snowflake planning tables, and triggers a Power BI dataset refresh for budget dashboards."
tags:
- finance
- sap
- snowflake
- power-bi
- budgeting
capability:
exposes:
- type: mcp
namespace: budget-ops
port: 8080
tools:
- name: sync-budget-data
description: "Given a fiscal year, extract SAP actuals, load into Snowflake, and refresh the Power BI budget dashboard."
inputParameters:
- name: fiscal_year
in: body
type: string
description: "The fiscal year (e.g. 2025)."
steps:
- name: get-actuals
type: call
call: "sap-budget.get-fiscal-actuals"
with:
year: "{{fiscal_year}}"
- name: load-snowflake
type: call
call: "snowflake-budget.insert-actuals"
with:
table: "FINANCE.BUDGET_ACTUALS"
year: "{{fiscal_year}}"
data: "{{get-actuals.records}}"
- name: refresh-dashboard
type: call
call: "powerbi-budget.trigger-refresh"
with:
dataset_id: "$secrets.powerbi_budget_dataset_id"
consumes:
- type: http
namespace: sap-budget
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: actuals
path: "/A_CostCenter"
operations:
- name: get-fiscal-actuals
method: GET
- type: http
namespace: snowflake-budget
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-actuals
method: POST
- type: http
namespace: powerbi-budget
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: refreshes
path: "/datasets/{{dataset_id}}/refreshes"
operations:
- name: trigger-refresh
method: POST
Validates a release pipeline stage by checking Datadog service health, Snowflake data integrity, and updating the ServiceNow change request with results.
naftiko: "0.5"
info:
label: "Azure DevOps Release Gate Check"
description: "Validates a release pipeline stage by checking Datadog service health, Snowflake data integrity, and updating the ServiceNow change request with results."
tags:
- devops
- datadog
- snowflake
- servicenow
- release-management
capability:
exposes:
- type: mcp
namespace: release-gate
port: 8080
tools:
- name: check-release-gates
description: "Given a release ID and change number, validate Datadog health, Snowflake data integrity, and update the ServiceNow change request."
inputParameters:
- name: release_id
in: body
type: string
description: "The release pipeline identifier."
- name: change_number
in: body
type: string
description: "The ServiceNow change request number."
steps:
- name: check-health
type: call
call: "datadog-gate.get-service-health"
with:
release: "{{release_id}}"
- name: check-data
type: call
call: "snowflake-gate.run-integrity-check"
with:
release: "{{release_id}}"
- name: update-change
type: call
call: "servicenow-gate.update-change"
with:
number: "{{change_number}}"
work_notes: "Release Gate: Health {{check-health.status}} | Data Integrity {{check-data.status}} | Release: {{release_id}}"
consumes:
- type: http
namespace: datadog-gate
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor"
operations:
- name: get-service-health
method: GET
- type: http
namespace: snowflake-gate
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-integrity-check
method: POST
- type: http
namespace: servicenow-gate
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: update-change
method: PATCH
Queries Azure Resource Health for the availability status of a specified resource.
naftiko: "0.5"
info:
label: "Azure Resource Health Check"
description: "Queries Azure Resource Health for the availability status of a specified resource."
tags:
- cloud
- azure
- infrastructure
capability:
exposes:
- type: mcp
namespace: azure-health
port: 8080
tools:
- name: get-resource-health
description: "Check the health status of an Azure resource. Returns availability state and summary."
inputParameters:
- name: resource_id
in: body
type: string
description: "The Azure resource ID."
call: "azure-health.get-health"
with:
resource_id: "{{resource_id}}"
outputParameters:
- name: availability_state
type: string
mapping: "$.properties.availabilityState"
- name: summary
type: string
mapping: "$.properties.summary"
- name: reason_type
type: string
mapping: "$.properties.reasonType"
consumes:
- type: http
namespace: azure-health
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: health
path: "/{{resource_id}}/providers/Microsoft.ResourceHealth/availabilityStatuses/current"
inputParameters:
- name: resource_id
in: path
operations:
- name: get-health
method: GET
Initiates a product recall by blocking the batch in SAP QM, creating a Salesforce case for affected retailers, and broadcasting an alert to the crisis management Teams channel.
naftiko: "0.5"
info:
label: "Beverage Recall Coordination"
description: "Initiates a product recall by blocking the batch in SAP QM, creating a Salesforce case for affected retailers, and broadcasting an alert to the crisis management Teams channel."
tags:
- quality
- sap
- salesforce
- microsoft-teams
- compliance
capability:
exposes:
- type: mcp
namespace: recall-ops
port: 8080
tools:
- name: initiate-product-recall
description: "Given a batch number and reason, block the batch in SAP, create Salesforce cases for affected retailers, and alert crisis management via Teams."
inputParameters:
- name: batch_number
in: body
type: string
description: "The SAP batch number to recall."
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: recall_reason
in: body
type: string
description: "The reason for the recall."
steps:
- name: block-batch
type: call
call: "sap-qm.update-batch-status"
with:
batch: "{{batch_number}}"
material: "{{material_number}}"
status: "BLOCKED"
- name: create-sf-case
type: call
call: "salesforce-recall.create-case"
with:
subject: "Product Recall: {{material_number}} batch {{batch_number}}"
description: "Reason: {{recall_reason}}"
priority: "Critical"
- name: alert-crisis
type: call
call: "msteams-crisis.post-message"
with:
channel_id: "$secrets.teams_crisis_channel_id"
message: "RECALL INITIATED: Material {{material_number}} Batch {{batch_number}} | Reason: {{recall_reason}} | Case: {{create-sf-case.CaseNumber}}"
consumes:
- type: http
namespace: sap-qm
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batches
path: "/A_Batch"
operations:
- name: update-batch-status
method: PATCH
- type: http
namespace: salesforce-recall
baseUri: "https://anheuser-busch.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-crisis
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Pulls campaign spend from SAP, revenue lift from Snowflake, and posts an ROI summary to the marketing Teams channel.
naftiko: "0.5"
info:
label: "Brand Campaign ROI Report"
description: "Pulls campaign spend from SAP, revenue lift from Snowflake, and posts an ROI summary to the marketing Teams channel."
tags:
- marketing
- sap
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: marketing-ops
port: 8080
tools:
- name: generate-campaign-roi
description: "Given a campaign ID, pull spend from SAP and revenue data from Snowflake, then post an ROI summary to the marketing Teams channel."
inputParameters:
- name: campaign_id
in: body
type: string
description: "The marketing campaign identifier."
steps:
- name: get-spend
type: call
call: "sap-mktg.get-campaign-costs"
with:
campaign: "{{campaign_id}}"
- name: get-revenue
type: call
call: "snowflake-mktg.query-revenue-lift"
with:
campaign: "{{campaign_id}}"
- name: post-roi
type: call
call: "msteams-mktg.post-message"
with:
channel_id: "$secrets.teams_marketing_channel_id"
message: "Campaign {{campaign_id}} ROI: Spend {{get-spend.total_cost}} | Revenue Lift {{get-revenue.incremental_revenue}} | ROI {{get-revenue.roi_percent}}%"
consumes:
- type: http
namespace: sap-mktg
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: costs
path: "/A_CostCenter"
operations:
- name: get-campaign-costs
method: GET
- type: http
namespace: snowflake-mktg
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-revenue-lift
method: POST
- type: http
namespace: msteams-mktg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Pulls energy consumption data from the plant historian via Snowflake, compares to SAP cost center budgets, and alerts sustainability team via Teams.
naftiko: "0.5"
info:
label: "Brewery Energy Consumption Monitor"
description: "Pulls energy consumption data from the plant historian via Snowflake, compares to SAP cost center budgets, and alerts sustainability team via Teams."
tags:
- sustainability
- snowflake
- sap
- microsoft-teams
- energy
capability:
exposes:
- type: mcp
namespace: energy-ops
port: 8080
tools:
- name: monitor-energy-consumption
description: "Given a plant code, pull energy data from Snowflake, compare to SAP budget, and alert sustainability via Teams if over threshold."
inputParameters:
- name: plant_code
in: body
type: string
description: "The brewery plant code."
- name: month
in: body
type: string
description: "The reporting month in YYYY-MM format."
steps:
- name: get-energy
type: call
call: "snowflake-energy.query-consumption"
with:
plant: "{{plant_code}}"
month: "{{month}}"
- name: get-budget
type: call
call: "sap-energy.get-energy-budget"
with:
plant: "{{plant_code}}"
period: "{{month}}"
- name: alert-team
type: call
call: "msteams-energy.post-message"
with:
channel_id: "$secrets.teams_sustainability_channel_id"
message: "Energy Report — {{plant_code}} ({{month}}): Consumed {{get-energy.total_kwh}} kWh | Budget {{get-budget.budget_kwh}} kWh | Variance {{get-energy.variance_percent}}%"
consumes:
- type: http
namespace: snowflake-energy
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-consumption
method: POST
- type: http
namespace: sap-energy
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: budgets
path: "/A_CostCenter"
operations:
- name: get-energy-budget
method: GET
- type: http
namespace: msteams-energy
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Retrieves the status of a production order from SAP S/4HANA for a specific brewery and product, returning scheduled quantities and completion status.
naftiko: "0.5"
info:
label: "Brewery Production Order Status Check"
description: "Retrieves the status of a production order from SAP S/4HANA for a specific brewery and product, returning scheduled quantities and completion status."
tags:
- manufacturing
- sap
- erp
- production
capability:
exposes:
- type: mcp
namespace: brewery-ops
port: 8080
tools:
- name: get-production-order-status
description: "Look up a SAP production order by order number. Returns scheduled quantity, completed quantity, status, and planned completion date. Use for brewery operations monitoring."
inputParameters:
- name: production_order_id
in: body
type: string
description: "The SAP production order number."
call: "sap-prod.get-production-order"
with:
order_id: "{{production_order_id}}"
outputParameters:
- name: status
type: string
mapping: "$.d.SystemStatus"
- name: scheduled_qty
type: number
mapping: "$.d.TotalQuantity"
- name: completed_qty
type: number
mapping: "$.d.ConfirmedYieldQuantity"
- name: planned_end_date
type: string
mapping: "$.d.PlannedEndDate"
consumes:
- type: http
namespace: sap-prod
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDERS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production-orders
path: "/A_ProductionOrder('{{order_id}}')"
inputParameters:
- name: order_id
in: path
operations:
- name: get-production-order
method: GET
Pulls shift production data from SAP, open incidents from ServiceNow, and posts a consolidated handover report to the plant operations Teams channel.
naftiko: "0.5"
info:
label: "Brewery Shift Handover Report"
description: "Pulls shift production data from SAP, open incidents from ServiceNow, and posts a consolidated handover report to the plant operations Teams channel."
tags:
- manufacturing
- sap
- servicenow
- microsoft-teams
- operations
capability:
exposes:
- type: mcp
namespace: shift-ops
port: 8080
tools:
- name: generate-shift-handover
description: "Given a plant code and shift ID, pull SAP production data and open ServiceNow incidents, then post a handover report to Teams."
inputParameters:
- name: plant_code
in: body
type: string
description: "The brewery plant code."
- name: shift_id
in: body
type: string
description: "The shift identifier (e.g. DAY, SWING, NIGHT)."
steps:
- name: get-production
type: call
call: "sap-shift.get-shift-output"
with:
plant: "{{plant_code}}"
shift: "{{shift_id}}"
- name: get-incidents
type: call
call: "servicenow-shift.get-open-incidents"
with:
plant: "{{plant_code}}"
- name: post-handover
type: call
call: "msteams-shift.post-message"
with:
channel_id: "$secrets.teams_plant_ops_channel_id"
message: "Shift Handover — {{plant_code}} ({{shift_id}}): Output {{get-production.total_units}} units | Efficiency {{get-production.efficiency}}% | Open Incidents: {{get-incidents.count}} | Critical: {{get-incidents.critical_count}}"
consumes:
- type: http
namespace: sap-shift
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDERS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production
path: "/A_ProductionOrder"
operations:
- name: get-shift-output
method: GET
- type: http
namespace: servicenow-shift
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-open-incidents
method: GET
- type: http
namespace: msteams-shift
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Logs brewery waste disposal records from SAP EHS into Snowflake for regulatory reporting and creates a compliance task in ServiceNow.
naftiko: "0.5"
info:
label: "Brewery Waste Disposal Tracking"
description: "Logs brewery waste disposal records from SAP EHS into Snowflake for regulatory reporting and creates a compliance task in ServiceNow."
tags:
- sustainability
- sap
- snowflake
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: waste-ops
port: 8080
tools:
- name: track-waste-disposal
description: "Given a plant code and disposal date, pull SAP EHS waste records, load into Snowflake, and create a ServiceNow compliance task."
inputParameters:
- name: plant_code
in: body
type: string
description: "The brewery plant code."
- name: disposal_date
in: body
type: string
description: "The disposal date in YYYY-MM-DD format."
steps:
- name: get-waste-records
type: call
call: "sap-ehs.get-waste-disposal"
with:
plant: "{{plant_code}}"
date: "{{disposal_date}}"
- name: load-records
type: call
call: "snowflake-waste.insert-records"
with:
table: "COMPLIANCE.WASTE_DISPOSAL"
data: "{{get-waste-records.records}}"
- name: create-task
type: call
call: "servicenow-waste.create-task"
with:
short_description: "Waste disposal compliance: {{plant_code}} on {{disposal_date}}"
description: "Records loaded: {{get-waste-records.record_count}} | Total weight: {{get-waste-records.total_weight_kg}} kg"
consumes:
- type: http
namespace: sap-ehs
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_ENVIRONMENT_HEALTH_SAFETY"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: waste
path: "/A_WasteDisposal"
operations:
- name: get-waste-disposal
method: GET
- type: http
namespace: snowflake-waste
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-records
method: POST
- type: http
namespace: servicenow-waste
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Creates a ServiceNow change request for infrastructure changes and routes it to the CAB board, notifying the requestor in Teams.
naftiko: "0.5"
info:
label: "Change Management Approval Workflow"
description: "Creates a ServiceNow change request for infrastructure changes and routes it to the CAB board, notifying the requestor in Teams."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: change-mgmt
port: 8080
tools:
- name: create-change-request
description: "Given change description, type, and risk level, create a ServiceNow change request and notify the requestor in Teams."
inputParameters:
- name: short_description
in: body
type: string
description: "Brief description of the change."
- name: change_type
in: body
type: string
description: "Change type: normal, standard, or emergency."
- name: risk_level
in: body
type: string
description: "Risk level: low, medium, high, or critical."
- name: requestor_upn
in: body
type: string
description: "The UPN of the requestor for Teams notification."
steps:
- name: create-cr
type: call
call: "servicenow-chg.create-change"
with:
short_description: "{{short_description}}"
type: "{{change_type}}"
risk: "{{risk_level}}"
assignment_group: "CAB"
- name: notify-requestor
type: call
call: "msteams-chg.send-message"
with:
recipient_upn: "{{requestor_upn}}"
message: "Change request submitted: {{create-cr.number}}. Type: {{change_type}}. Risk: {{risk_level}}. Pending CAB review."
consumes:
- type: http
namespace: servicenow-chg
baseUri: "https://anheuser-busch.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: msteams-chg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
When an AWS cost anomaly is detected, annotates the event in Datadog, opens a ServiceNow FinOps ticket, and notifies the finance team in Teams.
naftiko: "0.5"
info:
label: "Cloud Cost Anomaly Responder"
description: "When an AWS cost anomaly is detected, annotates the event in Datadog, opens a ServiceNow FinOps ticket, and notifies the finance team in Teams."
tags:
- finops
- cloud
- aws
- datadog
- servicenow
capability:
exposes:
- type: mcp
namespace: cloud-finops
port: 8080
tools:
- name: handle-cost-anomaly
description: "Given an AWS cost anomaly ID, affected service, and estimated overage, create a Datadog event, open a ServiceNow FinOps ticket, and notify the finance Teams channel."
inputParameters:
- name: anomaly_id
in: body
type: string
description: "The AWS Cost Anomaly Detection anomaly ID."
- name: aws_service
in: body
type: string
description: "The AWS service generating the anomaly."
- name: estimated_overage_usd
in: body
type: number
description: "Estimated dollar overage detected."
- name: business_unit
in: body
type: string
description: "The Anheuser-Busch business unit owning the account."
steps:
- name: annotate-datadog
type: call
call: "datadog-finops.create-event"
with:
title: "AWS Cost Anomaly: {{aws_service}}"
text: "Anomaly {{anomaly_id}} — estimated overage: ${{estimated_overage_usd}} — BU: {{business_unit}}"
alert_type: "warning"
- name: create-finops-ticket
type: call
call: "servicenow-finops.create-incident"
with:
short_description: "AWS cost anomaly on {{aws_service}} — ${{estimated_overage_usd}} overage"
description: "Anomaly {{anomaly_id}} on {{aws_service}} for {{business_unit}}. Datadog event: {{annotate-datadog.id}}."
assignment_group: "FinOps"
- name: notify-finance
type: call
call: "msteams-finops.post-channel-message"
with:
channel_id: "cloud-finance-alerts"
message: "AWS Cost Anomaly: {{aws_service}} | Overage: ${{estimated_overage_usd}} | BU: {{business_unit}} | Ticket: {{create-finops-ticket.number}}"
consumes:
- type: http
namespace: datadog-finops
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: servicenow-finops
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-finops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Pulls CO2 emissions data from SAP EHS and Snowflake, calculates against targets, and posts a sustainability report to the ESG Teams channel.
naftiko: "0.5"
info:
label: "CO2 Emissions Tracking Report"
description: "Pulls CO2 emissions data from SAP EHS and Snowflake, calculates against targets, and posts a sustainability report to the ESG Teams channel."
tags:
- sustainability
- sap
- snowflake
- microsoft-teams
- emissions
capability:
exposes:
- type: mcp
namespace: emissions-ops
port: 8080
tools:
- name: generate-emissions-report
description: "Given a plant code and reporting period, pull emissions data and post a sustainability report to the ESG Teams channel."
inputParameters:
- name: plant_code
in: body
type: string
description: "The brewery plant code."
- name: period
in: body
type: string
description: "Reporting period in YYYY-MM format."
steps:
- name: get-emissions
type: call
call: "sap-emissions.get-plant-emissions"
with:
plant: "{{plant_code}}"
period: "{{period}}"
- name: get-targets
type: call
call: "snowflake-emissions.query-reduction-targets"
with:
plant: "{{plant_code}}"
period: "{{period}}"
- name: post-report
type: call
call: "msteams-emissions.post-message"
with:
channel_id: "$secrets.teams_esg_channel_id"
message: "CO2 Report — {{plant_code}} ({{period}}): Emissions {{get-emissions.total_tonnes}} tonnes | Target {{get-targets.target_tonnes}} tonnes | Variance {{get-targets.variance_percent}}%"
consumes:
- type: http
namespace: sap-emissions
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_ENVIRONMENT_HEALTH_SAFETY"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: emissions
path: "/A_EmissionsData"
operations:
- name: get-plant-emissions
method: GET
- type: http
namespace: snowflake-emissions
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-reduction-targets
method: POST
- type: http
namespace: msteams-emissions
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Retrieves a Confluence wiki page by ID, returning title, version, last modifier, and space key.
naftiko: "0.5"
info:
label: "Confluence Page Lookup"
description: "Retrieves a Confluence wiki page by ID, returning title, version, last modifier, and space key."
tags:
- knowledge-management
- confluence
- documentation
capability:
exposes:
- type: mcp
namespace: confluence
port: 8080
tools:
- name: get-page
description: "Look up a Confluence page by ID. Returns title, space, version number, and last editor."
inputParameters:
- name: page_id
in: body
type: string
description: "The Confluence page ID."
call: "confluence.get-page"
with:
page_id: "{{page_id}}"
outputParameters:
- name: title
type: string
mapping: "$.title"
- name: space
type: string
mapping: "$.space.key"
- name: version
type: number
mapping: "$.version.number"
- name: last_modifier
type: string
mapping: "$.version.by.displayName"
consumes:
- type: http
namespace: confluence
baseUri: "https://anheuser-busch.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content/{{page_id}}"
inputParameters:
- name: page_id
in: path
operations:
- name: get-page
method: GET
When a customer complaint is logged in Salesforce, creates a quality investigation in SAP QM and assigns a ServiceNow task to the quality team.
naftiko: "0.5"
info:
label: "Customer Complaint Resolution Workflow"
description: "When a customer complaint is logged in Salesforce, creates a quality investigation in SAP QM and assigns a ServiceNow task to the quality team."
tags:
- quality
- salesforce
- sap
- servicenow
- customer-service
capability:
exposes:
- type: mcp
namespace: complaint-ops
port: 8080
tools:
- name: process-customer-complaint
description: "Given a Salesforce case ID, pull complaint details, create a SAP QM notification, and assign a ServiceNow task to the quality team."
inputParameters:
- name: case_id
in: body
type: string
description: "The Salesforce case ID for the complaint."
steps:
- name: get-case
type: call
call: "salesforce-complaint.get-case"
with:
case_id: "{{case_id}}"
- name: create-qm-notification
type: call
call: "sap-complaint.create-quality-notification"
with:
material: "{{get-case.Product_Material__c}}"
batch: "{{get-case.Batch_Number__c}}"
description: "Customer complaint: {{get-case.Subject}}"
- name: create-task
type: call
call: "servicenow-complaint.create-task"
with:
short_description: "Quality investigation: {{get-case.Subject}}"
description: "SF Case: {{case_id}} | SAP QN: {{create-qm-notification.notification_id}} | Material: {{get-case.Product_Material__c}}"
assignment_group: "Quality Assurance"
consumes:
- type: http
namespace: salesforce-complaint
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
operations:
- name: get-case
method: GET
- type: http
namespace: sap-complaint
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_QUALITYNOTIFICATION_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: servicenow-complaint
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Retrieves the current health status of Anheuser-Busch's monitored infrastructure hosts and active Datadog monitors.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Health Check"
description: "Retrieves the current health status of Anheuser-Busch's monitored infrastructure hosts and active Datadog monitors."
tags:
- observability
- datadog
- monitoring
- infrastructure
capability:
exposes:
- type: mcp
namespace: infra-monitoring
port: 8080
tools:
- name: get-infrastructure-health
description: "Query Datadog for the current status of all monitored hosts and active alerts for a given environment."
inputParameters:
- name: environment
in: body
type: string
description: "The deployment environment: production, staging, or development."
call: "datadog.list-monitors"
with:
tags: "env:{{environment}}"
outputParameters:
- name: monitors
type: array
mapping: "$.monitors"
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"
operations:
- name: list-monitors
method: GET
inputParameters:
- name: tags
in: query
Queries Datadog for the current health status of a monitored service, returning uptime and error rate.
naftiko: "0.5"
info:
label: "Datadog Service Status Check"
description: "Queries Datadog for the current health status of a monitored service, returning uptime and error rate."
tags:
- monitoring
- datadog
- observability
capability:
exposes:
- type: mcp
namespace: datadog-monitor
port: 8080
tools:
- name: get-service-status
description: "Check a Datadog-monitored service status. Returns current state, uptime percentage, and error rate."
inputParameters:
- name: service_name
in: body
type: string
description: "The name of the service in Datadog."
call: "datadog-monitor.get-status"
with:
service: "{{service_name}}"
outputParameters:
- name: status
type: string
mapping: "$.data.attributes.status"
- name: uptime
type: number
mapping: "$.data.attributes.uptime"
- name: error_rate
type: number
mapping: "$.data.attributes.error_rate"
consumes:
- type: http
namespace: datadog-monitor
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: services
path: "/service_dependencies"
inputParameters:
- name: service
in: query
operations:
- name: get-status
method: GET
Identifies contracts approaching renewal in Salesforce, pulls historical performance from Snowflake, and creates a Jira task for the account manager.
naftiko: "0.5"
info:
label: "Distributor Contract Renewal Pipeline"
description: "Identifies contracts approaching renewal in Salesforce, pulls historical performance from Snowflake, and creates a Jira task for the account manager."
tags:
- sales
- salesforce
- snowflake
- jira
- contracts
capability:
exposes:
- type: mcp
namespace: contract-ops
port: 8080
tools:
- name: process-contract-renewal
description: "Given a contract ID, pull Salesforce contract details, Snowflake performance data, and create a Jira renewal task."
inputParameters:
- name: contract_id
in: body
type: string
description: "The Salesforce contract record ID."
steps:
- name: get-contract
type: call
call: "salesforce-contracts.get-contract"
with:
contract_id: "{{contract_id}}"
- name: get-performance
type: call
call: "snowflake-contracts.query-performance"
with:
distributor_id: "{{get-contract.AccountId}}"
- name: create-task
type: call
call: "jira-contracts.create-issue"
with:
project: "SALES"
summary: "Contract renewal: {{get-contract.Account.Name}} expiring {{get-contract.EndDate}}"
description: "Historical volume: {{get-performance.total_volume}} | Revenue: {{get-performance.total_revenue}}"
consumes:
- type: http
namespace: salesforce-contracts
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contracts
path: "/sobjects/Contract/{{contract_id}}"
operations:
- name: get-contract
method: GET
- type: http
namespace: snowflake-contracts
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-performance
method: POST
- type: http
namespace: jira-contracts
baseUri: "https://anheuser-busch.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
Retrieves distributor credit data from SAP and Salesforce, calculates risk exposure, and posts a summary to the finance Teams channel.
naftiko: "0.5"
info:
label: "Distributor Credit Limit Review"
description: "Retrieves distributor credit data from SAP and Salesforce, calculates risk exposure, and posts a summary to the finance Teams channel."
tags:
- finance
- sap
- salesforce
- microsoft-teams
- distribution
capability:
exposes:
- type: mcp
namespace: credit-ops
port: 8080
tools:
- name: review-distributor-credit
description: "Given a distributor account ID, pull credit data from SAP and Salesforce, then alert finance via Teams if exposure exceeds threshold."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce distributor account ID."
steps:
- name: get-sf-account
type: call
call: "salesforce-credit.get-account"
with:
account_id: "{{account_id}}"
- name: get-sap-credit
type: call
call: "sap-credit.get-credit-exposure"
with:
customer_id: "{{get-sf-account.SAP_Customer_ID__c}}"
- name: notify-finance
type: call
call: "msteams-credit.post-message"
with:
channel_id: "$secrets.teams_finance_channel_id"
message: "Credit Review: {{get-sf-account.Name}} | Limit: {{get-sap-credit.credit_limit}} | Exposure: {{get-sap-credit.total_receivables}} | Available: {{get-sap-credit.available_credit}}"
consumes:
- type: http
namespace: salesforce-credit
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
operations:
- name: get-account
method: GET
- type: http
namespace: sap-credit
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_CREDIT_MGMT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: credit
path: "/A_CreditExposure('{{customer_id}}')"
operations:
- name: get-credit-exposure
method: GET
- type: http
namespace: msteams-credit
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Calculates distributor rebates by pulling sales volume from Snowflake, applying SAP rebate conditions, and creating a Salesforce rebate statement.
naftiko: "0.5"
info:
label: "Distributor Rebate Calculation"
description: "Calculates distributor rebates by pulling sales volume from Snowflake, applying SAP rebate conditions, and creating a Salesforce rebate statement."
tags:
- finance
- snowflake
- sap
- salesforce
- rebate-management
capability:
exposes:
- type: mcp
namespace: rebate-ops
port: 8080
tools:
- name: calculate-distributor-rebate
description: "Given a distributor ID and period, pull sales volumes, apply rebate rules, and create a Salesforce rebate statement."
inputParameters:
- name: distributor_id
in: body
type: string
description: "The Salesforce distributor account ID."
- name: period
in: body
type: string
description: "The rebate period in YYYY-QN format."
steps:
- name: get-volume
type: call
call: "snowflake-rebate.query-sales-volume"
with:
distributor: "{{distributor_id}}"
period: "{{period}}"
- name: get-conditions
type: call
call: "sap-rebate.get-rebate-conditions"
with:
customer: "{{distributor_id}}"
- name: create-statement
type: call
call: "salesforce-rebate.create-rebate-statement"
with:
distributor_id: "{{distributor_id}}"
period: "{{period}}"
volume: "{{get-volume.total_volume}}"
rebate_amount: "{{get-conditions.calculated_rebate}}"
consumes:
- type: http
namespace: snowflake-rebate
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-sales-volume
method: POST
- type: http
namespace: sap-rebate
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SLSPRICINGCONDITIONRECORD_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: conditions
path: "/A_SlsPrcgCndnRecdValidity"
operations:
- name: get-rebate-conditions
method: GET
- type: http
namespace: salesforce-rebate
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: rebates
path: "/sobjects/Rebate_Statement__c"
operations:
- name: create-rebate-statement
method: POST
Generates a weekly account health digest from Salesforce for Anheuser-Busch's distributor accounts and posts it to the regional sales Teams channel.
naftiko: "0.5"
info:
label: "Distributor Sales Account Health Digest"
description: "Generates a weekly account health digest from Salesforce for Anheuser-Busch's distributor accounts and posts it to the regional sales Teams channel."
tags:
- sales
- crm
- salesforce
- reporting
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: account-health
port: 8080
tools:
- name: digest-distributor-health
description: "Given a Salesforce account ID and Teams channel, retrieve open orders, contracts, and account status, then post a distributor health digest."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce distributor account ID."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel to post the digest to."
steps:
- name: get-account
type: call
call: "salesforce-health.get-account"
with:
account_id: "{{account_id}}"
- name: get-opportunities
type: call
call: "salesforce-health.get-account-opportunities"
with:
account_id: "{{account_id}}"
- name: post-digest
type: call
call: "msteams-health.post-channel-message"
with:
channel_id: "{{teams_channel_id}}"
message: "Distributor Health: {{get-account.name}} | Region: {{get-account.region}} | Open Orders: {{get-opportunities.total_count}} | Volume: {{get-account.annual_volume}}"
consumes:
- type: http
namespace: salesforce-health
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- name: account-opportunities
path: "/sobjects/Account/{{account_id}}/Opportunities"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account-opportunities
method: GET
- type: http
namespace: msteams-health
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Queries SAP PM for draft beer equipment due for preventive maintenance, creates work orders, and notifies field service technicians via Teams.
naftiko: "0.5"
info:
label: "Draft Beer Equipment Maintenance Scheduler"
description: "Queries SAP PM for draft beer equipment due for preventive maintenance, creates work orders, and notifies field service technicians via Teams."
tags:
- field-service
- sap
- microsoft-teams
- maintenance
capability:
exposes:
- type: mcp
namespace: field-service
port: 8080
tools:
- name: schedule-draft-maintenance
description: "Given a region code, find draft equipment due for maintenance in SAP, create work orders, and notify field technicians via Teams."
inputParameters:
- name: region_code
in: body
type: string
description: "The field service region code."
steps:
- name: get-due-equipment
type: call
call: "sap-fs.get-maintenance-due"
with:
region: "{{region_code}}"
- name: create-work-orders
type: call
call: "sap-fs.create-work-order"
with:
equipment_list: "{{get-due-equipment.equipment_ids}}"
order_type: "PM01"
- name: notify-technicians
type: call
call: "msteams-fs.post-message"
with:
channel_id: "$secrets.teams_field_service_channel_id"
message: "Maintenance scheduled for {{get-due-equipment.count}} draft units in {{region_code}} | Work orders: {{create-work-orders.order_numbers}}"
consumes:
- type: http
namespace: sap-fs
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: maintenance
path: "/MaintenanceNotification"
operations:
- name: get-maintenance-due
method: GET
- name: create-work-order
method: POST
- type: http
namespace: msteams-fs
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Syncs e-commerce orders from Shopify to SAP for fulfillment, updates Salesforce order tracking, and notifies the e-commerce team via Teams.
naftiko: "0.5"
info:
label: "E-Commerce Order Fulfillment Sync"
description: "Syncs e-commerce orders from Shopify to SAP for fulfillment, updates Salesforce order tracking, and notifies the e-commerce team via Teams."
tags:
- ecommerce
- shopify
- sap
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ecom-ops
port: 8080
tools:
- name: sync-ecommerce-order
description: "Given a Shopify order ID, sync order to SAP for fulfillment, update Salesforce tracking, and notify the e-commerce team via Teams."
inputParameters:
- name: shopify_order_id
in: body
type: string
description: "The Shopify order ID."
steps:
- name: get-order
type: call
call: "shopify-ecom.get-order"
with:
order_id: "{{shopify_order_id}}"
- name: create-sap-order
type: call
call: "sap-ecom.create-sales-order"
with:
customer: "{{get-order.customer.email}}"
items: "{{get-order.line_items}}"
total: "{{get-order.total_price}}"
- name: update-sf
type: call
call: "salesforce-ecom.create-order-record"
with:
shopify_id: "{{shopify_order_id}}"
sap_order: "{{create-sap-order.order_number}}"
status: "Processing"
- name: notify-team
type: call
call: "msteams-ecom.post-message"
with:
channel_id: "$secrets.teams_ecom_channel_id"
message: "New order synced: Shopify {{shopify_order_id}} → SAP {{create-sap-order.order_number}} | Total: ${{get-order.total_price}}"
consumes:
- type: http
namespace: shopify-ecom
baseUri: "https://anheuser-busch.myshopify.com/admin/api/2024-01"
authentication:
type: bearer
token: "$secrets.shopify_access_token"
resources:
- name: orders
path: "/orders/{{order_id}}.json"
operations:
- name: get-order
method: GET
- type: http
namespace: sap-ecom
baseUri: "https://anheuser-busch-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: salesforce-ecom
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: orders
path: "/sobjects/Order__c"
operations:
- name: create-order-record
method: POST
- type: http
namespace: msteams-ecom
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
When a termination is recorded in Workday, revokes Microsoft 365 access, closes open ServiceNow tickets, and notifies the HR team in Teams.
naftiko: "0.5"
info:
label: "Employee Offboarding Workflow"
description: "When a termination is recorded in Workday, revokes Microsoft 365 access, closes open ServiceNow tickets, and notifies the HR team in Teams."
tags:
- hr
- offboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-employee-offboarding
description: "Given a Workday employee ID and termination date, disable the M365 account, close open ServiceNow tasks, and notify HR in Teams."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the departing employee."
- name: termination_date
in: body
type: string
description: "The termination effective date in ISO 8601 format."
steps:
- name: get-worker
type: call
call: "workday-off.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: disable-m365
type: call
call: "msgraph-off.disable-user"
with:
user_principal_name: "{{get-worker.work_email}}"
- name: notify-hr
type: call
call: "msteams-off.send-message"
with:
recipient_upn: "hr-ops@anheuser-busch.com"
message: "Offboarding complete for {{get-worker.full_name}} (effective: {{termination_date}}). M365 access disabled."
consumes:
- type: http
namespace: workday-off
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/anheuser-busch/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: msgraph-off
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_principal_name}}"
inputParameters:
- name: user_principal_name
in: path
operations:
- name: disable-user
method: PATCH
- type: http
namespace: msteams-off
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Microsoft Teams welcome message.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions Microsoft 365 access, and sends a Microsoft Teams welcome message."
tags:
- hr
- onboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-employee-onboarding
description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence: create a ServiceNow ticket, provision M365 access, and send a Teams welcome message."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "The employee start date in ISO 8601 format."
- name: department
in: body
type: string
description: "The department the new hire is joining."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: create-onboarding-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-worker.full_name}}"
category: "hr_onboarding"
assignment_group: "IT_Onboarding"
- name: provision-m365
type: call
call: "msgraph.assign-license"
with:
user_principal_name: "{{get-worker.work_email}}"
sku_id: "enterprisepack"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-worker.work_email}}"
message: "Welcome to Anheuser-Busch, {{get-worker.first_name}}! Your IT onboarding ticket is {{create-onboarding-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: "/anheuser-busch/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: user-licenses
path: "/users/{{user_principal_name}}/assignLicense"
inputParameters:
- name: user_principal_name
in: path
operations:
- name: assign-license
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Queries Workday for employees with overdue safety training, creates a ServiceNow task for HR, and notifies the compliance Teams channel.
naftiko: "0.5"
info:
label: "Employee Training Compliance Check"
description: "Queries Workday for employees with overdue safety training, creates a ServiceNow task for HR, and notifies the compliance Teams channel."
tags:
- hr
- workday
- servicenow
- microsoft-teams
- compliance
capability:
exposes:
- type: mcp
namespace: training-ops
port: 8080
tools:
- name: check-training-compliance
description: "Given a department, find employees with overdue training in Workday, create a ServiceNow task, and notify compliance via Teams."
inputParameters:
- name: department
in: body
type: string
description: "The department name to check training compliance."
steps:
- name: get-overdue
type: call
call: "workday-training.get-overdue-training"
with:
department: "{{department}}"
- name: create-task
type: call
call: "servicenow-training.create-task"
with:
short_description: "Overdue training: {{get-overdue.count}} employees in {{department}}"
description: "Employees: {{get-overdue.employee_names}}"
- name: notify-compliance
type: call
call: "msteams-training.post-message"
with:
channel_id: "$secrets.teams_compliance_channel_id"
message: "Training Compliance Alert: {{get-overdue.count}} employees in {{department}} have overdue safety training | Task: {{create-task.number}}"
consumes:
- type: http
namespace: workday-training
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: training
path: "/workers"
operations:
- name: get-overdue-training
method: GET
- type: http
namespace: servicenow-training
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams-training
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Pulls event sponsorship costs from SAP, social media reach from Snowflake, and posts an ROI summary to the marketing Teams channel.
naftiko: "0.5"
info:
label: "Event Sponsorship ROI Tracker"
description: "Pulls event sponsorship costs from SAP, social media reach from Snowflake, and posts an ROI summary to the marketing Teams channel."
tags:
- marketing
- sap
- snowflake
- microsoft-teams
- sponsorship
capability:
exposes:
- type: mcp
namespace: sponsorship-ops
port: 8080
tools:
- name: track-sponsorship-roi
description: "Given an event ID, pull SAP sponsorship costs, Snowflake social reach metrics, and post ROI summary to the marketing Teams channel."
inputParameters:
- name: event_id
in: body
type: string
description: "The event sponsorship identifier."
steps:
- name: get-costs
type: call
call: "sap-sponsor.get-event-costs"
with:
event: "{{event_id}}"
- name: get-reach
type: call
call: "snowflake-sponsor.query-social-reach"
with:
event: "{{event_id}}"
- name: post-roi
type: call
call: "msteams-sponsor.post-message"
with:
channel_id: "$secrets.teams_marketing_channel_id"
message: "Sponsorship ROI: Event {{event_id}} | Cost: ${{get-costs.total_cost}} | Impressions: {{get-reach.total_impressions}} | Engagements: {{get-reach.total_engagements}} | CPE: ${{get-reach.cost_per_engagement}}"
consumes:
- type: http
namespace: sap-sponsor
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_COSTCENTER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: costs
path: "/A_CostCenter"
operations:
- name: get-event-costs
method: GET
- type: http
namespace: snowflake-sponsor
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-social-reach
method: POST
- type: http
namespace: msteams-sponsor
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Pulls production volumes from SAP, calculates excise tax obligations in Snowflake, and creates a Jira task for the tax team to review and file.
naftiko: "0.5"
info:
label: "Excise Tax Calculation and Filing"
description: "Pulls production volumes from SAP, calculates excise tax obligations in Snowflake, and creates a Jira task for the tax team to review and file."
tags:
- finance
- sap
- snowflake
- jira
- tax
- compliance
capability:
exposes:
- type: mcp
namespace: tax-ops
port: 8080
tools:
- name: calculate-excise-tax
description: "Given a plant code and tax period, pull SAP production volumes, calculate excise obligations in Snowflake, and create a Jira review task."
inputParameters:
- name: plant_code
in: body
type: string
description: "The brewery plant code."
- name: tax_period
in: body
type: string
description: "The tax period in YYYY-MM format."
steps:
- name: get-volumes
type: call
call: "sap-tax.get-production-volumes"
with:
plant: "{{plant_code}}"
period: "{{tax_period}}"
- name: calculate-tax
type: call
call: "snowflake-tax.run-tax-calculation"
with:
plant: "{{plant_code}}"
period: "{{tax_period}}"
volume: "{{get-volumes.total_barrels}}"
- name: create-review
type: call
call: "jira-tax.create-issue"
with:
project: "TAX"
summary: "Excise tax review: {{plant_code}} for {{tax_period}}"
description: "Volume: {{get-volumes.total_barrels}} bbl | Estimated tax: ${{calculate-tax.estimated_tax}} | Rate: ${{calculate-tax.rate_per_barrel}}/bbl"
consumes:
- type: http
namespace: sap-tax
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCTION_ORDERS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production
path: "/A_ProductionOrder"
operations:
- name: get-production-volumes
method: GET
- type: http
namespace: snowflake-tax
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-tax-calculation
method: POST
- type: http
namespace: jira-tax
baseUri: "https://anheuser-busch.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 the fleet management system for vehicles due for service, creates SAP PM work orders, and notifies the fleet operations Teams channel.
naftiko: "0.5"
info:
label: "Fleet Vehicle Maintenance Tracker"
description: "Queries the fleet management system for vehicles due for service, creates SAP PM work orders, and notifies the fleet operations Teams channel."
tags:
- logistics
- sap
- microsoft-teams
- fleet-management
capability:
exposes:
- type: mcp
namespace: fleet-ops
port: 8080
tools:
- name: track-fleet-maintenance
description: "Given a fleet region, find vehicles due for maintenance, create SAP work orders, and notify fleet ops via Teams."
inputParameters:
- name: fleet_region
in: body
type: string
description: "The fleet operations region."
steps:
- name: get-due-vehicles
type: call
call: "sap-fleet.get-maintenance-due"
with:
region: "{{fleet_region}}"
- name: create-orders
type: call
call: "sap-fleet.create-work-order"
with:
vehicles: "{{get-due-vehicles.vehicle_ids}}"
order_type: "PM02"
- name: notify-fleet
type: call
call: "msteams-fleet.post-message"
with:
channel_id: "$secrets.teams_fleet_channel_id"
message: "Fleet Maintenance: {{get-due-vehicles.count}} vehicles due in {{fleet_region}} | Orders: {{create-orders.order_numbers}}"
consumes:
- type: http
namespace: sap-fleet
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: maintenance
path: "/MaintenanceNotification"
operations:
- name: get-maintenance-due
method: GET
- name: create-work-order
method: POST
- type: http
namespace: msteams-fleet
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
On a GitHub Actions pipeline failure, creates a Jira bug, annotates Datadog, and alerts the engineering team in Teams.
naftiko: "0.5"
info:
label: "GitHub CI/CD Pipeline Failure Response"
description: "On a GitHub Actions pipeline failure, creates a Jira bug, annotates Datadog, and alerts the engineering team in Teams."
tags:
- devops
- cicd
- github
- jira
- datadog
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devops-cicd
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions workflow failure, create a Datadog event marker, open a Jira bug, and alert the engineering Teams channel."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository in org/repo format."
- name: workflow_name
in: body
type: string
description: "The GitHub Actions workflow name that failed."
- name: branch_name
in: body
type: string
description: "The branch where the failure occurred."
- name: commit_sha
in: body
type: string
description: "The commit SHA that triggered the workflow."
- name: run_url
in: body
type: string
description: "URL to the failed GitHub Actions run."
steps:
- name: create-dd-event
type: call
call: "datadog-cicd.create-event"
with:
title: "Pipeline failure: {{repo_name}}"
text: "Workflow {{workflow_name}} failed on {{branch_name}} at {{commit_sha}}"
alert_type: "error"
- name: create-jira-bug
type: call
call: "jira.create-issue"
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repo_name}} / {{branch_name}} — {{workflow_name}}"
description: "Pipeline failure on {{branch_name}}. Commit: {{commit_sha}}. Run: {{run_url}}."
- name: notify-engineering
type: call
call: "msteams-cicd.post-channel-message"
with:
channel_id: "engineering-alerts"
message: "Pipeline Failure: {{repo_name}} | Branch: {{branch_name}} | Jira: {{create-jira-bug.key}} | Run: {{run_url}}"
consumes:
- type: http
namespace: datadog-cicd
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: jira
baseUri: "https://anheuser-busch.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-cicd
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When Dependabot flags a critical vulnerability, creates a Jira security ticket and notifies the security team via Teams.
naftiko: "0.5"
info:
label: "GitHub Dependency Vulnerability Remediation"
description: "When Dependabot flags a critical vulnerability, creates a Jira security ticket and notifies the security team via Teams."
tags:
- security
- github
- jira
- microsoft-teams
- vulnerability-management
capability:
exposes:
- type: mcp
namespace: vuln-ops
port: 8080
tools:
- name: remediate-dependency-vulnerability
description: "Given a GitHub advisory ID and repository, create a Jira security ticket and notify the security team via Teams."
inputParameters:
- name: repo
in: body
type: string
description: "The GitHub repository in org/repo format."
- name: advisory_id
in: body
type: string
description: "The GitHub security advisory ID."
steps:
- name: get-advisory
type: call
call: "github-vuln.get-advisory"
with:
repo: "{{repo}}"
advisory_id: "{{advisory_id}}"
- name: create-ticket
type: call
call: "jira-vuln.create-issue"
with:
project: "SEC"
summary: "Vulnerability: {{get-advisory.summary}} in {{repo}}"
description: "Severity: {{get-advisory.severity}} | Package: {{get-advisory.package}} | Fixed in: {{get-advisory.patched_version}}"
priority: "High"
- name: notify-security
type: call
call: "msteams-vuln.post-message"
with:
channel_id: "$secrets.teams_security_channel_id"
message: "VULNERABILITY: {{get-advisory.severity}} in {{repo}} | Package: {{get-advisory.package}} | Jira: {{create-ticket.key}}"
consumes:
- type: http
namespace: github-vuln
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: advisories
path: "/repos/{{repo}}/security-advisories/{{advisory_id}}"
operations:
- name: get-advisory
method: GET
- type: http
namespace: jira-vuln
baseUri: "https://anheuser-busch.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-vuln
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Checks the latest commit status and open pull request count for a GitHub repository.
naftiko: "0.5"
info:
label: "GitHub Repository Status Check"
description: "Checks the latest commit status and open pull request count for a GitHub repository."
tags:
- devops
- github
- ci-cd
capability:
exposes:
- type: mcp
namespace: github
port: 8080
tools:
- name: get-repo-status
description: "Query a GitHub repository for latest commit status and open PR count."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository name in org/repo format."
call: "github.get-repo"
with:
repo: "{{repo_name}}"
outputParameters:
- name: default_branch
type: string
mapping: "$.default_branch"
- name: open_issues
type: number
mapping: "$.open_issues_count"
- name: language
type: string
mapping: "$.language"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: repos
path: "/repos/{{repo}}"
inputParameters:
- name: repo
in: path
operations:
- name: get-repo
method: GET
Queries Snowflake for brand sentiment and market share data, updates Salesforce brand health records, and triggers a Power BI dashboard refresh.
naftiko: "0.5"
info:
label: "Global Brand Health Dashboard Refresh"
description: "Queries Snowflake for brand sentiment and market share data, updates Salesforce brand health records, and triggers a Power BI dashboard refresh."
tags:
- marketing
- snowflake
- salesforce
- power-bi
- brand-management
capability:
exposes:
- type: mcp
namespace: brand-health
port: 8080
tools:
- name: refresh-brand-health
description: "Given a brand code, pull Snowflake sentiment data, update Salesforce brand health record, and refresh the Power BI dashboard."
inputParameters:
- name: brand_code
in: body
type: string
description: "The brand code (e.g. BUD, STEL, BECK)."
steps:
- name: get-brand-data
type: call
call: "snowflake-brand.query-brand-health"
with:
brand: "{{brand_code}}"
- name: update-sf
type: call
call: "salesforce-brand.update-brand-health"
with:
brand_code: "{{brand_code}}"
sentiment_score: "{{get-brand-data.sentiment}}"
market_share: "{{get-brand-data.market_share}}"
- name: refresh-dashboard
type: call
call: "powerbi-brand.trigger-refresh"
with:
dataset_id: "$secrets.powerbi_brand_dataset_id"
consumes:
- type: http
namespace: snowflake-brand
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-brand-health
method: POST
- type: http
namespace: salesforce-brand
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: brands
path: "/sobjects/Brand_Health__c"
operations:
- name: update-brand-health
method: PATCH
- type: http
namespace: powerbi-brand
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: refreshes
path: "/datasets/{{dataset_id}}/refreshes"
operations:
- name: trigger-refresh
method: POST
Pulls supplier delivery and quality metrics from SAP and Snowflake, generates a scorecard, and distributes via Salesforce and Teams.
naftiko: "0.5"
info:
label: "Ingredient Supplier Scorecard Generator"
description: "Pulls supplier delivery and quality metrics from SAP and Snowflake, generates a scorecard, and distributes via Salesforce and Teams."
tags:
- procurement
- sap
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supplier-scorecard
port: 8080
tools:
- name: generate-supplier-scorecard
description: "Given a vendor number, pull SAP delivery metrics and Snowflake quality data, update Salesforce scorecard, and post to procurement Teams channel."
inputParameters:
- name: vendor_number
in: body
type: string
description: "The SAP vendor number."
- name: period
in: body
type: string
description: "The evaluation period in YYYY-QN format."
steps:
- name: get-delivery-metrics
type: call
call: "sap-scorecard.get-vendor-performance"
with:
vendor: "{{vendor_number}}"
period: "{{period}}"
- name: get-quality-metrics
type: call
call: "snowflake-scorecard.query-quality-metrics"
with:
vendor: "{{vendor_number}}"
period: "{{period}}"
- name: update-sf-scorecard
type: call
call: "salesforce-scorecard.update-scorecard"
with:
vendor_id: "{{vendor_number}}"
delivery_score: "{{get-delivery-metrics.on_time_rate}}"
quality_score: "{{get-quality-metrics.pass_rate}}"
- name: notify-procurement
type: call
call: "msteams-scorecard.post-message"
with:
channel_id: "$secrets.teams_procurement_channel_id"
message: "Supplier Scorecard: {{vendor_number}} ({{period}}) | Delivery: {{get-delivery-metrics.on_time_rate}}% | Quality: {{get-quality-metrics.pass_rate}}% | Overall: {{get-quality-metrics.overall_score}}"
consumes:
- type: http
namespace: sap-scorecard
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: vendors
path: "/A_Supplier('{{vendor}}')"
operations:
- name: get-vendor-performance
method: GET
- type: http
namespace: snowflake-scorecard
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-quality-metrics
method: POST
- type: http
namespace: salesforce-scorecard
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: scorecards
path: "/sobjects/Supplier_Scorecard__c"
operations:
- name: update-scorecard
method: PATCH
- type: http
namespace: msteams-scorecard
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
When a complex ServiceNow incident is created, submits the description to OpenAI for AI-assisted triage and resolution recommendations, then updates the ticket.
naftiko: "0.5"
info:
label: "Intelligent Incident Triage with OpenAI"
description: "When a complex ServiceNow incident is created, submits the description to OpenAI for AI-assisted triage and resolution recommendations, then updates the ticket."
tags:
- ai
- itsm
- servicenow
- openai
- incident-response
capability:
exposes:
- type: mcp
namespace: ai-triage
port: 8080
tools:
- name: triage-incident-with-ai
description: "Given a ServiceNow incident number, retrieve the incident details, submit to OpenAI for triage analysis, and update the record with AI-generated resolution recommendations."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number, e.g. INC0054321."
steps:
- name: get-incident
type: call
call: "servicenow-ai.get-incident"
with:
number: "{{incident_number}}"
- name: analyze-incident
type: call
call: "openai.create-completion"
with:
model: "gpt-4o"
prompt: "Analyze this IT incident: 1) Probable root cause, 2) Recommended resolution steps, 3) Priority. Incident: {{get-incident.short_description}} — {{get-incident.description}}"
- name: update-incident
type: call
call: "servicenow-ai.update-incident"
with:
number: "{{incident_number}}"
work_notes: "AI Analysis: {{analyze-incident.text}}"
consumes:
- type: http
namespace: servicenow-ai
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
inputParameters:
- name: number
in: query
- name: update-incident
method: PATCH
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
When a vendor invoice arrives in SAP Ariba, validates it against the SAP purchase order and routes it for approval via ServiceNow, notifying the finance team in Teams.
naftiko: "0.5"
info:
label: "Invoice Processing and Approval"
description: "When a vendor invoice arrives in SAP Ariba, validates it against the SAP purchase order and routes it for approval via ServiceNow, notifying the finance team in Teams."
tags:
- finance
- procurement
- sap-ariba
- servicenow
- invoice-processing
capability:
exposes:
- type: mcp
namespace: finance-ap
port: 8080
tools:
- name: process-vendor-invoice
description: "Given an Ariba invoice ID and SAP PO number, fetch the invoice details, create a ServiceNow approval task, and notify the AP team in Teams."
inputParameters:
- name: ariba_invoice_id
in: body
type: string
description: "The SAP Ariba invoice identifier."
- name: po_number
in: body
type: string
description: "The SAP purchase order number to validate against."
- name: vendor_name
in: body
type: string
description: "The vendor name for notification context."
steps:
- name: get-invoice
type: call
call: "sap-ariba.get-invoice"
with:
invoice_id: "{{ariba_invoice_id}}"
- name: create-approval-task
type: call
call: "servicenow-ap.create-task"
with:
short_description: "Invoice approval: {{vendor_name}} — {{ariba_invoice_id}}"
description: "Invoice {{ariba_invoice_id}} from {{vendor_name}} against PO {{po_number}}. Amount: {{get-invoice.total_amount}} {{get-invoice.currency}}."
assignment_group: "Finance_AP"
- name: notify-ap-team
type: call
call: "msteams-ap.send-message"
with:
recipient_upn: "finance-ap@anheuser-busch.com"
message: "Invoice {{ariba_invoice_id}} from {{vendor_name}} pending approval. PO: {{po_number}}. Task: {{create-approval-task.number}}."
consumes:
- type: http
namespace: sap-ariba
baseUri: "https://openapi.ariba.com/api/invoice/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: invoices
path: "/invoices/{{invoice_id}}"
inputParameters:
- name: invoice_id
in: path
operations:
- name: get-invoice
method: GET
- type: http
namespace: servicenow-ap
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams-ap
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
When a critical Datadog alert fires in the Anheuser-Busch environment, creates a ServiceNow incident and posts an alert to the IT operations Teams channel.
naftiko: "0.5"
info:
label: "IT Incident Response Chain"
description: "When a critical Datadog alert fires in the Anheuser-Busch environment, creates a ServiceNow incident and posts an alert to the IT operations Teams channel."
tags:
- itsm
- incident-response
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: it-ops
port: 8080
tools:
- name: handle-critical-alert
description: "Given a Datadog alert ID, affected service, and severity, create a ServiceNow incident and notify the IT ops Teams channel."
inputParameters:
- name: alert_id
in: body
type: string
description: "The Datadog alert or monitor ID."
- name: service_name
in: body
type: string
description: "The name of the affected service or application."
- name: severity
in: body
type: string
description: "Alert severity: critical, high, medium, or low."
- name: alert_message
in: body
type: string
description: "The alert message body from Datadog."
steps:
- name: create-incident
type: call
call: "servicenow-ops.create-incident"
with:
short_description: "{{severity}} alert: {{service_name}} — {{alert_id}}"
description: "{{alert_message}}"
urgency: "1"
impact: "1"
assignment_group: "IT_Operations"
- name: post-alert
type: call
call: "msteams-ops.post-channel-message"
with:
channel_id: "it-ops-alerts"
message: "INCIDENT: {{severity}} on {{service_name}} | Datadog: {{alert_id}} | SNOW: {{create-incident.number}}"
consumes:
- type: http
namespace: servicenow-ops
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-ops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Retrieves a Jira issue by key, returning summary, status, assignee, and priority.
naftiko: "0.5"
info:
label: "Jira Issue Status Lookup"
description: "Retrieves a Jira issue by key, returning summary, status, assignee, and priority."
tags:
- project-management
- jira
- agile
capability:
exposes:
- type: mcp
namespace: jira
port: 8080
tools:
- name: get-issue
description: "Look up a Jira issue by key. Returns summary, current status, assignee, and priority."
inputParameters:
- name: issue_key
in: body
type: string
description: "The Jira issue key (e.g. BREW-1234)."
call: "jira.get-issue"
with:
key: "{{issue_key}}"
outputParameters:
- name: summary
type: string
mapping: "$.fields.summary"
- name: status
type: string
mapping: "$.fields.status.name"
- name: assignee
type: string
mapping: "$.fields.assignee.displayName"
- name: priority
type: string
mapping: "$.fields.priority.name"
consumes:
- type: http
namespace: jira
baseUri: "https://anheuser-busch.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue/{{key}}"
inputParameters:
- name: key
in: path
operations:
- name: get-issue
method: GET
Generates a daily sprint status digest from Jira and posts it to the engineering Teams channel for stand-up preparation.
naftiko: "0.5"
info:
label: "Jira Sprint Digest Report"
description: "Generates a daily sprint status digest from Jira and posts it to the engineering Teams channel for stand-up preparation."
tags:
- devops
- jira
- reporting
- sprint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sprint-reporting
port: 8080
tools:
- name: digest-sprint-status
description: "Given a Jira project key and sprint name, fetch all sprint issues and post a summary digest to the engineering Teams channel."
inputParameters:
- name: project_key
in: body
type: string
description: "The Jira project key, e.g. TECH."
- name: sprint_name
in: body
type: string
description: "The Jira sprint name to summarize."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel ID to post the digest to."
steps:
- name: get-sprint-issues
type: call
call: "jira-sprint.search-issues"
with:
jql: "project = {{project_key}} AND sprint = '{{sprint_name}}'"
- name: post-digest
type: call
call: "msteams-sprint.post-channel-message"
with:
channel_id: "{{teams_channel_id}}"
message: "Sprint Digest — {{project_key}} / {{sprint_name}}: Total: {{get-sprint-issues.total}} | Done: {{get-sprint-issues.done_count}} | In Progress: {{get-sprint-issues.inprogress_count}} | Blocked: {{get-sprint-issues.blocked_count}}"
consumes:
- type: http
namespace: jira-sprint
baseUri: "https://anheuser-busch.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/search"
operations:
- name: search-issues
method: GET
inputParameters:
- name: jql
in: query
- type: http
namespace: msteams-sprint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Tracks keg inventory from SAP, updates deposit records in Salesforce, and alerts the logistics team via Teams when return rates drop below threshold.
naftiko: "0.5"
info:
label: "Keg Tracking and Deposit Management"
description: "Tracks keg inventory from SAP, updates deposit records in Salesforce, and alerts the logistics team via Teams when return rates drop below threshold."
tags:
- logistics
- sap
- salesforce
- microsoft-teams
- asset-management
capability:
exposes:
- type: mcp
namespace: keg-ops
port: 8080
tools:
- name: track-keg-deposits
description: "Given a region code, pull keg inventory from SAP, update Salesforce deposit records, and alert logistics if return rates are low."
inputParameters:
- name: region
in: body
type: string
description: "The distribution region code."
steps:
- name: get-keg-inventory
type: call
call: "sap-keg.get-returnable-stock"
with:
region: "{{region}}"
- name: update-deposits
type: call
call: "salesforce-keg.update-deposit-summary"
with:
region: "{{region}}"
outstanding: "{{get-keg-inventory.outstanding_kegs}}"
return_rate: "{{get-keg-inventory.return_rate}}"
- name: alert-logistics
type: call
call: "msteams-keg.post-message"
with:
channel_id: "$secrets.teams_logistics_channel_id"
message: "Keg Tracking — {{region}}: Outstanding {{get-keg-inventory.outstanding_kegs}} | Return Rate {{get-keg-inventory.return_rate}}% | Deposit Value ${{get-keg-inventory.deposit_value}}"
consumes:
- type: http
namespace: sap-keg
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: returnable-stock
path: "/A_MatlStkInAcctMod"
operations:
- name: get-returnable-stock
method: GET
- type: http
namespace: salesforce-keg
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: deposits
path: "/sobjects/Keg_Deposit__c"
operations:
- name: update-deposit-summary
method: PATCH
- type: http
namespace: msteams-keg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Pulls LinkedIn company page analytics, compares against hiring targets in Workday, and posts a weekly employer brand digest to the talent acquisition Teams channel.
naftiko: "0.5"
info:
label: "LinkedIn Employer Brand Performance Digest"
description: "Pulls LinkedIn company page analytics, compares against hiring targets in Workday, and posts a weekly employer brand digest to the talent acquisition Teams channel."
tags:
- hr
- linkedin
- workday
- microsoft-teams
- employer-brand
capability:
exposes:
- type: mcp
namespace: employer-brand
port: 8080
tools:
- name: generate-employer-brand-digest
description: "Pull LinkedIn page analytics, compare with Workday hiring metrics, and post a digest to the talent acquisition Teams channel."
inputParameters:
- name: period
in: body
type: string
description: "The reporting period (e.g. last_7_days)."
steps:
- name: get-linkedin-stats
type: call
call: "linkedin-eb.get-page-analytics"
with:
period: "{{period}}"
- name: get-hiring-metrics
type: call
call: "workday-eb.get-open-requisitions"
with:
status: "open"
- name: post-digest
type: call
call: "msteams-eb.post-message"
with:
channel_id: "$secrets.teams_ta_channel_id"
message: "Employer Brand Digest: Followers {{get-linkedin-stats.follower_count}} (+{{get-linkedin-stats.new_followers}}) | Impressions {{get-linkedin-stats.impressions}} | Open Reqs: {{get-hiring-metrics.open_count}} | Applicants: {{get-hiring-metrics.total_applicants}}"
consumes:
- type: http
namespace: linkedin-eb
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: analytics
path: "/organizationalEntityShareStatistics"
operations:
- name: get-page-analytics
method: GET
- type: http
namespace: workday-eb
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: requisitions
path: "/jobRequisitions"
operations:
- name: get-open-requisitions
method: GET
- type: http
namespace: msteams-eb
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
When a candidate applies via LinkedIn Recruiter, enriches their profile in Workday Recruiting and notifies the hiring manager in Teams.
naftiko: "0.5"
info:
label: "LinkedIn Talent Acquisition Signal"
description: "When a candidate applies via LinkedIn Recruiter, enriches their profile in Workday Recruiting and notifies the hiring manager in Teams."
tags:
- hr
- recruiting
- linkedin
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: enrich-candidate-profile
description: "Given a LinkedIn member URN and Workday job requisition ID, fetch the LinkedIn profile, create the candidate record in Workday, and notify the hiring manager via Teams."
inputParameters:
- name: linkedin_member_urn
in: body
type: string
description: "The LinkedIn member URN for the candidate."
- name: job_req_id
in: body
type: string
description: "The Workday job requisition ID."
- name: hiring_manager_upn
in: body
type: string
description: "The UPN of the hiring manager to notify."
steps:
- name: get-linkedin-profile
type: call
call: "linkedin.get-profile"
with:
member_urn: "{{linkedin_member_urn}}"
- name: create-candidate
type: call
call: "workday-recruit.create-candidate"
with:
job_req_id: "{{job_req_id}}"
first_name: "{{get-linkedin-profile.firstName}}"
last_name: "{{get-linkedin-profile.lastName}}"
headline: "{{get-linkedin-profile.headline}}"
- name: notify-hiring-manager
type: call
call: "msteams-recruit.send-message"
with:
recipient_upn: "{{hiring_manager_upn}}"
message: "New candidate: {{get-linkedin-profile.firstName}} {{get-linkedin-profile.lastName}} applied for req {{job_req_id}}. Workday ID: {{create-candidate.candidate_id}}."
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: profiles
path: "/people/{{member_urn}}"
inputParameters:
- name: member_urn
in: path
operations:
- name: get-profile
method: GET
- type: http
namespace: workday-recruit
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: candidates
path: "/anheuser-busch/jobRequisitions/{{job_req_id}}/candidates"
inputParameters:
- name: job_req_id
in: path
operations:
- name: create-candidate
method: POST
- type: http
namespace: msteams-recruit
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
Validates new product readiness by checking SAP material master, Salesforce product listing, and Snowflake demand forecast, then summarizes in Teams.
naftiko: "0.5"
info:
label: "New Product Launch Readiness Check"
description: "Validates new product readiness by checking SAP material master, Salesforce product listing, and Snowflake demand forecast, then summarizes in Teams."
tags:
- product-management
- sap
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: product-launch
port: 8080
tools:
- name: check-launch-readiness
description: "Given a material number, validate SAP setup, Salesforce product listing, and demand forecast, then post readiness summary to Teams."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number for the new product."
steps:
- name: check-sap
type: call
call: "sap-launch.get-material"
with:
material: "{{material_number}}"
- name: check-sf
type: call
call: "salesforce-launch.get-product"
with:
material: "{{material_number}}"
- name: check-forecast
type: call
call: "snowflake-launch.query-forecast"
with:
material: "{{material_number}}"
- name: post-readiness
type: call
call: "msteams-launch.post-message"
with:
channel_id: "$secrets.teams_product_channel_id"
message: "Launch Readiness: {{material_number}} | SAP: {{check-sap.status}} | SF Listing: {{check-sf.active}} | Forecast: {{check-forecast.projected_units}} units"
consumes:
- type: http
namespace: sap-launch
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Product('{{material}}')"
operations:
- name: get-material
method: GET
- type: http
namespace: salesforce-launch
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: products
path: "/sobjects/Product2"
operations:
- name: get-product
method: GET
- type: http
namespace: snowflake-launch
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-forecast
method: POST
- type: http
namespace: msteams-launch
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Retrieves users with privileged Okta group memberships, cross-references with Workday active employee status, and creates a Jira task for access review.
naftiko: "0.5"
info:
label: "Okta Privileged Access Review"
description: "Retrieves users with privileged Okta group memberships, cross-references with Workday active employee status, and creates a Jira task for access review."
tags:
- security
- okta
- workday
- jira
- access-management
capability:
exposes:
- type: mcp
namespace: access-review
port: 8080
tools:
- name: review-privileged-access
description: "Given an Okta group name, list members, verify employment in Workday, and create a Jira review task for terminated employees with active access."
inputParameters:
- name: group_name
in: body
type: string
description: "The Okta group name for privileged access."
steps:
- name: get-members
type: call
call: "okta-review.get-group-members"
with:
group: "{{group_name}}"
- name: check-employment
type: call
call: "workday-review.get-active-status"
with:
employee_ids: "{{get-members.employee_ids}}"
- name: create-review
type: call
call: "jira-review.create-issue"
with:
project: "SEC"
summary: "Privileged access review: {{group_name}}"
description: "Total members: {{get-members.count}} | Flagged for review: {{check-employment.flagged_count}} | Details: {{check-employment.flagged_users}}"
consumes:
- type: http
namespace: okta-review
baseUri: "https://anheuser-busch.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: groups
path: "/groups/{{group}}/users"
operations:
- name: get-group-members
method: GET
- type: http
namespace: workday-review
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers"
operations:
- name: get-active-status
method: GET
- type: http
namespace: jira-review
baseUri: "https://anheuser-busch.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
Checks an Okta user account status by login email, returning account state, last login, and MFA enrollment.
naftiko: "0.5"
info:
label: "Okta User Status Check"
description: "Checks an Okta user account status by login email, returning account state, last login, and MFA enrollment."
tags:
- identity
- okta
- security
capability:
exposes:
- type: mcp
namespace: okta
port: 8080
tools:
- name: get-user-status
description: "Look up an Okta user by login. Returns account status, last login timestamp, and MFA status."
inputParameters:
- name: user_login
in: body
type: string
description: "The Okta user login (email address)."
call: "okta.get-user"
with:
login: "{{user_login}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: last_login
type: string
mapping: "$.lastLogin"
- name: name
type: string
mapping: "$.profile.displayName"
consumes:
- type: http
namespace: okta
baseUri: "https://anheuser-busch.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users/{{login}}"
inputParameters:
- name: login
in: path
operations:
- name: get-user
method: GET
Retrieves on-premise account data from Salesforce, identifies accounts overdue for visits based on Snowflake activity, and creates Jira tasks for sales reps.
naftiko: "0.5"
info:
label: "On-Premise Account Visit Planner"
description: "Retrieves on-premise account data from Salesforce, identifies accounts overdue for visits based on Snowflake activity, and creates Jira tasks for sales reps."
tags:
- sales
- salesforce
- snowflake
- jira
- field-sales
capability:
exposes:
- type: mcp
namespace: visit-planner
port: 8080
tools:
- name: plan-account-visits
description: "Given a territory, identify on-premise accounts overdue for visits and create Jira tasks for field reps."
inputParameters:
- name: territory
in: body
type: string
description: "The sales territory code."
steps:
- name: get-accounts
type: call
call: "salesforce-visit.get-overdue-accounts"
with:
territory: "{{territory}}"
- name: get-activity
type: call
call: "snowflake-visit.query-recent-activity"
with:
territory: "{{territory}}"
- name: create-tasks
type: call
call: "jira-visit.create-issue"
with:
project: "SALES"
summary: "Account visit plan: {{territory}} — {{get-accounts.overdue_count}} accounts overdue"
description: "Priority accounts: {{get-accounts.priority_names}} | Days since last visit: {{get-activity.avg_days_since_visit}}"
consumes:
- type: http
namespace: salesforce-visit
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/query"
operations:
- name: get-overdue-accounts
method: GET
- type: http
namespace: snowflake-visit
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-recent-activity
method: POST
- type: http
namespace: jira-visit
baseUri: "https://anheuser-busch.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
Retrieves product attributes from SAP, generates marketing copy using OpenAI, and updates the Salesforce product record with the new description.
naftiko: "0.5"
info:
label: "OpenAI Product Description Generator"
description: "Retrieves product attributes from SAP, generates marketing copy using OpenAI, and updates the Salesforce product record with the new description."
tags:
- marketing
- ai
- openai
- sap
- salesforce
capability:
exposes:
- type: mcp
namespace: content-gen
port: 8080
tools:
- name: generate-product-description
description: "Given a material number, pull SAP product attributes, generate marketing copy via OpenAI, and update the Salesforce product listing."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
- name: tone
in: body
type: string
description: "The desired tone (e.g. casual, premium, festive)."
steps:
- name: get-product
type: call
call: "sap-content.get-material"
with:
material: "{{material_number}}"
- name: generate-copy
type: call
call: "openai-content.create-completion"
with:
model: "gpt-4o"
prompt: "Write a compelling {{tone}} product description for: {{get-product.description}} | ABV: {{get-product.abv}} | Style: {{get-product.style}} | Package: {{get-product.package_type}}"
- name: update-sf
type: call
call: "salesforce-content.update-product"
with:
material: "{{material_number}}"
description: "{{generate-copy.text}}"
consumes:
- type: http
namespace: sap-content
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Product('{{material}}')"
operations:
- name: get-material
method: GET
- type: http
namespace: openai-content
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
- type: http
namespace: salesforce-content
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: products
path: "/sobjects/Product2"
operations:
- name: update-product
method: PATCH
When PagerDuty triggers a critical alert, creates a ServiceNow major incident and notifies the IT leadership Teams channel with runbook links.
naftiko: "0.5"
info:
label: "PagerDuty Critical Alert to Incident"
description: "When PagerDuty triggers a critical alert, creates a ServiceNow major incident and notifies the IT leadership Teams channel with runbook links."
tags:
- incident-response
- pagerduty
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: pagerduty-ops
port: 8080
tools:
- name: escalate-critical-alert
description: "Given a PagerDuty incident ID, create a ServiceNow major incident and alert IT leadership via Teams."
inputParameters:
- name: pd_incident_id
in: body
type: string
description: "The PagerDuty incident ID."
steps:
- name: get-pd-incident
type: call
call: "pagerduty.get-incident"
with:
incident_id: "{{pd_incident_id}}"
- name: create-snow-incident
type: call
call: "servicenow-pd.create-incident"
with:
short_description: "{{get-pd-incident.title}}"
description: "PagerDuty: {{pd_incident_id}} | Service: {{get-pd-incident.service.summary}} | Urgency: {{get-pd-incident.urgency}}"
impact: "1"
urgency: "1"
- name: notify-leadership
type: call
call: "msteams-pd.post-message"
with:
channel_id: "$secrets.teams_it_leadership_channel_id"
message: "CRITICAL: {{get-pd-incident.title}} | Service: {{get-pd-incident.service.summary}} | INC: {{create-snow-incident.number}}"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_api_key"
resources:
- name: incidents
path: "/incidents/{{incident_id}}"
operations:
- name: get-incident
method: GET
- type: http
namespace: servicenow-pd
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-pd
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Returns current headcount by department and cost center from Workday for finance planning and headcount reporting.
naftiko: "0.5"
info:
label: "Payroll Headcount Snapshot"
description: "Returns current headcount by department and cost center from Workday for finance planning and headcount reporting."
tags:
- hr
- finance
- reporting
- workday
- headcount
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: get-headcount-by-department
description: "Returns a list of active Anheuser-Busch employees grouped by department and cost center from Workday. Use for headcount planning and budget reviews."
call: "workday-hc.headcount-report"
outputParameters:
- name: employees
type: array
mapping: "$.data"
consumes:
- type: http
namespace: workday-hc
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: headcount
path: "/anheuser-busch/reports/headcount"
operations:
- name: headcount-report
method: GET
Checks the last refresh status and timestamp for a Power BI dataset.
naftiko: "0.5"
info:
label: "Power BI Dataset Refresh Status"
description: "Checks the last refresh status and timestamp for a Power BI dataset."
tags:
- analytics
- power-bi
- reporting
capability:
exposes:
- type: mcp
namespace: powerbi
port: 8080
tools:
- name: get-refresh-status
description: "Check the latest refresh status for a Power BI dataset. Returns status, start time, and end time."
inputParameters:
- name: dataset_id
in: body
type: string
description: "The Power BI dataset ID."
call: "powerbi.get-refresh"
with:
dataset_id: "{{dataset_id}}"
outputParameters:
- name: status
type: string
mapping: "$.value[0].status"
- name: start_time
type: string
mapping: "$.value[0].startTime"
- name: end_time
type: string
mapping: "$.value[0].endTime"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: get-refresh
method: GET
Triggers a Power BI dataset refresh for the distributor sales report and notifies the sales analytics team in Teams when complete.
naftiko: "0.5"
info:
label: "Power BI Sales Report Refresh"
description: "Triggers a Power BI dataset refresh for the distributor sales report and notifies the sales analytics team in Teams when complete."
tags:
- data
- analytics
- power-bi
- reporting
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: bi-reporting
port: 8080
tools:
- name: refresh-sales-report
description: "Given a Power BI workspace ID and dataset ID, trigger a refresh for the distributor sales dataset and notify the sales analytics Teams channel."
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:
workspace_id: "{{workspace_id}}"
dataset_id: "{{dataset_id}}"
- name: notify-analytics-team
type: call
call: "msteams-bi.post-channel-message"
with:
channel_id: "sales-analytics"
message: "Power BI sales dataset {{dataset_id}} refresh triggered. Refresh ID: {{trigger-refresh.refresh_id}}."
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/groups/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: workspace_id
in: path
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
- type: http
namespace: msteams-bi
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
When a brewery production line reports downtime, creates a maintenance work order in SAP PM, a ServiceNow incident, and alerts the plant operations Teams channel.
naftiko: "0.5"
info:
label: "Production Line Downtime Response"
description: "When a brewery production line reports downtime, creates a maintenance work order in SAP PM, a ServiceNow incident, and alerts the plant operations Teams channel."
tags:
- manufacturing
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: plant-ops
port: 8080
tools:
- name: handle-line-downtime
description: "Given a plant code and production line ID, create a SAP maintenance notification, a ServiceNow incident, and notify plant operations via Teams."
inputParameters:
- name: plant_code
in: body
type: string
description: "The SAP plant code."
- name: line_id
in: body
type: string
description: "The production line identifier."
- name: reason
in: body
type: string
description: "The downtime reason description."
steps:
- name: create-sap-notification
type: call
call: "sap-pm.create-notification"
with:
plant: "{{plant_code}}"
equipment: "{{line_id}}"
description: "{{reason}}"
- name: create-snow-incident
type: call
call: "servicenow-plant.create-incident"
with:
short_description: "Line downtime: {{line_id}} at plant {{plant_code}}"
description: "Reason: {{reason}} | SAP Notification: {{create-sap-notification.notification_id}}"
urgency: "1"
- name: notify-ops
type: call
call: "msteams-plant.post-message"
with:
channel_id: "$secrets.teams_plant_ops_channel_id"
message: "Production Line Down: {{line_id}} at {{plant_code}} | Reason: {{reason}} | SAP: {{create-sap-notification.notification_id}} | INC: {{create-snow-incident.number}}"
consumes:
- type: http
namespace: sap-pm
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MAINTNOTIFICATION"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: notifications
path: "/MaintenanceNotification"
operations:
- name: create-notification
method: POST
- type: http
namespace: servicenow-plant
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-plant
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
When a promotional pricing request is submitted in Salesforce, validates against SAP pricing conditions and routes for approval via ServiceNow.
naftiko: "0.5"
info:
label: "Promotional Pricing Approval Workflow"
description: "When a promotional pricing request is submitted in Salesforce, validates against SAP pricing conditions and routes for approval via ServiceNow."
tags:
- pricing
- salesforce
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: pricing-ops
port: 8080
tools:
- name: process-promo-pricing
description: "Given a Salesforce promo request ID, validate against SAP pricing, and create a ServiceNow approval request."
inputParameters:
- name: promo_request_id
in: body
type: string
description: "The Salesforce promotional pricing request ID."
steps:
- name: get-promo
type: call
call: "salesforce-pricing.get-promo-request"
with:
request_id: "{{promo_request_id}}"
- name: validate-pricing
type: call
call: "sap-pricing.get-condition"
with:
material: "{{get-promo.Material__c}}"
sales_org: "{{get-promo.Sales_Org__c}}"
- name: create-approval
type: call
call: "servicenow-pricing.create-request"
with:
short_description: "Promo pricing approval: {{get-promo.Name}}"
description: "Current price: {{validate-pricing.net_price}} | Requested: {{get-promo.Requested_Price__c}} | Discount: {{get-promo.Discount_Percent__c}}%"
consumes:
- type: http
namespace: salesforce-pricing
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: promo-requests
path: "/sobjects/Promo_Request__c/{{request_id}}"
operations:
- name: get-promo-request
method: GET
- type: http
namespace: sap-pricing
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SLSPRICINGCONDITIONRECORD_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: conditions
path: "/A_SlsPrcgCndnRecdValidity"
operations:
- name: get-condition
method: GET
- type: http
namespace: servicenow-pricing
baseUri: "https://anheuser-busch.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
Compares SAP purchase order prices against Snowflake market benchmarks and alerts procurement via Teams when variances exceed threshold.
naftiko: "0.5"
info:
label: "Raw Material Price Variance Alert"
description: "Compares SAP purchase order prices against Snowflake market benchmarks and alerts procurement via Teams when variances exceed threshold."
tags:
- procurement
- sap
- snowflake
- microsoft-teams
- cost-management
capability:
exposes:
- type: mcp
namespace: price-variance
port: 8080
tools:
- name: check-price-variance
description: "Given a material group, compare SAP PO prices against Snowflake benchmarks and alert procurement if variance exceeds threshold."
inputParameters:
- name: material_group
in: body
type: string
description: "The SAP material group code."
steps:
- name: get-po-prices
type: call
call: "sap-pv.get-recent-prices"
with:
material_group: "{{material_group}}"
- name: get-benchmarks
type: call
call: "snowflake-pv.query-market-prices"
with:
material_group: "{{material_group}}"
- name: alert-procurement
type: call
call: "msteams-pv.post-message"
with:
channel_id: "$secrets.teams_procurement_channel_id"
message: "Price Variance Alert: {{material_group}} | Avg PO Price: ${{get-po-prices.avg_price}} | Market: ${{get-benchmarks.market_price}} | Variance: {{get-benchmarks.variance_percent}}%"
consumes:
- type: http
namespace: sap-pv
baseUri: "https://anheuser-busch-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: orders
path: "/A_PurchaseOrder"
operations:
- name: get-recent-prices
method: GET
- type: http
namespace: snowflake-pv
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-market-prices
method: POST
- type: http
namespace: msteams-pv
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Validates product label compliance data from SAP against regulatory requirements stored in Snowflake, and creates a Jira task if issues are found.
naftiko: "0.5"
info:
label: "Regulatory Label Compliance Check"
description: "Validates product label compliance data from SAP against regulatory requirements stored in Snowflake, and creates a Jira task if issues are found."
tags:
- compliance
- sap
- snowflake
- jira
- regulatory
capability:
exposes:
- type: mcp
namespace: label-compliance
port: 8080
tools:
- name: check-label-compliance
description: "Given a material number, validate SAP label data against Snowflake regulatory rules and create a Jira issue if non-compliant."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number to validate."
- name: market
in: body
type: string
description: "The target market (e.g. US, EU, BR)."
steps:
- name: get-label-data
type: call
call: "sap-label.get-material-label"
with:
material: "{{material_number}}"
- name: get-requirements
type: call
call: "snowflake-label.query-regulations"
with:
market: "{{market}}"
category: "{{get-label-data.product_category}}"
- name: create-issue
type: call
call: "jira-label.create-issue"
with:
project: "REG"
summary: "Label compliance review: {{material_number}} for {{market}}"
description: "Product: {{get-label-data.description}} | ABV: {{get-label-data.abv}} | Required disclosures: {{get-requirements.required_fields}}"
consumes:
- type: http
namespace: sap-label
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: labels
path: "/A_Product('{{material}}')"
operations:
- name: get-material-label
method: GET
- type: http
namespace: snowflake-label
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-regulations
method: POST
- type: http
namespace: jira-label
baseUri: "https://anheuser-busch.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
Creates a new retailer account in Salesforce, sets up the customer master in SAP, and sends a welcome notification via Microsoft Teams.
naftiko: "0.5"
info:
label: "Retailer Onboarding Workflow"
description: "Creates a new retailer account in Salesforce, sets up the customer master in SAP, and sends a welcome notification via Microsoft Teams."
tags:
- sales
- salesforce
- sap
- microsoft-teams
- onboarding
capability:
exposes:
- type: mcp
namespace: retailer-ops
port: 8080
tools:
- name: onboard-new-retailer
description: "Given retailer details, create a Salesforce account, SAP customer master, and send a Teams welcome message to the regional sales team."
inputParameters:
- name: retailer_name
in: body
type: string
description: "The name of the new retailer."
- name: region
in: body
type: string
description: "The sales region for the retailer."
- name: contact_email
in: body
type: string
description: "Primary contact email for the retailer."
steps:
- name: create-sf-account
type: call
call: "salesforce-retail.create-account"
with:
name: "{{retailer_name}}"
region: "{{region}}"
email: "{{contact_email}}"
- name: create-sap-customer
type: call
call: "sap-retail.create-customer"
with:
name: "{{retailer_name}}"
sales_org: "{{region}}"
sf_id: "{{create-sf-account.id}}"
- name: notify-sales
type: call
call: "msteams-retail.post-message"
with:
channel_id: "$secrets.teams_sales_channel_id"
message: "New retailer onboarded: {{retailer_name}} in {{region}} | SF ID: {{create-sf-account.id}} | SAP: {{create-sap-customer.customer_number}}"
consumes:
- type: http
namespace: salesforce-retail
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account"
operations:
- name: create-account
method: POST
- type: http
namespace: sap-retail
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: customers
path: "/A_Customer"
operations:
- name: create-customer
method: POST
- type: http
namespace: msteams-retail
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
When a qualifying LinkedIn signal occurs for a key account contact, enriches the Salesforce record and notifies the account manager in Teams.
naftiko: "0.5"
info:
label: "Sales Intelligence Enrichment from LinkedIn"
description: "When a qualifying LinkedIn signal occurs for a key account contact, enriches the Salesforce record and notifies the account manager in Teams."
tags:
- sales
- crm
- salesforce
- linkedin
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sales-intelligence
port: 8080
tools:
- name: enrich-contact-from-linkedin
description: "Given a LinkedIn member URN and Salesforce contact ID, fetch the LinkedIn profile, enrich the Salesforce contact, and notify the account manager in Teams."
inputParameters:
- name: linkedin_member_urn
in: body
type: string
description: "The LinkedIn member URN for the contact."
- name: salesforce_contact_id
in: body
type: string
description: "The Salesforce contact record ID."
- name: account_manager_upn
in: body
type: string
description: "The UPN of the account manager to notify."
steps:
- name: get-linkedin-profile
type: call
call: "linkedin.get-profile"
with:
member_urn: "{{linkedin_member_urn}}"
- name: enrich-salesforce
type: call
call: "salesforce-si.update-contact"
with:
contact_id: "{{salesforce_contact_id}}"
title: "{{get-linkedin-profile.headline}}"
linkedin_profile: "https://www.linkedin.com/in/{{get-linkedin-profile.vanityName}}"
- name: notify-account-manager
type: call
call: "msteams-si.send-message"
with:
recipient_upn: "{{account_manager_upn}}"
message: "Lead Signal: {{get-linkedin-profile.firstName}} {{get-linkedin-profile.lastName}} | Title: {{get-linkedin-profile.headline}} | Salesforce enriched."
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: profiles
path: "/people/{{member_urn}}"
inputParameters:
- name: member_urn
in: path
operations:
- name: get-profile
method: GET
- type: http
namespace: salesforce-si
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contacts
path: "/sobjects/Contact/{{contact_id}}"
inputParameters:
- name: contact_id
in: path
operations:
- name: update-contact
method: PATCH
- type: http
namespace: msteams-si
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chats
path: "/users/{{recipient_upn}}/chats"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
When a territory realignment is approved in Salesforce, updates SAP sales org assignments and notifies affected account managers via Teams.
naftiko: "0.5"
info:
label: "Sales Territory Realignment Sync"
description: "When a territory realignment is approved in Salesforce, updates SAP sales org assignments and notifies affected account managers via Teams."
tags:
- sales
- salesforce
- sap
- microsoft-teams
- territory-management
capability:
exposes:
- type: mcp
namespace: territory-ops
port: 8080
tools:
- name: sync-territory-realignment
description: "Given a territory change request ID, apply Salesforce territory updates to SAP and notify affected managers via Teams."
inputParameters:
- name: change_request_id
in: body
type: string
description: "The Salesforce territory change request ID."
steps:
- name: get-changes
type: call
call: "salesforce-territory.get-change-request"
with:
request_id: "{{change_request_id}}"
- name: update-sap
type: call
call: "sap-territory.update-sales-org"
with:
accounts: "{{get-changes.affected_accounts}}"
new_territory: "{{get-changes.new_territory}}"
- name: notify-managers
type: call
call: "msteams-territory.post-message"
with:
channel_id: "$secrets.teams_sales_ops_channel_id"
message: "Territory Realignment: {{get-changes.affected_accounts_count}} accounts moved to {{get-changes.new_territory}} | Effective: {{get-changes.effective_date}}"
consumes:
- type: http
namespace: salesforce-territory
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: territories
path: "/sobjects/Territory_Change__c/{{request_id}}"
operations:
- name: get-change-request
method: GET
- type: http
namespace: sap-territory
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: customers
path: "/A_Customer"
operations:
- name: update-sales-org
method: PATCH
- type: http
namespace: msteams-territory
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Retrieves a Salesforce support case by case number, returning subject, status, priority, and assigned owner.
naftiko: "0.5"
info:
label: "Salesforce Case Lookup"
description: "Retrieves a Salesforce support case by case number, returning subject, status, priority, and assigned owner."
tags:
- support
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: salesforce-cases
port: 8080
tools:
- name: get-case
description: "Look up a Salesforce case by case number. Returns subject, status, priority, and owner."
inputParameters:
- name: case_number
in: body
type: string
description: "The Salesforce case number."
call: "salesforce-cases.get-case"
with:
case_number: "{{case_number}}"
outputParameters:
- name: subject
type: string
mapping: "$.Subject"
- name: status
type: string
mapping: "$.Status"
- name: priority
type: string
mapping: "$.Priority"
- name: owner
type: string
mapping: "$.Owner.Name"
consumes:
- type: http
namespace: salesforce-cases
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_number}}"
inputParameters:
- name: case_number
in: path
operations:
- name: get-case
method: GET
Retrieves the current status, active contracts, and recent orders for an Anheuser-Busch Salesforce distributor account.
naftiko: "0.5"
info:
label: "Salesforce Distributor Account Lookup"
description: "Retrieves the current status, active contracts, and recent orders for an Anheuser-Busch Salesforce distributor account."
tags:
- sales
- crm
- salesforce
- distribution
capability:
exposes:
- type: mcp
namespace: crm-distribution
port: 8080
tools:
- name: get-distributor-account
description: "Look up a Salesforce distributor account by ID. Returns account status, contract count, and recent order volume. Use for distributor relationship management."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce account ID for the distributor."
call: "salesforce.get-account"
with:
account_id: "{{account_id}}"
outputParameters:
- name: name
type: string
mapping: "$.Name"
- name: status
type: string
mapping: "$.Status__c"
- name: region
type: string
mapping: "$.Region__c"
- name: annual_volume
type: number
mapping: "$.Annual_Volume__c"
consumes:
- type: http
namespace: salesforce
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
Retrieves a Salesforce lead record by ID, returning lead status, company, and conversion readiness score.
naftiko: "0.5"
info:
label: "Salesforce Lead Lookup"
description: "Retrieves a Salesforce lead record by ID, returning lead status, company, and conversion readiness score."
tags:
- sales
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: salesforce-leads
port: 8080
tools:
- name: get-lead
description: "Look up a Salesforce lead by ID. Returns lead status, company name, and lead score."
inputParameters:
- name: lead_id
in: body
type: string
description: "The Salesforce lead record ID."
call: "salesforce-leads.get-lead"
with:
lead_id: "{{lead_id}}"
outputParameters:
- name: name
type: string
mapping: "$.Name"
- name: status
type: string
mapping: "$.Status"
- name: company
type: string
mapping: "$.Company"
- name: score
type: number
mapping: "$.Lead_Score__c"
consumes:
- type: http
namespace: salesforce-leads
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: get-lead
method: GET
Retrieves a Salesforce opportunity by ID, returning stage, close date, amount, and probability.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Lookup"
description: "Retrieves a Salesforce opportunity by ID, returning stage, close date, amount, and probability."
tags:
- sales
- crm
- salesforce
capability:
exposes:
- type: mcp
namespace: salesforce-opps
port: 8080
tools:
- name: get-opportunity
description: "Look up a Salesforce opportunity by ID. Returns stage name, close date, amount, and win probability."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity ID."
call: "salesforce-opps.get-opportunity"
with:
opp_id: "{{opportunity_id}}"
outputParameters:
- name: stage
type: string
mapping: "$.StageName"
- name: close_date
type: string
mapping: "$.CloseDate"
- name: amount
type: number
mapping: "$.Amount"
- name: probability
type: number
mapping: "$.Probability"
consumes:
- type: http
namespace: salesforce-opps
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opp_id}}"
inputParameters:
- name: opp_id
in: path
operations:
- name: get-opportunity
method: GET
Extracts AR aging data from SAP, loads into Snowflake for trend analysis, and sends a summary report to the finance Teams channel.
naftiko: "0.5"
info:
label: "SAP Accounts Receivable Aging Report"
description: "Extracts AR aging data from SAP, loads into Snowflake for trend analysis, and sends a summary report to the finance Teams channel."
tags:
- finance
- sap
- snowflake
- microsoft-teams
- accounts-receivable
capability:
exposes:
- type: mcp
namespace: ar-ops
port: 8080
tools:
- name: generate-ar-aging-report
description: "Given a company code, extract SAP AR aging data, load into Snowflake, and post a summary to the finance Teams channel."
inputParameters:
- name: company_code
in: body
type: string
description: "The SAP company code."
- name: as_of_date
in: body
type: string
description: "The aging report date in YYYY-MM-DD format."
steps:
- name: get-aging
type: call
call: "sap-ar.get-ar-aging"
with:
company_code: "{{company_code}}"
key_date: "{{as_of_date}}"
- name: load-snapshot
type: call
call: "snowflake-ar.insert-snapshot"
with:
table: "FINANCE.AR_AGING_SNAPSHOTS"
company_code: "{{company_code}}"
date: "{{as_of_date}}"
data: "{{get-aging.records}}"
- name: post-summary
type: call
call: "msteams-ar.post-message"
with:
channel_id: "$secrets.teams_finance_channel_id"
message: "AR Aging Report — {{company_code}} ({{as_of_date}}): Current ${{get-aging.current}} | 30d ${{get-aging.past_30}} | 60d ${{get-aging.past_60}} | 90d+ ${{get-aging.past_90}}"
consumes:
- type: http
namespace: sap-ar
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: aging
path: "/A_CustomerLineItem"
operations:
- name: get-ar-aging
method: GET
- type: http
namespace: snowflake-ar
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-snapshot
method: POST
- type: http
namespace: msteams-ar
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Traces a production batch through the SAP supply chain, retrieves related quality data from Snowflake, and logs the trace in ServiceNow for audit.
naftiko: "0.5"
info:
label: "SAP Batch Traceability Lookup"
description: "Traces a production batch through the SAP supply chain, retrieves related quality data from Snowflake, and logs the trace in ServiceNow for audit."
tags:
- quality
- sap
- snowflake
- servicenow
- traceability
capability:
exposes:
- type: mcp
namespace: trace-ops
port: 8080
tools:
- name: trace-batch
description: "Given a batch number, trace it through SAP, pull quality data from Snowflake, and log in ServiceNow for audit compliance."
inputParameters:
- name: batch_number
in: body
type: string
description: "The SAP batch number."
- name: material_number
in: body
type: string
description: "The SAP material number."
steps:
- name: get-batch-history
type: call
call: "sap-trace.get-batch-where-used"
with:
batch: "{{batch_number}}"
material: "{{material_number}}"
- name: get-quality-data
type: call
call: "snowflake-trace.query-batch-quality"
with:
batch: "{{batch_number}}"
- name: log-audit
type: call
call: "servicenow-trace.create-record"
with:
short_description: "Batch trace: {{batch_number}} ({{material_number}})"
description: "Locations: {{get-batch-history.locations}} | Quality Score: {{get-quality-data.overall_score}} | Shipped To: {{get-batch-history.customers}}"
consumes:
- type: http
namespace: sap-trace
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batches
path: "/A_Batch"
operations:
- name: get-batch-where-used
method: GET
- type: http
namespace: snowflake-trace
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-batch-quality
method: POST
- type: http
namespace: servicenow-trace
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: records
path: "/table/u_audit_log"
operations:
- name: create-record
method: POST
Retrieves a billing document from SAP S/4HANA by document number, returning billed amount, payer, and billing date.
naftiko: "0.5"
info:
label: "SAP Billing Document Lookup"
description: "Retrieves a billing document from SAP S/4HANA by document number, returning billed amount, payer, and billing date."
tags:
- finance
- sap
- billing
capability:
exposes:
- type: mcp
namespace: sap-billing
port: 8080
tools:
- name: get-billing-document
description: "Look up a SAP billing document. Returns net amount, payer name, billing date, and currency."
inputParameters:
- name: billing_doc_number
in: body
type: string
description: "The SAP billing document number."
call: "sap-billing.get-doc"
with:
doc_id: "{{billing_doc_number}}"
outputParameters:
- name: net_amount
type: string
mapping: "$.d.TotalNetAmount"
- name: payer
type: string
mapping: "$.d.PayerParty"
- name: billing_date
type: string
mapping: "$.d.BillingDocumentDate"
consumes:
- type: http
namespace: sap-billing
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: billing-documents
path: "/A_BillingDocument('{{doc_id}}')"
inputParameters:
- name: doc_id
in: path
operations:
- name: get-doc
method: GET
Retrieves a pending expense report from SAP Concur and routes it for manager approval via ServiceNow.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Approval"
description: "Retrieves a pending expense report from SAP Concur and routes it for manager approval via ServiceNow."
tags:
- finance
- expense-management
- sap-concur
- servicenow
capability:
exposes:
- type: mcp
namespace: expense-mgmt
port: 8080
tools:
- name: process-expense-report
description: "Given a SAP Concur expense report ID and employee ID, retrieve the report and create a ServiceNow approval task for the manager."
inputParameters:
- name: expense_report_id
in: body
type: string
description: "The SAP Concur expense report identifier."
- name: employee_id
in: body
type: string
description: "The employee ID submitting the expense report."
steps:
- name: get-expense-report
type: call
call: "sap-concur.get-expense-report"
with:
report_id: "{{expense_report_id}}"
- name: create-approval-task
type: call
call: "servicenow-exp.create-task"
with:
short_description: "Expense approval: {{employee_id}} — {{expense_report_id}}"
description: "Amount: {{get-expense-report.total_amount}} {{get-expense-report.currency}}."
assignment_group: "Finance_Expense"
consumes:
- type: http
namespace: sap-concur
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/expense/reports/{{report_id}}"
inputParameters:
- name: report_id
in: path
operations:
- name: get-expense-report
method: GET
- type: http
namespace: servicenow-exp
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Scans SAP Concur for travel bookings that exceed policy limits, flags them in ServiceNow, and notifies the travel management Teams channel.
naftiko: "0.5"
info:
label: "SAP Concur Travel Policy Compliance Check"
description: "Scans SAP Concur for travel bookings that exceed policy limits, flags them in ServiceNow, and notifies the travel management Teams channel."
tags:
- travel
- sap-concur
- servicenow
- microsoft-teams
- compliance
capability:
exposes:
- type: mcp
namespace: travel-ops
port: 8080
tools:
- name: check-travel-compliance
description: "Given a booking date range, scan SAP Concur for policy violations, create ServiceNow tasks, and notify travel management via Teams."
inputParameters:
- name: start_date
in: body
type: string
description: "Start date in YYYY-MM-DD format."
- name: end_date
in: body
type: string
description: "End date in YYYY-MM-DD format."
steps:
- name: get-violations
type: call
call: "concur-travel.get-policy-violations"
with:
start: "{{start_date}}"
end: "{{end_date}}"
- name: create-task
type: call
call: "servicenow-travel.create-task"
with:
short_description: "Travel policy violations: {{start_date}} to {{end_date}}"
description: "Violation count: {{get-violations.count}} | Total overage: ${{get-violations.total_overage}}"
- name: notify-travel
type: call
call: "msteams-travel.post-message"
with:
channel_id: "$secrets.teams_travel_channel_id"
message: "Travel Policy Alert: {{get-violations.count}} violations from {{start_date}} to {{end_date}} | Total overage: ${{get-violations.total_overage}} | Task: {{create-task.number}}"
consumes:
- type: http
namespace: concur-travel
baseUri: "https://us.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: reports
path: "/expense/reports"
operations:
- name: get-policy-violations
method: GET
- type: http
namespace: servicenow-travel
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams-travel
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Checks budget vs. actuals for a given cost center and fiscal period in SAP S/4HANA.
naftiko: "0.5"
info:
label: "SAP Cost Center Budget Check"
description: "Checks budget vs. actuals for a given cost center and fiscal period in SAP S/4HANA."
tags:
- finance
- sap
- budgeting
capability:
exposes:
- type: mcp
namespace: sap-controlling
port: 8080
tools:
- name: get-cost-center-budget
description: "Query budget and actual spend for a cost center in a fiscal year. Returns planned, actual, and variance amounts."
inputParameters:
- name: cost_center
in: body
type: string
description: "The SAP cost center ID."
call: "sap-controlling.get-budget"
with:
cost_center: "{{cost_center}}"
outputParameters:
- name: planned_amount
type: number
mapping: "$.d.PlanAmount"
- name: actual_amount
type: number
mapping: "$.d.ActualAmount"
- name: variance
type: number
mapping: "$.d.Variance"
consumes:
- type: http
namespace: sap-controlling
baseUri: "https://anheuser-busch-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-budget
method: GET
Retrieves an outbound delivery document from SAP S/4HANA, returning delivery status, ship-to party, and planned goods issue date.
naftiko: "0.5"
info:
label: "SAP Delivery Document Lookup"
description: "Retrieves an outbound delivery document from SAP S/4HANA, returning delivery status, ship-to party, and planned goods issue date."
tags:
- logistics
- sap
- distribution
capability:
exposes:
- type: mcp
namespace: sap-delivery
port: 8080
tools:
- name: get-delivery
description: "Look up a SAP outbound delivery by document number. Returns status, ship-to party, and goods issue date."
inputParameters:
- name: delivery_number
in: body
type: string
description: "The SAP delivery document number."
call: "sap-delivery.get-delivery"
with:
delivery_id: "{{delivery_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OverallSDProcessStatus"
- name: ship_to
type: string
mapping: "$.d.ShipToParty"
- name: goods_issue_date
type: string
mapping: "$.d.PlannedGoodsIssueDate"
consumes:
- type: http
namespace: sap-delivery
baseUri: "https://anheuser-busch-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_id}}')"
inputParameters:
- name: delivery_id
in: path
operations:
- name: get-delivery
method: GET
When a goods receipt is posted in SAP, runs a quality check and creates a ServiceNow quality notification if the batch fails inspection criteria.
naftiko: "0.5"
info:
label: "SAP Goods Receipt and Quality Notification"
description: "When a goods receipt is posted in SAP, runs a quality check and creates a ServiceNow quality notification if the batch fails inspection criteria."
tags:
- quality
- sap
- servicenow
- manufacturing
capability:
exposes:
- type: mcp
namespace: quality-ops
port: 8080
tools:
- name: process-goods-receipt-quality
description: "Given a goods receipt document number, verify the quality inspection result in SAP and create a ServiceNow notification if the batch fails."
inputParameters:
- name: goods_receipt_id
in: body
type: string
description: "The SAP goods receipt document number."
steps:
- name: get-receipt
type: call
call: "sap-gr.get-goods-receipt"
with:
doc_id: "{{goods_receipt_id}}"
- name: check-quality
type: call
call: "sap-gr.get-inspection-lot"
with:
batch: "{{get-receipt.batch}}"
- name: create-notification
type: call
call: "servicenow-qual.create-incident"
with:
short_description: "Quality hold: batch {{get-receipt.batch}} failed inspection"
description: "Material: {{get-receipt.material}} | Plant: {{get-receipt.plant}} | Result: {{check-quality.result}}"
urgency: "2"
consumes:
- type: http
namespace: sap-gr
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MATERIAL_DOCUMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: material-documents
path: "/A_MaterialDocumentHeader"
operations:
- name: get-goods-receipt
method: GET
- name: get-inspection-lot
method: GET
- type: http
namespace: servicenow-qual
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Reconciles intercompany billing documents between SAP company codes, logs discrepancies in Snowflake, and creates a Jira task for the accounting team.
naftiko: "0.5"
info:
label: "SAP Intercompany Billing Reconciliation"
description: "Reconciles intercompany billing documents between SAP company codes, logs discrepancies in Snowflake, and creates a Jira task for the accounting team."
tags:
- finance
- sap
- snowflake
- jira
- intercompany
capability:
exposes:
- type: mcp
namespace: ic-billing
port: 8080
tools:
- name: reconcile-intercompany-billing
description: "Given two company codes and a billing period, reconcile SAP intercompany documents, log discrepancies in Snowflake, and create a Jira task."
inputParameters:
- name: company_code_1
in: body
type: string
description: "The first SAP company code."
- name: company_code_2
in: body
type: string
description: "The second SAP company code."
- name: period
in: body
type: string
description: "The billing period in YYYY-MM format."
steps:
- name: get-documents
type: call
call: "sap-ic.get-ic-documents"
with:
cc1: "{{company_code_1}}"
cc2: "{{company_code_2}}"
period: "{{period}}"
- name: log-discrepancies
type: call
call: "snowflake-ic.insert-discrepancies"
with:
table: "FINANCE.IC_RECONCILIATION"
data: "{{get-documents.discrepancies}}"
- name: create-task
type: call
call: "jira-ic.create-issue"
with:
project: "FIN"
summary: "IC billing recon: {{company_code_1}} vs {{company_code_2}} ({{period}})"
description: "Matched: {{get-documents.matched_count}} | Discrepancies: {{get-documents.discrepancy_count}} | Total variance: {{get-documents.total_variance}}"
consumes:
- type: http
namespace: sap-ic
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: billing
path: "/A_BillingDocument"
operations:
- name: get-ic-documents
method: GET
- type: http
namespace: snowflake-ic
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-discrepancies
method: POST
- type: http
namespace: jira-ic
baseUri: "https://anheuser-busch.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
Checks current stock levels for a material at a specified plant in SAP S/4HANA.
naftiko: "0.5"
info:
label: "SAP Inventory Stock Check"
description: "Checks current stock levels for a material at a specified plant in SAP S/4HANA."
tags:
- inventory
- sap
- supply-chain
capability:
exposes:
- type: mcp
namespace: sap-stock
port: 8080
tools:
- name: get-stock-level
description: "Query current unrestricted stock for a material at a given plant. Returns available quantity and unit."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number to check stock for."
call: "sap-stock.get-stock"
with:
material: "{{material_number}}"
outputParameters:
- name: available_stock
type: number
mapping: "$.d.MatlWrhsStkQtyInMatlBaseUnit"
- name: unit
type: string
mapping: "$.d.MaterialBaseUnit"
- name: plant
type: string
mapping: "$.d.Plant"
consumes:
- type: http
namespace: sap-stock
baseUri: "https://anheuser-busch-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"
inputParameters:
- name: material
in: query
operations:
- name: get-stock
method: GET
Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and material group.
naftiko: "0.5"
info:
label: "SAP Material Master Lookup"
description: "Retrieves material master data from SAP S/4HANA by material number, returning description, unit of measure, and material group."
tags:
- materials
- sap
- erp
capability:
exposes:
- type: mcp
namespace: sap-mat
port: 8080
tools:
- name: get-material
description: "Look up a SAP material master record by material number. Returns description, base unit, and material group."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material number."
call: "sap-mat.get-material"
with:
material_id: "{{material_number}}"
outputParameters:
- name: description
type: string
mapping: "$.d.MaterialName"
- name: base_unit
type: string
mapping: "$.d.BaseUnit"
- name: material_group
type: string
mapping: "$.d.MaterialGroup"
consumes:
- type: http
namespace: sap-mat
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_PRODUCT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Product('{{material_id}}')"
inputParameters:
- name: material_id
in: path
operations:
- name: get-material
method: GET
Retrieves overdue safety inspections from SAP EHS, creates ServiceNow tasks, and alerts the safety compliance Teams channel.
naftiko: "0.5"
info:
label: "SAP Plant Safety Inspection Tracker"
description: "Retrieves overdue safety inspections from SAP EHS, creates ServiceNow tasks, and alerts the safety compliance Teams channel."
tags:
- safety
- sap
- servicenow
- microsoft-teams
- compliance
capability:
exposes:
- type: mcp
namespace: safety-ops
port: 8080
tools:
- name: track-safety-inspections
description: "Given a plant code, find overdue safety inspections in SAP EHS, create ServiceNow tasks, and alert safety compliance via Teams."
inputParameters:
- name: plant_code
in: body
type: string
description: "The brewery plant code."
steps:
- name: get-overdue
type: call
call: "sap-safety.get-overdue-inspections"
with:
plant: "{{plant_code}}"
- name: create-tasks
type: call
call: "servicenow-safety.create-task"
with:
short_description: "Overdue safety inspections at plant {{plant_code}}"
description: "Overdue count: {{get-overdue.count}} | Types: {{get-overdue.inspection_types}}"
urgency: "2"
- name: alert-safety
type: call
call: "msteams-safety.post-message"
with:
channel_id: "$secrets.teams_safety_channel_id"
message: "Safety Alert: {{get-overdue.count}} overdue inspections at plant {{plant_code}} | Types: {{get-overdue.inspection_types}} | Task: {{create-tasks.number}}"
consumes:
- type: http
namespace: sap-safety
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_ENVIRONMENT_HEALTH_SAFETY"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inspections
path: "/A_SafetyInspection"
operations:
- name: get-overdue-inspections
method: GET
- type: http
namespace: servicenow-safety
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams-safety
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Looks up an Anheuser-Busch SAP S/4HANA purchase order by number and returns header status, vendor details, and total value.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Looks up an Anheuser-Busch SAP S/4HANA purchase order by number and returns header status, vendor details, and total value."
tags:
- finance
- procurement
- sap
- erp
capability:
exposes:
- type: mcp
namespace: erp-procurement
port: 8080
tools:
- name: get-purchase-order
description: "Look up a SAP S/4HANA purchase order by PO number. Returns status, vendor name, total value, and currency. Use for procurement status checks and invoice matching."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number, e.g. 4500067890."
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://anheuser-busch-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
outputRawFormat: xml
Retrieves a sales order from SAP S/4HANA by order number, returning customer, net value, and delivery status.
naftiko: "0.5"
info:
label: "SAP Sales Order Lookup"
description: "Retrieves a sales order from SAP S/4HANA by order number, returning customer, net value, and delivery status."
tags:
- sales
- sap
- erp
capability:
exposes:
- type: mcp
namespace: sap-sales
port: 8080
tools:
- name: get-sales-order
description: "Look up a SAP sales order by number. Returns sold-to party, net value, currency, and overall status."
inputParameters:
- name: sales_order_number
in: body
type: string
description: "The SAP sales order number."
call: "sap-sales.get-order"
with:
order_id: "{{sales_order_number}}"
outputParameters:
- name: sold_to_party
type: string
mapping: "$.d.SoldToParty"
- name: net_value
type: string
mapping: "$.d.TotalNetAmount"
- name: currency
type: string
mapping: "$.d.TransactionCurrency"
- name: status
type: string
mapping: "$.d.OverallSDDocumentRejectionSts"
consumes:
- type: http
namespace: sap-sales
baseUri: "https://anheuser-busch-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_id}}')"
inputParameters:
- name: order_id
in: path
operations:
- name: get-order
method: GET
Retrieves a shipment from SAP TM, checks carrier status, and updates the Salesforce delivery record with tracking information.
naftiko: "0.5"
info:
label: "SAP Transport Shipment Tracking"
description: "Retrieves a shipment from SAP TM, checks carrier status, and updates the Salesforce delivery record with tracking information."
tags:
- logistics
- sap
- salesforce
- transportation
capability:
exposes:
- type: mcp
namespace: transport-ops
port: 8080
tools:
- name: track-shipment
description: "Given a shipment ID, pull SAP TM shipment details and update the Salesforce delivery record with current tracking status."
inputParameters:
- name: shipment_id
in: body
type: string
description: "The SAP shipment document number."
steps:
- name: get-shipment
type: call
call: "sap-tm.get-shipment"
with:
shipment: "{{shipment_id}}"
- name: update-sf-delivery
type: call
call: "salesforce-tm.update-delivery"
with:
shipment_id: "{{shipment_id}}"
status: "{{get-shipment.status}}"
eta: "{{get-shipment.estimated_arrival}}"
consumes:
- type: http
namespace: sap-tm
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SHIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: shipments
path: "/A_Shipment('{{shipment}}')"
operations:
- name: get-shipment
method: GET
- type: http
namespace: salesforce-tm
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: deliveries
path: "/sobjects/Delivery__c"
operations:
- name: update-delivery
method: PATCH
Retrieves freight invoices from SAP, allocates costs to distribution routes in Snowflake, and posts a cost summary to the logistics Teams channel.
naftiko: "0.5"
info:
label: "SAP Transportation Cost Allocation"
description: "Retrieves freight invoices from SAP, allocates costs to distribution routes in Snowflake, and posts a cost summary to the logistics Teams channel."
tags:
- logistics
- sap
- snowflake
- microsoft-teams
- cost-management
capability:
exposes:
- type: mcp
namespace: freight-ops
port: 8080
tools:
- name: allocate-transportation-costs
description: "Given a billing period, retrieve SAP freight invoices, allocate costs by route in Snowflake, and notify logistics via Teams."
inputParameters:
- name: billing_period
in: body
type: string
description: "The billing period in YYYY-MM format."
steps:
- name: get-invoices
type: call
call: "sap-freight.get-freight-invoices"
with:
period: "{{billing_period}}"
- name: allocate-costs
type: call
call: "snowflake-freight.run-allocation"
with:
period: "{{billing_period}}"
invoice_data: "{{get-invoices.records}}"
- name: notify-logistics
type: call
call: "msteams-freight.post-message"
with:
channel_id: "$secrets.teams_logistics_channel_id"
message: "Freight Cost Allocation ({{billing_period}}): Total ${{get-invoices.total_cost}} | Routes: {{allocate-costs.route_count}} | Top Route: {{allocate-costs.top_route}} (${{allocate-costs.top_route_cost}})"
consumes:
- type: http
namespace: sap-freight
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_SupplierInvoice"
operations:
- name: get-freight-invoices
method: GET
- type: http
namespace: snowflake-freight
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-allocation
method: POST
- type: http
namespace: msteams-freight
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Retrieves vendor master data from SAP including company name, payment terms, and purchasing organization.
naftiko: "0.5"
info:
label: "SAP Vendor Master Lookup"
description: "Retrieves vendor master data from SAP including company name, payment terms, and purchasing organization."
tags:
- procurement
- sap
- vendor-management
capability:
exposes:
- type: mcp
namespace: sap-vendor
port: 8080
tools:
- name: get-vendor
description: "Look up a SAP vendor record by vendor number. Returns company name, payment terms, and purchasing org."
inputParameters:
- name: vendor_number
in: body
type: string
description: "The SAP vendor number."
call: "sap-vendor.get-vendor"
with:
vendor_id: "{{vendor_number}}"
outputParameters:
- name: company_name
type: string
mapping: "$.d.SupplierName"
- name: payment_terms
type: string
mapping: "$.d.PaymentTerms"
- name: purchasing_org
type: string
mapping: "$.d.PurchasingOrganization"
consumes:
- type: http
namespace: sap-vendor
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: vendors
path: "/A_Supplier('{{vendor_id}}')"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-vendor
method: GET
Queries SAP warehouse management for current utilization, forecasts capacity needs from Snowflake, and alerts the logistics planning team via Teams.
naftiko: "0.5"
info:
label: "SAP Warehouse Capacity Planner"
description: "Queries SAP warehouse management for current utilization, forecasts capacity needs from Snowflake, and alerts the logistics planning team via Teams."
tags:
- logistics
- sap
- snowflake
- microsoft-teams
- warehouse
capability:
exposes:
- type: mcp
namespace: warehouse-ops
port: 8080
tools:
- name: plan-warehouse-capacity
description: "Given a warehouse number, check SAP utilization, pull Snowflake capacity forecast, and alert logistics planning via Teams."
inputParameters:
- name: warehouse_number
in: body
type: string
description: "The SAP warehouse number."
steps:
- name: get-utilization
type: call
call: "sap-wm.get-warehouse-util"
with:
warehouse: "{{warehouse_number}}"
- name: get-forecast
type: call
call: "snowflake-wm.query-capacity-forecast"
with:
warehouse: "{{warehouse_number}}"
- name: alert-planning
type: call
call: "msteams-wm.post-message"
with:
channel_id: "$secrets.teams_logistics_planning_channel_id"
message: "Warehouse Capacity: {{warehouse_number}} | Current: {{get-utilization.utilization_percent}}% | 30d Forecast: {{get-forecast.forecast_utilization}}% | Available Pallets: {{get-utilization.available_positions}}"
consumes:
- type: http
namespace: sap-wm
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_WAREHOUSE_MGMT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: warehouses
path: "/A_Warehouse('{{warehouse}}')"
operations:
- name: get-warehouse-util
method: GET
- type: http
namespace: snowflake-wm
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-capacity-forecast
method: POST
- type: http
namespace: msteams-wm
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Pulls seasonal demand forecasts from Snowflake, updates SAP demand planning, and notifies the supply chain planning team via Teams.
naftiko: "0.5"
info:
label: "Seasonal Demand Forecast Sync"
description: "Pulls seasonal demand forecasts from Snowflake, updates SAP demand planning, and notifies the supply chain planning team via Teams."
tags:
- supply-chain
- snowflake
- sap
- microsoft-teams
- demand-planning
capability:
exposes:
- type: mcp
namespace: demand-ops
port: 8080
tools:
- name: sync-seasonal-forecast
description: "Given a product family and season, pull Snowflake forecasts, update SAP demand plan, and notify supply chain planning via Teams."
inputParameters:
- name: product_family
in: body
type: string
description: "The product family code."
- name: season
in: body
type: string
description: "The forecast season (e.g. SUMMER-2025)."
steps:
- name: get-forecast
type: call
call: "snowflake-demand.query-forecast"
with:
family: "{{product_family}}"
season: "{{season}}"
- name: update-sap-plan
type: call
call: "sap-demand.update-demand-plan"
with:
family: "{{product_family}}"
forecast_qty: "{{get-forecast.total_forecast_units}}"
- name: notify-planning
type: call
call: "msteams-demand.post-message"
with:
channel_id: "$secrets.teams_supply_chain_channel_id"
message: "Seasonal Forecast Sync: {{product_family}} ({{season}}) | Forecast: {{get-forecast.total_forecast_units}} units | YoY Change: {{get-forecast.yoy_change_percent}}%"
consumes:
- type: http
namespace: snowflake-demand
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-forecast
method: POST
- type: http
namespace: sap-demand
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV_01"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: demand-plans
path: "/A_MRPMaterial"
operations:
- name: update-demand-plan
method: PATCH
- type: http
namespace: msteams-demand
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Retrieves a ServiceNow change request by number, returning approval status, risk level, and implementation window.
naftiko: "0.5"
info:
label: "ServiceNow Change Request Lookup"
description: "Retrieves a ServiceNow change request by number, returning approval status, risk level, and implementation window."
tags:
- itsm
- servicenow
- change-management
capability:
exposes:
- type: mcp
namespace: servicenow-chg
port: 8080
tools:
- name: get-change-request
description: "Look up a ServiceNow change request by number. Returns approval status, risk, and scheduled dates."
inputParameters:
- name: change_number
in: body
type: string
description: "The ServiceNow change request number (e.g. CHG0009876)."
call: "servicenow-chg.get-change"
with:
number: "{{change_number}}"
outputParameters:
- name: approval_status
type: string
mapping: "$.result.approval"
- name: risk
type: string
mapping: "$.result.risk"
- name: start_date
type: string
mapping: "$.result.start_date"
- name: end_date
type: string
mapping: "$.result.end_date"
consumes:
- type: http
namespace: servicenow-chg
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
inputParameters:
- name: number
in: query
operations:
- name: get-change
method: GET
Retrieves a ServiceNow incident by number, returning state, priority, assigned group, and short description.
naftiko: "0.5"
info:
label: "ServiceNow Incident Lookup"
description: "Retrieves a ServiceNow incident by number, returning state, priority, assigned group, and short description."
tags:
- itsm
- servicenow
- incident-response
capability:
exposes:
- type: mcp
namespace: servicenow-inc
port: 8080
tools:
- name: get-incident
description: "Look up a ServiceNow incident by number. Returns state, priority, assignment group, and description."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number (e.g. INC0012345)."
call: "servicenow-inc.get-incident"
with:
number: "{{incident_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result.state"
- name: priority
type: string
mapping: "$.result.priority"
- name: assigned_to
type: string
mapping: "$.result.assigned_to.display_value"
- name: short_description
type: string
mapping: "$.result.short_description"
consumes:
- type: http
namespace: servicenow-inc
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: number
in: query
operations:
- name: get-incident
method: GET
Queries Snowflake for distributor sales performance metrics by region and period.
naftiko: "0.5"
info:
label: "Snowflake Distributor Performance Query"
description: "Queries Snowflake for distributor sales performance metrics by region and period."
tags:
- analytics
- snowflake
- distribution
capability:
exposes:
- type: mcp
namespace: snowflake-analytics
port: 8080
tools:
- name: query-distributor-performance
description: "Query distributor sales performance from Snowflake by region. Returns total revenue, order count, and average order value."
inputParameters:
- name: region
in: body
type: string
description: "The distribution region code (e.g. US-NORTHEAST)."
call: "snowflake-analytics.run-query"
with:
region: "{{region}}"
outputParameters:
- name: total_revenue
type: number
mapping: "$.data[0].TOTAL_REVENUE"
- name: order_count
type: number
mapping: "$.data[0].ORDER_COUNT"
- name: avg_order_value
type: number
mapping: "$.data[0].AVG_ORDER_VALUE"
consumes:
- type: http
namespace: snowflake-analytics
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: region
in: query
operations:
- name: run-query
method: POST
When a Snowflake ETL pipeline fails, creates a PagerDuty alert, logs the failure in ServiceNow, and notifies the data engineering Teams channel.
naftiko: "0.5"
info:
label: "Snowflake ETL Failure Remediation"
description: "When a Snowflake ETL pipeline fails, creates a PagerDuty alert, logs the failure in ServiceNow, and notifies the data engineering Teams channel."
tags:
- data-engineering
- snowflake
- pagerduty
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: etl-ops
port: 8080
tools:
- name: handle-etl-failure
description: "Given a Snowflake task name and error message, create a PagerDuty alert, log in ServiceNow, and notify data engineering via Teams."
inputParameters:
- name: task_name
in: body
type: string
description: "The Snowflake task name that failed."
- name: error_message
in: body
type: string
description: "The error message from the failed task."
steps:
- name: create-pd-alert
type: call
call: "pagerduty-etl.create-incident"
with:
title: "ETL Failure: {{task_name}}"
service_id: "$secrets.pd_data_eng_service_id"
urgency: "high"
- name: create-snow-incident
type: call
call: "servicenow-etl.create-incident"
with:
short_description: "Snowflake ETL failure: {{task_name}}"
description: "Error: {{error_message}} | PagerDuty: {{create-pd-alert.incident_id}}"
- name: notify-team
type: call
call: "msteams-etl.post-message"
with:
channel_id: "$secrets.teams_data_eng_channel_id"
message: "ETL FAILURE: {{task_name}} | Error: {{error_message}} | INC: {{create-snow-incident.number}} | PD: {{create-pd-alert.incident_id}}"
consumes:
- type: http
namespace: pagerduty-etl
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_api_key"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: servicenow-etl
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-etl
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Queries Snowflake for failed or stalled retail sales data pipeline tasks and posts an alert to the data engineering Teams channel.
naftiko: "0.5"
info:
label: "Snowflake Retail Sales Data Pipeline Health"
description: "Queries Snowflake for failed or stalled retail sales data pipeline tasks and posts an alert to the data engineering Teams channel."
tags:
- data
- analytics
- snowflake
- pipeline-monitoring
capability:
exposes:
- type: mcp
namespace: data-ops
port: 8080
tools:
- name: get-pipeline-task-failures
description: "Query Snowflake task history for failed tasks in a given database and schema. Use to triage retail sales data pipeline issues."
inputParameters:
- name: database_name
in: body
type: string
description: "The Snowflake database, e.g. AB_RETAIL_ANALYTICS."
- name: schema_name
in: body
type: string
description: "The Snowflake schema, e.g. SALES_ETL."
- name: lookback_hours
in: body
type: integer
description: "Number of hours to look back in task history."
call: "snowflake.query-task-history"
with:
database: "{{database_name}}"
schema: "{{schema_name}}"
hours: "{{lookback_hours}}"
outputParameters:
- name: failed_tasks
type: array
mapping: "$.data"
consumes:
- type: http
namespace: snowflake
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: task-history
path: "/databases/{{database}}/schemas/{{schema}}/tasks/history"
inputParameters:
- name: database
in: path
- name: schema
in: path
- name: hours
in: query
operations:
- name: query-task-history
method: GET
When Splunk detects an anomalous login pattern, creates a ServiceNow security incident and disables the Okta account pending review.
naftiko: "0.5"
info:
label: "Splunk Security Log Anomaly Response"
description: "When Splunk detects an anomalous login pattern, creates a ServiceNow security incident and disables the Okta account pending review."
tags:
- security
- splunk
- servicenow
- okta
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: respond-to-login-anomaly
description: "Given a Splunk alert ID, retrieve anomaly details, create a ServiceNow security incident, and suspend the Okta user account."
inputParameters:
- name: alert_id
in: body
type: string
description: "The Splunk alert ID."
- name: user_login
in: body
type: string
description: "The user login associated with the anomaly."
steps:
- name: get-alert
type: call
call: "splunk.get-alert-details"
with:
alert_id: "{{alert_id}}"
- name: create-incident
type: call
call: "servicenow-sec.create-incident"
with:
short_description: "Login anomaly detected for {{user_login}}"
description: "Alert: {{alert_id}} | Risk Score: {{get-alert.risk_score}} | Source IPs: {{get-alert.source_ips}}"
urgency: "1"
- name: suspend-user
type: call
call: "okta-sec.suspend-user"
with:
login: "{{user_login}}"
consumes:
- type: http
namespace: splunk
baseUri: "https://anheuser-busch-splunk.splunkcloud.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: alerts
path: "/alerts/fired_alerts/{{alert_id}}"
operations:
- name: get-alert-details
method: GET
- type: http
namespace: servicenow-sec
baseUri: "https://anheuser-busch.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: okta-sec
baseUri: "https://anheuser-busch.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users/{{login}}/lifecycle/suspend"
operations:
- name: suspend-user
method: POST
When a supply chain risk is identified for a critical ingredient or packaging material, creates a ServiceNow task, updates the Salesforce supply record, and alerts the procurement team in Teams.
naftiko: "0.5"
info:
label: "Supply Chain Disruption Alert"
description: "When a supply chain risk is identified for a critical ingredient or packaging material, creates a ServiceNow task, updates the Salesforce supply record, and alerts the procurement team in Teams."
tags:
- supply-chain
- procurement
- servicenow
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: handle-supply-disruption
description: "Given a material ID, supplier name, and disruption type, create a ServiceNow procurement task, update the Salesforce supply record, and alert the procurement Teams channel."
inputParameters:
- name: material_id
in: body
type: string
description: "The SAP material ID for the at-risk ingredient or packaging."
- name: supplier_name
in: body
type: string
description: "The supplier experiencing the disruption."
- name: disruption_type
in: body
type: string
description: "Type of disruption: shortage, delay, quality_issue, or force_majeure."
- name: severity
in: body
type: string
description: "Disruption severity: critical, high, medium, or low."
steps:
- name: create-procurement-task
type: call
call: "servicenow-sc.create-task"
with:
short_description: "Supply disruption: {{material_id}} from {{supplier_name}}"
description: "Disruption type: {{disruption_type}}. Severity: {{severity}}."
assignment_group: "Procurement"
- name: update-supply-record
type: call
call: "salesforce-sc.update-record"
with:
object_type: "Supply_Record__c"
material_id: "{{material_id}}"
status: "Disrupted"
- name: alert-procurement
type: call
call: "msteams-sc.post-channel-message"
with:
channel_id: "procurement-alerts"
message: "Supply Disruption: {{material_id}} from {{supplier_name}} | Type: {{disruption_type}} | Severity: {{severity}} | Task: {{create-procurement-task.number}}"
consumes:
- type: http
namespace: servicenow-sc
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: salesforce-sc
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: supply-records
path: "/sobjects/Supply_Record__c"
operations:
- name: update-record
method: PATCH
- type: http
namespace: msteams-sc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Pulls brewery water usage data from Snowflake, compares against SAP targets, and posts a sustainability digest to the ESG Teams channel.
naftiko: "0.5"
info:
label: "Sustainability Water Usage Report"
description: "Pulls brewery water usage data from Snowflake, compares against SAP targets, and posts a sustainability digest to the ESG Teams channel."
tags:
- sustainability
- snowflake
- sap
- microsoft-teams
- esg
capability:
exposes:
- type: mcp
namespace: sustainability-ops
port: 8080
tools:
- name: generate-water-report
description: "Given a plant code and reporting period, pull water usage from Snowflake, compare against SAP targets, and post to ESG Teams channel."
inputParameters:
- name: plant_code
in: body
type: string
description: "The brewery plant code."
- name: period
in: body
type: string
description: "Reporting period in YYYY-MM format."
steps:
- name: get-usage
type: call
call: "snowflake-esg.query-water-usage"
with:
plant: "{{plant_code}}"
period: "{{period}}"
- name: get-target
type: call
call: "sap-esg.get-sustainability-target"
with:
plant: "{{plant_code}}"
kpi: "WATER_USAGE"
- name: post-report
type: call
call: "msteams-esg.post-message"
with:
channel_id: "$secrets.teams_esg_channel_id"
message: "Water Usage Report — {{plant_code}} ({{period}}): Usage {{get-usage.total_liters}}L | Target {{get-target.target_liters}}L | Variance {{get-usage.variance_percent}}%"
consumes:
- type: http
namespace: snowflake-esg
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-water-usage
method: POST
- type: http
namespace: sap-esg
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_ENVIRONMENT_HEALTH_SAFETY"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: targets
path: "/A_SustainabilityTarget"
operations:
- name: get-sustainability-target
method: GET
- type: http
namespace: msteams-esg
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Pulls daily point-of-sale totals from the POS system, reconciles against SAP sales postings, and reports discrepancies to the finance Teams channel.
naftiko: "0.5"
info:
label: "Taproom POS Daily Reconciliation"
description: "Pulls daily point-of-sale totals from the POS system, reconciles against SAP sales postings, and reports discrepancies to the finance Teams channel."
tags:
- finance
- pos
- sap
- microsoft-teams
- retail
capability:
exposes:
- type: mcp
namespace: pos-ops
port: 8080
tools:
- name: reconcile-taproom-pos
description: "Given a taproom location code and date, reconcile POS totals against SAP postings and report discrepancies via Teams."
inputParameters:
- name: location_code
in: body
type: string
description: "The taproom location code."
- name: business_date
in: body
type: string
description: "The business date in YYYY-MM-DD format."
steps:
- name: get-pos-totals
type: call
call: "snowflake-pos.query-daily-totals"
with:
location: "{{location_code}}"
date: "{{business_date}}"
- name: get-sap-postings
type: call
call: "sap-pos.get-daily-sales"
with:
plant: "{{location_code}}"
date: "{{business_date}}"
- name: report-discrepancy
type: call
call: "msteams-pos.post-message"
with:
channel_id: "$secrets.teams_finance_channel_id"
message: "Taproom Recon — {{location_code}} ({{business_date}}): POS Total {{get-pos-totals.total}} | SAP Total {{get-sap-postings.total}} | Variance: {{get-pos-totals.variance}}"
consumes:
- type: http
namespace: snowflake-pos
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-daily-totals
method: POST
- type: http
namespace: sap-pos
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: billing
path: "/A_BillingDocument"
operations:
- name: get-daily-sales
method: GET
- type: http
namespace: msteams-pos
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Creates a new Terraform Cloud workspace for brewery or logistics infrastructure and notifies the infrastructure team in Teams.
naftiko: "0.5"
info:
label: "Terraform Cloud Brewery Infrastructure Provisioning"
description: "Creates a new Terraform Cloud workspace for brewery or logistics infrastructure and notifies the infrastructure team in Teams."
tags:
- cloud
- infrastructure
- terraform
- devops
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: infra-provisioning
port: 8080
tools:
- name: provision-terraform-workspace
description: "Given a project name and environment, create a Terraform Cloud workspace for Anheuser-Busch infrastructure and notify the infrastructure Teams channel."
inputParameters:
- name: project_name
in: body
type: string
description: "The project name, e.g. brewery-monitoring or logistics-tracker."
- name: environment
in: body
type: string
description: "The deployment environment: dev, staging, or prod."
steps:
- name: create-workspace
type: call
call: "terraform.create-workspace"
with:
org: "anheuser-busch"
name: "{{project_name}}-{{environment}}"
- name: notify-infra
type: call
call: "msteams-tf.post-channel-message"
with:
channel_id: "infrastructure-team"
message: "Terraform workspace created: {{project_name}}-{{environment}}. ID: {{create-workspace.workspace_id}}."
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: workspaces
path: "/organizations/{{org}}/workspaces"
inputParameters:
- name: org
in: path
operations:
- name: create-workspace
method: POST
- type: http
namespace: msteams-tf
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-channel-message
method: POST
Runs a Terraform plan via Terraform Cloud, detects configuration drift, creates a Jira ticket, and alerts the infrastructure team via Teams.
naftiko: "0.5"
info:
label: "Terraform Infrastructure Drift Detector"
description: "Runs a Terraform plan via Terraform Cloud, detects configuration drift, creates a Jira ticket, and alerts the infrastructure team via Teams."
tags:
- devops
- terraform
- jira
- microsoft-teams
- infrastructure
capability:
exposes:
- type: mcp
namespace: infra-drift
port: 8080
tools:
- name: detect-infrastructure-drift
description: "Given a Terraform workspace ID, run a plan to detect drift, create a Jira ticket if drift is found, and notify the infra team via Teams."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Terraform Cloud workspace ID."
steps:
- name: run-plan
type: call
call: "terraform-drift.create-run"
with:
workspace_id: "{{workspace_id}}"
plan_only: "true"
- name: create-ticket
type: call
call: "jira-drift.create-issue"
with:
project: "INFRA"
summary: "Infrastructure drift detected: workspace {{workspace_id}}"
description: "Run ID: {{run-plan.id}} | Resources changed: {{run-plan.resource_changes}} | Status: {{run-plan.status}}"
- name: notify-infra
type: call
call: "msteams-drift.post-message"
with:
channel_id: "$secrets.teams_infra_channel_id"
message: "Drift Detected: Workspace {{workspace_id}} | Changes: {{run-plan.resource_changes}} | Jira: {{create-ticket.key}}"
consumes:
- type: http
namespace: terraform-drift
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/runs"
operations:
- name: create-run
method: POST
- type: http
namespace: jira-drift
baseUri: "https://anheuser-busch.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-drift
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Pulls trade promotion data from Salesforce, actual sales lift from Snowflake, and posts an effectiveness report to the revenue management Teams channel.
naftiko: "0.5"
info:
label: "Trade Promotion Effectiveness Report"
description: "Pulls trade promotion data from Salesforce, actual sales lift from Snowflake, and posts an effectiveness report to the revenue management Teams channel."
tags:
- sales
- salesforce
- snowflake
- microsoft-teams
- trade-promotion
capability:
exposes:
- type: mcp
namespace: trade-promo
port: 8080
tools:
- name: report-promotion-effectiveness
description: "Given a promotion ID, pull Salesforce promo details, Snowflake sales lift data, and post effectiveness report to Teams."
inputParameters:
- name: promotion_id
in: body
type: string
description: "The Salesforce trade promotion record ID."
steps:
- name: get-promo
type: call
call: "salesforce-promo.get-promotion"
with:
promo_id: "{{promotion_id}}"
- name: get-lift
type: call
call: "snowflake-promo.query-sales-lift"
with:
promo_id: "{{promotion_id}}"
start_date: "{{get-promo.Start_Date__c}}"
end_date: "{{get-promo.End_Date__c}}"
- name: post-report
type: call
call: "msteams-promo.post-message"
with:
channel_id: "$secrets.teams_revenue_channel_id"
message: "Trade Promo Report: {{get-promo.Name}} | Spend: ${{get-promo.Budget__c}} | Lift: {{get-lift.volume_lift_percent}}% | ROI: {{get-lift.roi_percent}}%"
consumes:
- type: http
namespace: salesforce-promo
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: promotions
path: "/sobjects/Trade_Promotion__c/{{promo_id}}"
operations:
- name: get-promotion
method: GET
- type: http
namespace: snowflake-promo
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-sales-lift
method: POST
- type: http
namespace: msteams-promo
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Checks the delivery status of an outbound SMS message sent via Twilio.
naftiko: "0.5"
info:
label: "Twilio SMS Delivery Status"
description: "Checks the delivery status of an outbound SMS message sent via Twilio."
tags:
- communications
- twilio
- messaging
capability:
exposes:
- type: mcp
namespace: twilio
port: 8080
tools:
- name: get-message-status
description: "Look up a Twilio SMS message by SID. Returns delivery status, direction, and date sent."
inputParameters:
- name: message_sid
in: body
type: string
description: "The Twilio message SID."
call: "twilio.get-message"
with:
sid: "{{message_sid}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: direction
type: string
mapping: "$.direction"
- name: date_sent
type: string
mapping: "$.date_sent"
consumes:
- type: http
namespace: twilio
baseUri: "https://api.twilio.com/2010-04-01"
authentication:
type: basic
username: "$secrets.twilio_account_sid"
password: "$secrets.twilio_auth_token"
resources:
- name: messages
path: "/Accounts/$secrets.twilio_account_sid/Messages/{{sid}}.json"
inputParameters:
- name: sid
in: path
operations:
- name: get-message
method: GET
Checks SAP for overdue vendor payments, updates the Salesforce vendor record, and sends a payment reminder via Teams to accounts payable.
naftiko: "0.5"
info:
label: "Vendor Payment Status Notifier"
description: "Checks SAP for overdue vendor payments, updates the Salesforce vendor record, and sends a payment reminder via Teams to accounts payable."
tags:
- finance
- sap
- salesforce
- microsoft-teams
- accounts-payable
capability:
exposes:
- type: mcp
namespace: ap-ops
port: 8080
tools:
- name: notify-overdue-payments
description: "Given a vendor number, check SAP for overdue invoices, update Salesforce vendor record status, and alert AP via Teams."
inputParameters:
- name: vendor_number
in: body
type: string
description: "The SAP vendor number."
steps:
- name: get-overdue
type: call
call: "sap-ap.get-overdue-invoices"
with:
vendor: "{{vendor_number}}"
- name: update-sf
type: call
call: "salesforce-ap.update-vendor"
with:
vendor_id: "{{vendor_number}}"
payment_status: "Overdue"
overdue_amount: "{{get-overdue.total_overdue}}"
- name: alert-ap
type: call
call: "msteams-ap.post-message"
with:
channel_id: "$secrets.teams_ap_channel_id"
message: "Overdue Vendor Payments: {{vendor_number}} | Count: {{get-overdue.invoice_count}} | Total: {{get-overdue.total_overdue}} {{get-overdue.currency}}"
consumes:
- type: http
namespace: sap-ap
baseUri: "https://anheuser-busch-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_SupplierInvoice"
operations:
- name: get-overdue-invoices
method: GET
- type: http
namespace: salesforce-ap
baseUri: "https://anheuser-busch.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: vendors
path: "/sobjects/Vendor__c/{{vendor_id}}"
operations:
- name: update-vendor
method: PATCH
- type: http
namespace: msteams-ap
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
When an IoT temperature sensor detects an excursion in a cold-chain warehouse, creates a ServiceNow incident and notifies logistics via Teams.
naftiko: "0.5"
info:
label: "Warehouse Temperature Excursion Alert"
description: "When an IoT temperature sensor detects an excursion in a cold-chain warehouse, creates a ServiceNow incident and notifies logistics via Teams."
tags:
- logistics
- iot
- servicenow
- microsoft-teams
- cold-chain
capability:
exposes:
- type: mcp
namespace: cold-chain-ops
port: 8080
tools:
- name: handle-temperature-excursion
description: "Given a warehouse ID and current temperature, create a ServiceNow incident for cold-chain violation and alert logistics via Teams."
inputParameters:
- name: warehouse_id
in: body
type: string
description: "The warehouse facility identifier."
- name: current_temp
in: body
type: string
description: "The current recorded temperature in Fahrenheit."
- name: threshold
in: body
type: string
description: "The maximum allowed temperature."
steps:
- name: create-incident
type: call
call: "servicenow-cc.create-incident"
with:
short_description: "Cold-chain excursion: warehouse {{warehouse_id}} at {{current_temp}}F (max {{threshold}}F)"
urgency: "1"
impact: "1"
- name: alert-logistics
type: call
call: "msteams-cc.post-message"
with:
channel_id: "$secrets.teams_logistics_channel_id"
message: "COLD CHAIN ALERT: Warehouse {{warehouse_id}} temp {{current_temp}}F exceeds {{threshold}}F threshold | INC: {{create-incident.number}}"
consumes:
- type: http
namespace: servicenow-cc
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-cc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Pulls compensation data from Workday, runs a benchmark analysis in Snowflake, and creates a Jira task for HR leadership with recommendations.
naftiko: "0.5"
info:
label: "Workday Compensation Benchmark Analysis"
description: "Pulls compensation data from Workday, runs a benchmark analysis in Snowflake, and creates a Jira task for HR leadership with recommendations."
tags:
- hr
- workday
- snowflake
- jira
- compensation
capability:
exposes:
- type: mcp
namespace: comp-ops
port: 8080
tools:
- name: run-compensation-benchmark
description: "Given a job family and region, pull Workday comp data, benchmark in Snowflake, and create a Jira task with recommendations."
inputParameters:
- name: job_family
in: body
type: string
description: "The job family code."
- name: region
in: body
type: string
description: "The geographic region."
steps:
- name: get-comp-data
type: call
call: "workday-comp.get-compensation"
with:
job_family: "{{job_family}}"
region: "{{region}}"
- name: run-benchmark
type: call
call: "snowflake-comp.query-benchmarks"
with:
job_family: "{{job_family}}"
region: "{{region}}"
median_salary: "{{get-comp-data.median_salary}}"
- name: create-task
type: call
call: "jira-comp.create-issue"
with:
project: "HR"
summary: "Compensation benchmark: {{job_family}} in {{region}}"
description: "Median: ${{get-comp-data.median_salary}} | Market 50th: ${{run-benchmark.market_50th}} | Gap: {{run-benchmark.gap_percent}}% | Headcount: {{get-comp-data.employee_count}}"
consumes:
- type: http
namespace: workday-comp
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: compensation
path: "/workers"
operations:
- name: get-compensation
method: GET
- type: http
namespace: snowflake-comp
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-benchmarks
method: POST
- type: http
namespace: jira-comp
baseUri: "https://anheuser-busch.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
Extracts diversity and inclusion metrics from Workday, loads into Snowflake for trend analysis, and posts quarterly highlights to the HR leadership Teams channel.
naftiko: "0.5"
info:
label: "Workday Diversity Metrics Report"
description: "Extracts diversity and inclusion metrics from Workday, loads into Snowflake for trend analysis, and posts quarterly highlights to the HR leadership Teams channel."
tags:
- hr
- workday
- snowflake
- microsoft-teams
- diversity
capability:
exposes:
- type: mcp
namespace: diversity-ops
port: 8080
tools:
- name: generate-diversity-report
description: "Given a fiscal quarter, extract Workday diversity metrics, load into Snowflake, and post highlights to HR leadership via Teams."
inputParameters:
- name: fiscal_quarter
in: body
type: string
description: "The fiscal quarter in YYYY-QN format."
steps:
- name: get-metrics
type: call
call: "workday-diversity.get-dei-metrics"
with:
quarter: "{{fiscal_quarter}}"
- name: load-snowflake
type: call
call: "snowflake-diversity.insert-metrics"
with:
table: "HR.DIVERSITY_METRICS"
quarter: "{{fiscal_quarter}}"
data: "{{get-metrics.records}}"
- name: post-highlights
type: call
call: "msteams-diversity.post-message"
with:
channel_id: "$secrets.teams_hr_leadership_channel_id"
message: "D&I Report ({{fiscal_quarter}}): Representation {{get-metrics.underrepresented_percent}}% | Hiring {{get-metrics.diverse_hire_percent}}% | Promotion {{get-metrics.diverse_promotion_percent}}% | Retention {{get-metrics.retention_rate}}%"
consumes:
- type: http
namespace: workday-diversity
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: dei
path: "/workers"
operations:
- name: get-dei-metrics
method: GET
- type: http
namespace: snowflake-diversity
baseUri: "https://anheuser-busch.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-metrics
method: POST
- type: http
namespace: msteams-diversity
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/teams/{{channel_id}}/channels/messages"
operations:
- name: post-message
method: POST
Retrieves an employee profile from Workday by employee ID, returning name, title, department, and hire date.
naftiko: "0.5"
info:
label: "Workday Employee Profile Lookup"
description: "Retrieves an employee profile from Workday by employee ID, returning name, title, department, and hire date."
tags:
- hr
- workday
- employee-management
capability:
exposes:
- type: mcp
namespace: workday-hr
port: 8080
tools:
- name: get-employee
description: "Look up a Workday employee by ID. Returns full name, job title, department, and hire date."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
call: "workday-hr.get-worker"
with:
worker_id: "{{employee_id}}"
outputParameters:
- name: full_name
type: string
mapping: "$.Worker.Name"
- name: title
type: string
mapping: "$.Worker.JobTitle"
- name: department
type: string
mapping: "$.Worker.Department"
- name: hire_date
type: string
mapping: "$.Worker.HireDate"
consumes:
- type: http
namespace: workday-hr
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
Checks the status of a job requisition in Workday including approval state and number of applicants.
naftiko: "0.5"
info:
label: "Workday Position Requisition Status"
description: "Checks the status of a job requisition in Workday including approval state and number of applicants."
tags:
- hr
- workday
- recruiting
capability:
exposes:
- type: mcp
namespace: workday-recruiting
port: 8080
tools:
- name: get-requisition
description: "Look up a Workday job requisition by ID. Returns status, hiring manager, and applicant count."
inputParameters:
- name: requisition_id
in: body
type: string
description: "The Workday job requisition ID."
call: "workday-recruiting.get-requisition"
with:
req_id: "{{requisition_id}}"
outputParameters:
- name: status
type: string
mapping: "$.JobRequisition.Status"
- name: hiring_manager
type: string
mapping: "$.JobRequisition.HiringManager"
- name: applicant_count
type: number
mapping: "$.JobRequisition.ApplicantCount"
consumes:
- type: http
namespace: workday-recruiting
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/anheuser-busch"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: requisitions
path: "/jobRequisitions/{{req_id}}"
inputParameters:
- name: req_id
in: path
operations:
- name: get-requisition
method: GET
When an employee changes roles in Workday, notifies the new manager in Teams and creates a ServiceNow task to update system access.
naftiko: "0.5"
info:
label: "Workday Role Change Provisioning"
description: "When an employee changes roles in Workday, notifies the new manager in Teams and creates a ServiceNow task to update system access."
tags:
- hr
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-role-change
port: 8080
tools:
- name: sync-role-change
description: "Given a Workday employee ID and new role, create a ServiceNow access update task and notify the new manager via Teams."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the employee changing roles."
- name: new_role
in: body
type: string
description: "The new job role or title."
- name: new_manager_upn
in: body
type: string
description: "The UPN of the new manager."
steps:
- name: get-worker
type: call
call: "workday-role.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: create-access-task
type: call
call: "servicenow-role.create-task"
with:
short_description: "Access update for role change: {{get-worker.full_name}} to {{new_role}}"
assignment_group: "IT_Security"
- name: notify-manager
type: call
call: "msteams-role.send-message"
with:
recipient_upn: "{{new_manager_upn}}"
message: "{{get-worker.full_name}} has joined your team in role: {{new_role}}. IT access update task: {{create-access-task.number}}."
consumes:
- type: http
namespace: workday-role
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/anheuser-busch/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow-role
baseUri: "https://anheuser-busch.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams-role
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