Dow Capabilities
Naftiko 0.5 capability definitions for Dow - 100 capabilities showing integration workflows and service orchestrations.
Reviews access at Dow via Okta, IAM, and Jira.
naftiko: "0.5"
info:
label: "Access Review Pipeline"
description: "Reviews access at Dow via Okta, IAM, and Jira."
tags:
- security
- access-management
- okta
- compliance
capability:
exposes:
- type: mcp
namespace: access-rev
port: 8080
tools:
- name: review
description: "Review access at Dow."
inputParameters:
- name: dept
in: body
type: string
description: "Department."
steps:
- name: ent
type: call
call: "okta.get-users"
with:
dept: "{{dept}}"
- name: compare
type: call
call: "iam.compare"
with:
data: "{{ent.data}}"
- name: flag
type: call
call: "iam.flag"
with:
violations: "{{compare.violations}}"
- name: fix
type: call
call: "jira.create-issue"
with:
project: "IAM"
summary: "Violations in {{dept}}"
consumes:
- type: http
namespace: okta
baseUri: "https://dow.com.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users"
operations:
- name: get-users
method: GET
- type: http
namespace: iam
baseUri: "https://iam.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.iam_token"
resources:
- name: reviews
path: "/compare"
operations:
- name: compare
method: POST
- type: http
namespace: jira
baseUri: "https://dow.com.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Manages API deprecation at Dow via consumer identification, notices, and tracking.
naftiko: "0.5"
info:
label: "API Deprecation Pipeline"
description: "Manages API deprecation at Dow via consumer identification, notices, and tracking."
tags:
- api-management
- communications
- governance
capability:
exposes:
- type: mcp
namespace: api-sunset
port: 8080
tools:
- name: notify-sunset
description: "Manage API sunset at Dow."
inputParameters:
- name: api
in: body
type: string
description: "API name."
- name: date
in: body
type: string
description: "Sunset date."
steps:
- name: consumers
type: call
call: "api-gw.consumers"
with:
api: "{{api}}"
- name: notify
type: call
call: "email.batch"
with:
to: "{{consumers.emails}}"
subject: "{{api}} sunset: {{date}}"
- name: track
type: call
call: "analytics.usage"
with:
api: "{{api}}"
- name: ticket
type: call
call: "jira.create-issue"
with:
project: "API"
summary: "Sunset {{api}} by {{date}}"
consumes:
- type: http
namespace: api-gw
baseUri: "https://api-gw.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.api_gw_token"
resources:
- name: consumers
path: "/apis/{{api}}/consumers"
inputParameters:
- name: api
in: path
operations:
- name: consumers
method: GET
- type: http
namespace: email
baseUri: "https://email.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: batch
path: "/send-batch"
operations:
- name: batch
method: POST
- type: http
namespace: analytics
baseUri: "https://analytics.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.analytics_token"
resources:
- name: usage
path: "/api-usage"
operations:
- name: usage
method: GET
- type: http
namespace: jira
baseUri: "https://dow.com.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Checks build at Dow.
naftiko: "0.5"
info:
label: "Azure DevOps Build Check"
description: "Checks build at Dow."
tags:
- devops
- azure-devops
- ci-cd
capability:
exposes:
- type: mcp
namespace: azdo-build
port: 8080
tools:
- name: check-build
description: "Check build at Dow."
inputParameters:
- name: project
in: body
type: string
description: "Project."
- name: build_id
in: body
type: string
description: "Build ID."
call: "azdo.get-build"
with:
project: "{{project}}"
build_id: "{{build_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: azdo
baseUri: "https://dev.azure.com/dow.com"
authentication:
type: bearer
token: "$secrets.azdo_token"
resources:
- name: builds
path: "/{{project}}/_apis/build/builds/{{build_id}}"
inputParameters:
- name: project
in: path
- name: build_id
in: path
operations:
- name: get-build
method: GET
Queries Azure DevOps for release pipeline status for plant automation software, returning stage approvals and deployment status.
naftiko: "0.5"
info:
label: "Azure DevOps Release Gate for Plant Software"
description: "Queries Azure DevOps for release pipeline status for plant automation software, returning stage approvals and deployment status."
tags:
- devops
- azure-devops
- manufacturing
capability:
exposes:
- type: mcp
namespace: release-gate
port: 8080
tools:
- name: get-release-status
description: "Retrieve Azure DevOps release pipeline status by release ID."
inputParameters:
- name: project
in: body
type: string
description: "Azure DevOps project name."
- name: release_id
in: body
type: string
description: "The release pipeline ID."
call: "azure-devops.get-release"
with:
project: "{{project}}"
release_id: "{{release_id}}"
consumes:
- type: http
namespace: azure-devops
baseUri: "https://vsrm.dev.azure.com/dow"
authentication:
type: bearer
token: "$secrets.azure_devops_token"
resources:
- name: releases
path: "/{{project}}/_apis/release/releases/{{release_id}}?api-version=7.0"
inputParameters:
- name: project
in: path
- name: release_id
in: path
operations:
- name: get-release
method: GET
Verifies backups at Dow.
naftiko: "0.5"
info:
label: "Backup Verification Pipeline"
description: "Verifies backups at Dow."
tags:
- database
- backup
- operations
capability:
exposes:
- type: mcp
namespace: backup-verify
port: 8080
tools:
- name: verify-backups
description: "Verify backups at Dow."
inputParameters:
- name: db
in: body
type: string
description: "Database."
- name: date
in: body
type: string
description: "Backup date."
steps:
- name: status
type: call
call: "backup.get-status"
with:
db: "{{db}}"
date: "{{date}}"
- name: verify
type: call
call: "backup.verify"
with:
id: "{{status.backup_id}}"
- name: log
type: call
call: "snowflake.query"
with:
query: "INSERT INTO backup_log VALUES ('{{db}}','{{date}}','{{verify.status}}')"
- name: alert
type: call
call: "slack.post-message"
with:
channel: "#dba"
text: "Backup {{db}}: {{verify.status}}"
consumes:
- type: http
namespace: backup
baseUri: "https://backup.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.backup_token"
resources:
- name: backups
path: "/databases/{{db}}/status"
inputParameters:
- name: db
in: path
operations:
- name: get-status
method: GET
- type: http
namespace: snowflake
baseUri: "https://dow.com.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves lab results from PostgreSQL, validates against SAP batch specifications, generates a Crystal Reports quality certificate, and updates the Salesforce order with release status.
naftiko: "0.5"
info:
label: "Batch Quality Release Pipeline"
description: "Retrieves lab results from PostgreSQL, validates against SAP batch specifications, generates a Crystal Reports quality certificate, and updates the Salesforce order with release status."
tags:
- quality
- postgresql
- sap
- crystal-reports
- salesforce
- manufacturing
capability:
exposes:
- type: mcp
namespace: batch-release
port: 8080
tools:
- name: release-batch
description: "Given a batch number and customer order ID, validate lab results, generate a quality certificate, and update the sales order."
inputParameters:
- name: batch_number
in: body
type: string
description: "The production batch number."
- name: order_id
in: body
type: string
description: "The Salesforce customer order ID."
steps:
- name: get-lab-results
type: call
call: "postgresql.get-batch-results"
with:
batch_number: "{{batch_number}}"
- name: get-sap-spec
type: call
call: "sap.get-batch-spec"
with:
batch_number: "{{batch_number}}"
- name: generate-cert
type: call
call: "crystal-reports.run-quality-cert"
with:
batch_id: "{{batch_number}}"
spec_id: "{{get-sap-spec.spec_id}}"
- name: update-order
type: call
call: "salesforce.update-order"
with:
order_id: "{{order_id}}"
batch_number: "{{batch_number}}"
quality_status: "released"
certificate_url: "{{generate-cert.report_url}}"
consumes:
- type: http
namespace: postgresql
baseUri: "https://dow-lab-api.internal.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.lab_db_token"
resources:
- name: results
path: "/results?batch={{batch_number}}"
inputParameters:
- name: batch_number
in: query
operations:
- name: get-batch-results
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/QM_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batch-specs
path: "/A_BatchSpec('{{batch_number}}')"
inputParameters:
- name: batch_number
in: path
operations:
- name: get-batch-spec
method: GET
- type: http
namespace: crystal-reports
baseUri: "https://dow-bi.internal.dow.com/api/v1"
authentication:
type: basic
username: "$secrets.crystal_user"
password: "$secrets.crystal_password"
resources:
- name: quality-certs
path: "/reports/quality_certificate"
operations:
- name: run-quality-cert
method: POST
- type: http
namespace: salesforce
baseUri: "https://dow.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: orders
path: "/sobjects/Order/{{order_id}}"
inputParameters:
- name: order_id
in: path
operations:
- name: update-order
method: PATCH
Generates a Crystal Reports batch quality summary, archives the report to SharePoint, and emails the quality certificate to the customer via HubSpot.
naftiko: "0.5"
info:
label: "Batch Quality Report and Distribution"
description: "Generates a Crystal Reports batch quality summary, archives the report to SharePoint, and emails the quality certificate to the customer via HubSpot."
tags:
- quality
- crystal-reports
- sharepoint
- hubspot
- manufacturing
capability:
exposes:
- type: mcp
namespace: quality-reports
port: 8080
tools:
- name: generate-and-distribute-report
description: "Generate a batch quality report, archive it, and distribute to the customer."
inputParameters:
- name: batch_id
in: body
type: string
description: "The chemical production batch identifier."
- name: customer_email
in: body
type: string
description: "Customer email for report distribution."
steps:
- name: generate-report
type: call
call: "crystal-reports.run-report"
with:
batch_id: "{{batch_id}}"
- name: archive-report
type: call
call: "sharepoint.create-file"
with:
site_id: "quality_site"
file_path: "QualityReports/{{batch_id}}_quality.pdf"
- name: email-customer
type: call
call: "hubspot.send-email"
with:
to_email: "{{customer_email}}"
subject: "Quality Certificate: Batch {{batch_id}}"
body: "Attached is the quality certificate for batch {{batch_id}}. Report: {{archive-report.url}}."
consumes:
- type: http
namespace: crystal-reports
baseUri: "https://dow-bi.internal.dow.com/api/v1"
authentication:
type: basic
username: "$secrets.crystal_user"
password: "$secrets.crystal_password"
resources:
- name: reports
path: "/reports/batch_quality?batch_id={{batch_id}}"
inputParameters:
- name: batch_id
in: query
operations:
- name: run-report
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Retrieves the latest commodity price for a chemical feedstock from Bloomberg Enterprise Data, returning price, currency, and timestamp for procurement cost analysis.
naftiko: "0.5"
info:
label: "Bloomberg Chemical Commodity Price Check"
description: "Retrieves the latest commodity price for a chemical feedstock from Bloomberg Enterprise Data, returning price, currency, and timestamp for procurement cost analysis."
tags:
- finance
- bloomberg
- supply-chain
capability:
exposes:
- type: mcp
namespace: commodity-pricing
port: 8080
tools:
- name: get-commodity-price
description: "Fetch the latest price for a chemical commodity ticker from Bloomberg Enterprise Data."
inputParameters:
- name: ticker
in: body
type: string
description: "The Bloomberg ticker symbol for the chemical commodity."
call: "bloomberg.get-price"
with:
ticker: "{{ticker}}"
consumes:
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: prices
path: "/prices?ticker={{ticker}}"
inputParameters:
- name: ticker
in: query
operations:
- name: get-price
method: GET
Analyzes budget variance at Dow via Oracle, Workday, and Slack.
naftiko: "0.5"
info:
label: "Budget Variance Pipeline"
description: "Analyzes budget variance at Dow via Oracle, Workday, and Slack."
tags:
- finance
- budget
- oracle
- workday
capability:
exposes:
- type: mcp
namespace: budget-var
port: 8080
tools:
- name: analyze-variance
description: "Check budget variance at Dow."
inputParameters:
- name: cc
in: body
type: string
description: "Cost center."
- name: period
in: body
type: string
description: "Period."
steps:
- name: actuals
type: call
call: "oracle.get-actuals"
with:
cc: "{{cc}}"
period: "{{period}}"
- name: budget
type: call
call: "workday.get-budget"
with:
cc: "{{cc}}"
- name: compute
type: call
call: "analytics.variance"
with:
a: "{{actuals.total}}"
b: "{{budget.total}}"
- name: alert
type: call
call: "slack.post-message"
with:
channel: "#finance"
text: "Variance {{cc}}: ${{compute.variance}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://oracle.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: fin
path: "/actuals"
operations:
- name: get-actuals
method: GET
- type: http
namespace: workday
baseUri: "https://wd5.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: budgets
path: "/budgets"
operations:
- name: get-budget
method: GET
- type: http
namespace: analytics
baseUri: "https://analytics.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.analytics_token"
resources:
- name: var
path: "/compute"
operations:
- name: variance
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Retrieves Adobe Analytics campaign metrics, enriches top-performing leads with ZoomInfo company data, and updates Salesforce opportunities with attribution data.
naftiko: "0.5"
info:
label: "Campaign Performance and Lead Enrichment Pipeline"
description: "Retrieves Adobe Analytics campaign metrics, enriches top-performing leads with ZoomInfo company data, and updates Salesforce opportunities with attribution data."
tags:
- marketing
- adobe-analytics
- zoominfo
- salesforce
- products
capability:
exposes:
- type: mcp
namespace: campaign-analytics
port: 8080
tools:
- name: analyze-and-enrich-campaign
description: "Get campaign metrics, enrich leads with ZoomInfo, and update Salesforce opportunities."
inputParameters:
- name: campaign_id
in: body
type: string
description: "The Adobe Analytics campaign identifier."
- name: lead_company
in: body
type: string
description: "Top lead company name for enrichment."
steps:
- name: get-campaign
type: call
call: "adobe-analytics.get-campaign-report"
with:
campaign_id: "{{campaign_id}}"
- name: enrich-lead
type: call
call: "zoominfo.search-company"
with:
company_name: "{{lead_company}}"
- name: update-opportunity
type: call
call: "salesforce.update-opportunity"
with:
campaign_id: "{{campaign_id}}"
company: "{{lead_company}}"
revenue: "{{enrich-lead.revenue}}"
employees: "{{enrich-lead.employee_count}}"
consumes:
- type: http
namespace: adobe-analytics
baseUri: "https://analytics.adobe.io/api/dow"
authentication:
type: bearer
token: "$secrets.adobe_analytics_token"
resources:
- name: reports
path: "/reports"
operations:
- name: get-campaign-report
method: POST
- type: http
namespace: zoominfo
baseUri: "https://api.zoominfo.com/search"
authentication:
type: bearer
token: "$secrets.zoominfo_token"
resources:
- name: companies
path: "/company"
operations:
- name: search-company
method: POST
- type: http
namespace: salesforce
baseUri: "https://dow.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity"
operations:
- name: update-opportunity
method: POST
Plans capacity at Dow by collecting utilization and forecasting.
naftiko: "0.5"
info:
label: "Capacity Planning Pipeline"
description: "Plans capacity at Dow by collecting utilization and forecasting."
tags:
- infrastructure
- capacity-planning
- forecasting
capability:
exposes:
- type: mcp
namespace: capacity
port: 8080
tools:
- name: plan-capacity
description: "Plan capacity at Dow."
inputParameters:
- name: resource
in: body
type: string
description: "Resource type."
- name: months
in: body
type: number
description: "Forecast months."
steps:
- name: util
type: call
call: "monitoring.get-util"
with:
resource: "{{resource}}"
- name: forecast
type: call
call: "analytics.forecast"
with:
current: "{{util.pct}}"
months: "{{months}}"
- name: procure
type: call
call: "servicenow.create-request"
with:
type: "capacity"
resource: "{{resource}}"
- name: dashboard
type: call
call: "power-bi.refresh"
with:
dataset: "capacity"
consumes:
- type: http
namespace: monitoring
baseUri: "https://monitoring.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.monitoring_token"
resources:
- name: util
path: "/resources/{{resource}}/util"
inputParameters:
- name: resource
in: path
operations:
- name: get-util
method: GET
- type: http
namespace: analytics
baseUri: "https://analytics.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.analytics_token"
resources:
- name: forecast
path: "/demand"
operations:
- name: forecast
method: POST
- type: http
namespace: servicenow
baseUri: "https://dow.com.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
- type: http
namespace: power-bi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.power_bi_token"
resources:
- name: datasets
path: "/datasets/{{dataset}}/refreshes"
inputParameters:
- name: dataset
in: path
operations:
- name: refresh
method: POST
Monitors cert expiry at Dow.
naftiko: "0.5"
info:
label: "Certificate Expiry Pipeline"
description: "Monitors cert expiry at Dow."
tags:
- security
- certificates
- monitoring
capability:
exposes:
- type: mcp
namespace: cert-monitor
port: 8080
tools:
- name: check-certs
description: "Monitor certs at Dow."
inputParameters:
- name: domains
in: body
type: string
description: "Domains to check."
steps:
- name: scan
type: call
call: "cert-scanner.scan"
with:
domains: "{{domains}}"
- name: filter
type: call
call: "analytics.filter-expiring"
with:
certs: "{{scan.results}}"
- name: ticket
type: call
call: "jira.create-issue"
with:
project: "SEC"
summary: "{{filter.count}} certs expiring"
- name: alert
type: call
call: "slack.post-message"
with:
channel: "#security"
text: "Cert alert: {{filter.count}} expiring"
consumes:
- type: http
namespace: cert-scanner
baseUri: "https://certs.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.cert_token"
resources:
- name: scans
path: "/scan"
operations:
- name: scan
method: POST
- type: http
namespace: jira
baseUri: "https://dow.com.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Routes changes at Dow through ServiceNow and CAB approval.
naftiko: "0.5"
info:
label: "Change Management Pipeline"
description: "Routes changes at Dow through ServiceNow and CAB approval."
tags:
- change-management
- servicenow
- itil
capability:
exposes:
- type: mcp
namespace: change-mgmt
port: 8080
tools:
- name: process-change
description: "Process changes at Dow."
inputParameters:
- name: change_id
in: body
type: string
description: "Change ID."
- name: date
in: body
type: string
description: "Date."
steps:
- name: get
type: call
call: "servicenow.get-change"
with:
id: "{{change_id}}"
- name: conflicts
type: call
call: "servicenow.check-conflicts"
with:
date: "{{date}}"
- name: submit
type: call
call: "servicenow.update"
with:
id: "{{change_id}}"
state: "approval"
- name: notify
type: call
call: "email.send"
with:
to: "cab@co.com"
subject: "CAB: {{change_id}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://dow.com.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: changes
path: "/table/change_request/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get-change
method: GET
- type: http
namespace: email
baseUri: "https://email.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
Fetches product specification from SAP material master, retrieves associated SDS from Elasticsearch, gathers pricing from Salesforce CPQ, and compiles the data into a SharePoint product dossier.
naftiko: "0.5"
info:
label: "Chemical Product Specification Retrieval Pipeline"
description: "Fetches product specification from SAP material master, retrieves associated SDS from Elasticsearch, gathers pricing from Salesforce CPQ, and compiles the data into a SharePoint product dossier."
tags:
- products
- sap
- elasticsearch
- salesforce
- sharepoint
capability:
exposes:
- type: mcp
namespace: product-spec
port: 8080
tools:
- name: compile-product-dossier
description: "Given a material number, compile full product specification dossier from SAP, Elasticsearch SDS, Salesforce pricing, and archive to SharePoint."
inputParameters:
- name: material_number
in: body
type: string
description: "The SAP material master number."
- name: customer_id
in: body
type: string
description: "Salesforce customer account ID for pricing."
steps:
- name: get-material-spec
type: call
call: "sap.get-material"
with:
material_number: "{{material_number}}"
- name: get-sds
type: call
call: "elasticsearch.search-sds"
with:
query_text: "{{material_number}}"
- name: get-pricing
type: call
call: "salesforce.get-pricing"
with:
material: "{{material_number}}"
account_id: "{{customer_id}}"
- name: archive-dossier
type: call
call: "sharepoint.create-file"
with:
site_id: "product_library_site"
file_path: "ProductDossiers/{{material_number}}/dossier_{{customer_id}}.json"
consumes:
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: materials
path: "/A_Material('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material
method: GET
- type: http
namespace: elasticsearch
baseUri: "https://dow-es.internal.dow.com"
authentication:
type: bearer
token: "$secrets.elasticsearch_token"
resources:
- name: sds-index
path: "/sds/_search"
operations:
- name: search-sds
method: POST
- type: http
namespace: salesforce
baseUri: "https://dow.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: pricing
path: "/sobjects/PricebookEntry?material={{material}}&account={{account_id}}"
inputParameters:
- name: material
in: query
- name: account_id
in: query
operations:
- name: get-pricing
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
Retrieves Circana market data for a chemical product segment, returning market share, growth rate, and competitive positioning used by Dow commercial teams.
naftiko: "0.5"
info:
label: "Circana Market Intelligence Lookup"
description: "Retrieves Circana market data for a chemical product segment, returning market share, growth rate, and competitive positioning used by Dow commercial teams."
tags:
- marketing
- circana
- market-intelligence
capability:
exposes:
- type: mcp
namespace: market-intel
port: 8080
tools:
- name: get-market-data
description: "Fetch Circana market intelligence for a chemical product segment."
inputParameters:
- name: segment_id
in: body
type: string
description: "The Circana product segment identifier."
call: "circana.get-segment-data"
with:
segment_id: "{{segment_id}}"
consumes:
- type: http
namespace: circana
baseUri: "https://api.circana.com/v2"
authentication:
type: bearer
token: "$secrets.circana_token"
resources:
- name: segments
path: "/segments/{{segment_id}}/summary"
inputParameters:
- name: segment_id
in: path
operations:
- name: get-segment-data
method: GET
Queries the ClickHouse process historian database for time-series data from chemical plant sensors, returning temperature, pressure, and flow readings for a specified time range.
naftiko: "0.5"
info:
label: "ClickHouse Process Historian Query"
description: "Queries the ClickHouse process historian database for time-series data from chemical plant sensors, returning temperature, pressure, and flow readings for a specified time range."
tags:
- manufacturing
- clickhouse
- process-data
capability:
exposes:
- type: mcp
namespace: process-historian
port: 8080
tools:
- name: query-process-data
description: "Query ClickHouse process historian for sensor readings by reactor and time range."
inputParameters:
- name: reactor_id
in: body
type: string
description: "The reactor unit identifier."
- name: from_ts
in: body
type: string
description: "Start timestamp in ISO-8601 format."
- name: to_ts
in: body
type: string
description: "End timestamp in ISO-8601 format."
call: "clickhouse.query-sensor-data"
with:
reactor_id: "{{reactor_id}}"
from_ts: "{{from_ts}}"
to_ts: "{{to_ts}}"
consumes:
- type: http
namespace: clickhouse
baseUri: "https://dow-ch.internal.dow.com:8443"
authentication:
type: basic
username: "$secrets.clickhouse_user"
password: "$secrets.clickhouse_password"
resources:
- name: sensor-data
path: "/?query=SELECT * FROM process_data WHERE reactor_id='{{reactor_id}}' AND timestamp BETWEEN '{{from_ts}}' AND '{{to_ts}}'"
inputParameters:
- name: reactor_id
in: query
- name: from_ts
in: query
- name: to_ts
in: query
operations:
- name: query-sensor-data
method: GET
Optimizes cloud costs at Dow via Azure, FinOps, Jira, and Power BI.
naftiko: "0.5"
info:
label: "Cloud Cost Optimization Pipeline"
description: "Optimizes cloud costs at Dow via Azure, FinOps, Jira, and Power BI."
tags:
- cloud
- cost-management
- finops
capability:
exposes:
- type: mcp
namespace: cloud-opt
port: 8080
tools:
- name: optimize
description: "Optimize cloud costs at Dow."
inputParameters:
- name: provider
in: body
type: string
description: "Provider."
- name: range
in: body
type: string
description: "Range."
steps:
- name: spend
type: call
call: "cloud.get-costs"
with:
provider: "{{provider}}"
range: "{{range}}"
- name: savings
type: call
call: "finops.analyze"
with:
data: "{{spend.data}}"
- name: action
type: call
call: "jira.create-issue"
with:
project: "FINOPS"
summary: "Save ${{savings.potential}}"
- name: report
type: call
call: "power-bi.refresh"
with:
dataset: "cloud"
consumes:
- type: http
namespace: cloud
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: costs
path: "/providers/Microsoft.CostManagement/query"
operations:
- name: get-costs
method: POST
- type: http
namespace: finops
baseUri: "https://finops.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.finops_token"
resources:
- name: analysis
path: "/savings"
operations:
- name: analyze
method: POST
- type: http
namespace: jira
baseUri: "https://dow.com.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: power-bi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.power_bi_token"
resources:
- name: datasets
path: "/datasets/{{dataset}}/refreshes"
inputParameters:
- name: dataset
in: path
operations:
- name: refresh
method: POST
Searches Confluence at Dow.
naftiko: "0.5"
info:
label: "Confluence Article Search"
description: "Searches Confluence at Dow."
tags:
- knowledge-management
- confluence
- documentation
capability:
exposes:
- type: mcp
namespace: confluence-search
port: 8080
tools:
- name: search-articles
description: "Search Confluence at Dow."
inputParameters:
- name: query
in: body
type: string
description: "Query."
call: "confluence.search"
with:
query: "{{query}}"
outputParameters:
- name: title
type: string
mapping: "$.results[0].title"
consumes:
- type: http
namespace: confluence
baseUri: "https://dow.com.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: content
path: "/content/search"
operations:
- name: search
method: GET
Tracks contract renewals at Dow via contracts system, email, Jira, and Salesforce.
naftiko: "0.5"
info:
label: "Contract Renewal Pipeline"
description: "Tracks contract renewals at Dow via contracts system, email, Jira, and Salesforce."
tags:
- procurement
- contracts
- salesforce
- jira
capability:
exposes:
- type: mcp
namespace: contract-renew
port: 8080
tools:
- name: track
description: "Track renewals at Dow."
inputParameters:
- name: contract_id
in: body
type: string
description: "Contract ID."
- name: owner
in: body
type: string
description: "Owner email."
steps:
- name: get
type: call
call: "contracts.get"
with:
id: "{{contract_id}}"
- name: remind
type: call
call: "email.send"
with:
to: "{{owner}}"
subject: "Renewal: {{contract_id}}"
- name: task
type: call
call: "jira.create-issue"
with:
project: "PROC"
summary: "Renew {{contract_id}}"
- name: crm
type: call
call: "salesforce.update"
with:
id: "{{contract_id}}"
stage: "Renewal"
consumes:
- type: http
namespace: contracts
baseUri: "https://contracts.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.contracts_token"
resources:
- name: contracts
path: "/contracts/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get
method: GET
- type: http
namespace: email
baseUri: "https://email.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
- type: http
namespace: jira
baseUri: "https://dow.com.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: salesforce
baseUri: "https://dow.com.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opps
path: "/sobjects/Opportunity"
operations:
- name: update
method: PATCH
Reallocates costs at Dow.
naftiko: "0.5"
info:
label: "Cost Reallocation Pipeline"
description: "Reallocates costs at Dow."
tags:
- finance
- cost-allocation
- oracle
capability:
exposes:
- type: mcp
namespace: cost-realloc
port: 8080
tools:
- name: reallocate
description: "Reallocate costs at Dow."
inputParameters:
- name: source
in: body
type: string
description: "Source CC."
- name: target
in: body
type: string
description: "Target CC."
- name: amount
in: body
type: number
description: "Amount."
steps:
- name: current
type: call
call: "oracle.get-alloc"
with:
cc: "{{source}}"
- name: compute
type: call
call: "analytics.realloc"
with:
source: "{{source}}"
target: "{{target}}"
amount: "{{amount}}"
- name: post
type: call
call: "oracle.post-journal"
with:
entries: "{{compute.entries}}"
- name: notify
type: call
call: "slack.post-message"
with:
channel: "#finance"
text: "Reallocated ${{amount}} from {{source}} to {{target}}"
consumes:
- type: http
namespace: oracle
baseUri: "https://oracle.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: allocations
path: "/cost-centers/{{cc}}/allocations"
inputParameters:
- name: cc
in: path
operations:
- name: get-alloc
method: GET
- type: http
namespace: analytics
baseUri: "https://analytics.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.analytics_token"
resources:
- name: realloc
path: "/compute"
operations:
- name: realloc
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
When a customer complaint arrives in Salesforce, creates a ServiceNow quality investigation, links to SAP batch records, and tracks corrective action in Microsoft Planner.
naftiko: "0.5"
info:
label: "Customer Complaint to CAPA Pipeline"
description: "When a customer complaint arrives in Salesforce, creates a ServiceNow quality investigation, links to SAP batch records, and tracks corrective action in Microsoft Planner."
tags:
- quality
- salesforce
- servicenow
- sap
- microsoft-planner
capability:
exposes:
- type: mcp
namespace: capa-pipeline
port: 8080
tools:
- name: initiate-capa
description: "Given a Salesforce case ID, create a corrective action workflow across ServiceNow, SAP, and Microsoft Planner."
inputParameters:
- name: case_id
in: body
type: string
description: "The Salesforce case record ID."
- name: batch_number
in: body
type: string
description: "The production batch number linked to the complaint."
steps:
- name: get-case
type: call
call: "salesforce.get-case"
with:
case_id: "{{case_id}}"
- name: get-batch-record
type: call
call: "sap.get-batch-record"
with:
batch_number: "{{batch_number}}"
- name: create-investigation
type: call
call: "servicenow.create-task"
with:
short_description: "CAPA Investigation: {{get-case.subject}}"
description: "Customer: {{get-case.account_name}}. Complaint: {{get-case.description}}. Batch: {{batch_number}}. Material: {{get-batch-record.material}}. Production date: {{get-batch-record.production_date}}."
assigned_group: "Quality_Assurance"
category: "capa_investigation"
- name: create-planner-task
type: call
call: "planner.create-task"
with:
plan_id: "quality_capa_plan"
title: "CAPA: {{get-case.subject}} — Batch {{batch_number}}"
notes: "ServiceNow task: {{create-investigation.number}}. Salesforce case: {{case_id}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://dow.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{case_id}}"
inputParameters:
- name: case_id
in: path
operations:
- name: get-case
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/QM_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batch-records
path: "/A_Batch('{{batch_number}}')"
inputParameters:
- name: batch_number
in: path
operations:
- name: get-batch-record
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: planner
baseUri: "https://graph.microsoft.com/v1.0/planner"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: tasks
path: "/tasks"
operations:
- name: create-task
method: POST
Tracks a customer order end-to-end: retrieves the Salesforce order, checks SAP production status, queries Oracle EBS shipping, and updates the customer via HubSpot email with fulfillment status.
naftiko: "0.5"
info:
label: "Customer Order Fulfillment Tracker"
description: "Tracks a customer order end-to-end: retrieves the Salesforce order, checks SAP production status, queries Oracle EBS shipping, and updates the customer via HubSpot email with fulfillment status."
tags:
- customer-service
- salesforce
- sap
- oracle-ebs
- hubspot
capability:
exposes:
- type: mcp
namespace: order-fulfillment
port: 8080
tools:
- name: track-order-fulfillment
description: "Given a customer order ID, gather production and shipping status and notify the customer."
inputParameters:
- name: order_id
in: body
type: string
description: "The Salesforce order record ID."
- name: customer_email
in: body
type: string
description: "Customer contact email for status update."
steps:
- name: get-order
type: call
call: "salesforce.get-order"
with:
order_id: "{{order_id}}"
- name: get-production-status
type: call
call: "sap.get-production-order"
with:
order_number: "{{get-order.sap_production_order}}"
- name: get-shipping-status
type: call
call: "oracle-ebs.get-shipment"
with:
order_ref: "{{order_id}}"
- name: notify-customer
type: call
call: "hubspot.send-email"
with:
to_email: "{{customer_email}}"
subject: "Order Update: {{order_id}}"
body: "Your order {{order_id}} status: Production — {{get-production-status.status}}. Shipping — {{get-shipping-status.status}}. Expected delivery: {{get-shipping-status.estimated_arrival}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://dow.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: orders
path: "/sobjects/Order/{{order_id}}"
inputParameters:
- name: order_id
in: path
operations:
- name: get-order
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production-orders
path: "/A_ProductionOrder('{{order_number}}')"
inputParameters:
- name: order_number
in: path
operations:
- name: get-production-order
method: GET
- type: http
namespace: oracle-ebs
baseUri: "https://dow-ebs.oracle.com/webservices/rest/shipping/v1"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: shipments
path: "/shipments?order_ref={{order_ref}}"
inputParameters:
- name: order_ref
in: query
operations:
- name: get-shipment
method: GET
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Retrieves a customer order from Salesforce, checks SAP production order progress, and enriches the customer record in HubSpot with the latest fulfillment status.
naftiko: "0.5"
info:
label: "Customer Order with Production Visibility"
description: "Retrieves a customer order from Salesforce, checks SAP production order progress, and enriches the customer record in HubSpot with the latest fulfillment status."
tags:
- sales
- salesforce
- sap
- hubspot
- customer-service
capability:
exposes:
- type: mcp
namespace: sales-orders
port: 8080
tools:
- name: get-order-with-production
description: "Look up a Salesforce order, check SAP production progress, and update HubSpot CRM contact."
inputParameters:
- name: order_id
in: body
type: string
description: "The Salesforce order record ID."
steps:
- name: get-order
type: call
call: "salesforce.get-order"
with:
order_id: "{{order_id}}"
- name: get-production
type: call
call: "sap.get-production-order"
with:
order_number: "{{get-order.sap_production_order}}"
- name: update-crm
type: call
call: "hubspot.update-contact"
with:
email: "{{get-order.customer_email}}"
order_status: "{{get-production.status}}"
estimated_ship: "{{get-production.planned_finish}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://dow.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: orders
path: "/sobjects/Order/{{order_id}}"
inputParameters:
- name: order_id
in: path
operations:
- name: get-order
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production-orders
path: "/A_ProductionOrder('{{order_number}}')"
inputParameters:
- name: order_number
in: path
operations:
- name: get-production-order
method: GET
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: contacts
path: "/crm/v3/objects/contacts/{{email}}"
inputParameters:
- name: email
in: path
operations:
- name: update-contact
method: PATCH
Monitors data pipelines at Dow via Databricks, Snowflake, Slack, and ServiceNow.
naftiko: "0.5"
info:
label: "Data Pipeline Monitor Pipeline"
description: "Monitors data pipelines at Dow via Databricks, Snowflake, Slack, and ServiceNow."
tags:
- data-engineering
- databricks
- monitoring
- slack
capability:
exposes:
- type: mcp
namespace: pipeline-mon
port: 8080
tools:
- name: monitor
description: "Monitor pipelines at Dow."
inputParameters:
- name: pipeline_id
in: body
type: string
description: "Pipeline ID."
steps:
- name: status
type: call
call: "databricks.get-run"
with:
id: "{{pipeline_id}}"
- name: quality
type: call
call: "snowflake.query"
with:
query: "SELECT COUNT(*) FROM out WHERE p='{{pipeline_id}}'"
- name: alert
type: call
call: "slack.post-message"
with:
channel: "#data"
text: "Pipeline {{pipeline_id}}: {{status.state}}"
- name: incident
type: call
call: "servicenow.create-incident"
with:
desc: "Pipeline {{pipeline_id}} issue"
consumes:
- type: http
namespace: databricks
baseUri: "https://dow.com.cloud.databricks.com/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/runs/get"
operations:
- name: get-run
method: GET
- type: http
namespace: snowflake
baseUri: "https://dow.com.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
- type: http
namespace: servicenow
baseUri: "https://dow.com.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Checks Datadog monitor at Dow.
naftiko: "0.5"
info:
label: "Datadog Monitor Check"
description: "Checks Datadog monitor at Dow."
tags:
- monitoring
- datadog
- observability
capability:
exposes:
- type: mcp
namespace: dd-monitor
port: 8080
tools:
- name: check-monitor
description: "Check monitor at Dow."
inputParameters:
- name: monitor_id
in: body
type: string
description: "Monitor ID."
call: "datadog.get-monitor"
with:
monitor_id: "{{monitor_id}}"
outputParameters:
- name: status
type: string
mapping: "$.overall_state"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
Tests disaster recovery at Dow via failover, health checks, and reporting.
naftiko: "0.5"
info:
label: "DR Test Pipeline"
description: "Tests disaster recovery at Dow via failover, health checks, and reporting."
tags:
- disaster-recovery
- business-continuity
- testing
capability:
exposes:
- type: mcp
namespace: dr-test
port: 8080
tools:
- name: test-dr
description: "Test DR at Dow."
inputParameters:
- name: plan_id
in: body
type: string
description: "Plan ID."
- name: type
in: body
type: string
description: "Test type."
steps:
- name: failover
type: call
call: "dr.failover"
with:
plan: "{{plan_id}}"
type: "{{type}}"
- name: validate
type: call
call: "monitoring.check"
with:
scope: "critical"
- name: measure
type: call
call: "dr.metrics"
with:
id: "{{failover.id}}"
- name: report
type: call
call: "confluence.create-page"
with:
title: "DR - {{plan_id}}"
body: "RTO:{{measure.rto}}m RPO:{{measure.rpo}}m"
consumes:
- type: http
namespace: dr
baseUri: "https://dr.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.dr_token"
resources:
- name: failovers
path: "/failovers"
operations:
- name: failover
method: POST
- type: http
namespace: monitoring
baseUri: "https://monitoring.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.monitoring_token"
resources:
- name: health
path: "/checks"
operations:
- name: check
method: POST
- type: http
namespace: confluence
baseUri: "https://dow.com.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
Detects infrastructure drift at Dow via Terraform, Slack, and Jira.
naftiko: "0.5"
info:
label: "Drift Detection Pipeline"
description: "Detects infrastructure drift at Dow via Terraform, Slack, and Jira."
tags:
- infrastructure
- terraform
- drift-detection
- devops
capability:
exposes:
- type: mcp
namespace: drift-det
port: 8080
tools:
- name: detect
description: "Detect drift at Dow."
inputParameters:
- name: ws_id
in: body
type: string
description: "Workspace ID."
- name: env
in: body
type: string
description: "Environment."
steps:
- name: plan
type: call
call: "terraform.run"
with:
ws: "{{ws_id}}"
- name: check
type: call
call: "terraform.get-plan"
with:
run: "{{plan.id}}"
- name: alert
type: call
call: "slack.post-message"
with:
channel: "#infra"
text: "Drift {{env}}: {{check.changes}} changes"
- name: ticket
type: call
call: "jira.create-issue"
with:
project: "INFRA"
summary: "Drift in {{env}}"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/runs"
operations:
- name: run
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
- type: http
namespace: jira
baseUri: "https://dow.com.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Processes an inbound EDI 850 purchase order: parses the order in Oracle EBS, validates customer credit in Salesforce, creates a SAP production order, and sends order confirmation via HubSpot.
naftiko: "0.5"
info:
label: "EDI Order Processing Pipeline"
description: "Processes an inbound EDI 850 purchase order: parses the order in Oracle EBS, validates customer credit in Salesforce, creates a SAP production order, and sends order confirmation via HubSpot."
tags:
- supply-chain
- oracle-ebs
- salesforce
- sap
- hubspot
- edi
capability:
exposes:
- type: mcp
namespace: edi-processing
port: 8080
tools:
- name: process-edi-order
description: "Given an EDI transaction ID, parse the order, validate credit, create production order, and confirm."
inputParameters:
- name: edi_transaction_id
in: body
type: string
description: "The EDI 850 transaction identifier."
- name: customer_email
in: body
type: string
description: "Customer contact email for confirmation."
steps:
- name: parse-edi
type: call
call: "oracle-ebs.get-edi-transaction"
with:
transaction_id: "{{edi_transaction_id}}"
- name: check-credit
type: call
call: "salesforce.get-account-credit"
with:
account_id: "{{parse-edi.customer_account_id}}"
- name: create-production-order
type: call
call: "sap.create-production-order"
with:
material: "{{parse-edi.material_number}}"
quantity: "{{parse-edi.quantity}}"
plant: "{{parse-edi.ship_to_plant}}"
customer_po: "{{parse-edi.po_number}}"
- name: send-confirmation
type: call
call: "hubspot.send-email"
with:
to_email: "{{customer_email}}"
subject: "Order Confirmation: PO {{parse-edi.po_number}}"
body: "Your order for {{parse-edi.quantity}} units of {{parse-edi.material_description}} has been received. Production order: {{create-production-order.order_number}}. Estimated ship date: {{create-production-order.planned_finish}}."
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://dow-ebs.oracle.com/webservices/rest/edi/v1"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: edi-transactions
path: "/transactions/{{transaction_id}}"
inputParameters:
- name: transaction_id
in: path
operations:
- name: get-edi-transaction
method: GET
- type: http
namespace: salesforce
baseUri: "https://dow.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-credit
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production-orders
path: "/A_ProductionOrder"
operations:
- name: create-production-order
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Checks ES index at Dow.
naftiko: "0.5"
info:
label: "ES Index Health"
description: "Checks ES index at Dow."
tags:
- search
- elasticsearch
- infrastructure
capability:
exposes:
- type: mcp
namespace: es-health
port: 8080
tools:
- name: check-index
description: "Check ES index at Dow."
inputParameters:
- name: index
in: body
type: string
description: "Index name."
call: "es.get-health"
with:
index: "{{index}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: docs
type: number
mapping: "$.docs.count"
consumes:
- type: http
namespace: es
baseUri: "https://es.dow.com:9200"
authentication:
type: bearer
token: "$secrets.es_token"
resources:
- name: indices
path: "/{{index}}/_stats"
inputParameters:
- name: index
in: path
operations:
- name: get-health
method: GET
Offboards employees at Dow via Okta, Slack, ServiceNow, and storage.
naftiko: "0.5"
info:
label: "Employee Offboarding Pipeline"
description: "Offboards employees at Dow via Okta, Slack, ServiceNow, and storage."
tags:
- hr
- offboarding
- okta
- servicenow
capability:
exposes:
- type: mcp
namespace: offboarding
port: 8080
tools:
- name: offboard
description: "Offboard employees at Dow."
inputParameters:
- name: emp_id
in: body
type: string
description: "Employee ID."
- name: last_day
in: body
type: string
description: "Last day."
steps:
- name: disable
type: call
call: "okta.deactivate"
with:
user: "{{emp_id}}"
- name: revoke
type: call
call: "slack.remove"
with:
user: "{{emp_id}}"
- name: return
type: call
call: "servicenow.create-request"
with:
type: "return"
emp: "{{emp_id}}"
- name: archive
type: call
call: "storage.archive"
with:
user: "{{emp_id}}"
consumes:
- type: http
namespace: okta
baseUri: "https://dow.com.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users/{{user}}/lifecycle/deactivate"
inputParameters:
- name: user
in: path
operations:
- name: deactivate
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: users
path: "/users.admin.remove"
operations:
- name: remove
method: POST
- type: http
namespace: servicenow
baseUri: "https://dow.com.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
- type: http
namespace: storage
baseUri: "https://storage.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.storage_token"
resources:
- name: archives
path: "/archive"
operations:
- name: archive
method: POST
On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for safety training documents, and sends a welcome message via HubSpot email.
naftiko: "0.5"
info:
label: "Employee Onboarding for Plant Operations"
description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for safety training documents, and sends a welcome message via HubSpot email."
tags:
- hr
- onboarding
- workday
- servicenow
- sharepoint
- hubspot
capability:
exposes:
- type: mcp
namespace: plant-onboarding
port: 8080
tools:
- name: trigger-plant-onboarding
description: "Given a Workday employee ID and plant assignment, orchestrate onboarding across ServiceNow, SharePoint, and HubSpot."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID for the new hire."
- name: plant_code
in: body
type: string
description: "The Dow plant code the employee is assigned to."
- name: start_date
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: open-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Plant onboarding: {{get-employee.full_name}} at {{plant_code}}"
category: "plant_onboarding"
assigned_group: "Plant_HR_{{plant_code}}"
description: "New hire {{get-employee.full_name}} starting {{start_date}} at plant {{plant_code}}. Safety orientation required."
- name: provision-folder
type: call
call: "sharepoint.create-folder"
with:
site_id: "plant_onboarding_site"
folder_path: "SafetyTraining/{{plant_code}}/{{get-employee.full_name}}_{{start_date}}"
- name: send-welcome
type: call
call: "hubspot.send-email"
with:
to_email: "{{get-employee.work_email}}"
subject: "Welcome to Dow Plant {{plant_code}}"
body: "Welcome {{get-employee.first_name}}! Your onboarding ticket is {{open-ticket.number}}. Safety training documents: {{provision-folder.url}}."
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: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.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: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/{{site_id}}/drive/root:/{{folder_path}}"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
operations:
- name: create-folder
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Collects emissions data from Datadog plant sensors, cross-references with SAP EHS permit thresholds, archives the report to SharePoint, and creates a ServiceNow compliance task if limits are exceeded.
naftiko: "0.5"
info:
label: "Environmental Emissions Reporting Pipeline"
description: "Collects emissions data from Datadog plant sensors, cross-references with SAP EHS permit thresholds, archives the report to SharePoint, and creates a ServiceNow compliance task if limits are exceeded."
tags:
- environmental
- compliance
- datadog
- sap
- sharepoint
- servicenow
capability:
exposes:
- type: mcp
namespace: emissions-reporting
port: 8080
tools:
- name: run-emissions-report
description: "Given a plant code and reporting period, collect sensor data, validate against EHS thresholds, archive report, and flag exceedances."
inputParameters:
- name: plant_code
in: body
type: string
description: "The Dow plant site code."
- name: period_start
in: body
type: string
description: "Reporting period start date in YYYY-MM-DD format."
- name: period_end
in: body
type: string
description: "Reporting period end date in YYYY-MM-DD format."
steps:
- name: get-sensor-data
type: call
call: "datadog.get-emissions-metrics"
with:
plant_tag: "{{plant_code}}"
from: "{{period_start}}"
to: "{{period_end}}"
- name: get-permit-limits
type: call
call: "sap.get-ehs-permits"
with:
plant: "{{plant_code}}"
- name: archive-report
type: call
call: "sharepoint.create-file"
with:
site_id: "ehs_compliance_site"
file_path: "EmissionsReports/{{plant_code}}/{{period_start}}_{{period_end}}.json"
- name: flag-exceedance
type: call
call: "servicenow.create-task"
with:
short_description: "Emissions review: {{plant_code}} for {{period_start}} to {{period_end}}"
description: "Sensor data collected from Datadog. Permit thresholds from SAP EHS. Report archived at {{archive-report.url}}."
assigned_group: "EHS_Compliance"
category: "emissions_review"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: metrics
path: "/query?query=avg:emissions.*{plant:{{plant_tag}}}&from={{from}}&to={{to}}"
inputParameters:
- name: plant_tag
in: query
- name: from
in: query
- name: to
in: query
operations:
- name: get-emissions-metrics
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/EHS_PERMIT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: permits
path: "/A_EHSPermit?$filter=Plant eq '{{plant}}'"
inputParameters:
- name: plant
in: query
operations:
- name: get-ehs-permits
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Audits expenses at Dow via Concur, compliance checks, and email.
naftiko: "0.5"
info:
label: "Expense Audit Pipeline"
description: "Audits expenses at Dow via Concur, compliance checks, and email."
tags:
- finance
- travel
- sap-concur
- compliance
capability:
exposes:
- type: mcp
namespace: expense-audit
port: 8080
tools:
- name: audit
description: "Audit expenses at Dow."
inputParameters:
- name: report_id
in: body
type: string
description: "Report ID."
steps:
- name: get
type: call
call: "concur.get-report"
with:
id: "{{report_id}}"
- name: check
type: call
call: "compliance.check"
with:
expenses: "{{get.entries}}"
- name: flag
type: call
call: "workflow.flag"
with:
id: "{{report_id}}"
violations: "{{check.violations}}"
- name: notify
type: call
call: "email.send"
with:
to: "{{get.approver}}"
subject: "Expense {{report_id}} violations"
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: reports
path: "/expense/reports/{{id}}"
inputParameters:
- name: id
in: path
operations:
- name: get-report
method: GET
- type: http
namespace: compliance
baseUri: "https://compliance.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.compliance_token"
resources:
- name: policies
path: "/check"
operations:
- name: check
method: POST
- type: http
namespace: workflow
baseUri: "https://workflow.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.workflow_token"
resources:
- name: reviews
path: "/flag"
operations:
- name: flag
method: POST
- type: http
namespace: email
baseUri: "https://email.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
Checks F5 Networks load balancer pool health for operational technology services at a Dow plant, returning pool member status, active connections, and availability.
naftiko: "0.5"
info:
label: "F5 Networks Load Balancer Health for Plant OT"
description: "Checks F5 Networks load balancer pool health for operational technology services at a Dow plant, returning pool member status, active connections, and availability."
tags:
- security
- f5-networks
- manufacturing
capability:
exposes:
- type: mcp
namespace: lb-health
port: 8080
tools:
- name: get-lb-pool-health
description: "Retrieve F5 load balancer pool health status for a plant OT service pool."
inputParameters:
- name: pool_name
in: body
type: string
description: "The F5 pool name for the OT service."
call: "f5.get-pool-status"
with:
pool_name: "{{pool_name}}"
consumes:
- type: http
namespace: f5
baseUri: "https://dow-f5.internal.dow.com/mgmt/tm"
authentication:
type: basic
username: "$secrets.f5_user"
password: "$secrets.f5_password"
resources:
- name: pools
path: "/ltm/pool/~Common~{{pool_name}}/members"
inputParameters:
- name: pool_name
in: path
operations:
- name: get-pool-status
method: GET
Analyzes feedback at Dow via surveys, AI sentiment, and Power BI.
naftiko: "0.5"
info:
label: "Customer Feedback Pipeline"
description: "Analyzes feedback at Dow via surveys, AI sentiment, and Power BI."
tags:
- customer-experience
- analytics
- sentiment-analysis
capability:
exposes:
- type: mcp
namespace: feedback
port: 8080
tools:
- name: analyze
description: "Analyze feedback at Dow."
inputParameters:
- name: survey_id
in: body
type: string
description: "Survey ID."
steps:
- name: collect
type: call
call: "survey.get"
with:
id: "{{survey_id}}"
- name: sentiment
type: call
call: "ai.analyze"
with:
text: "{{collect.responses}}"
- name: themes
type: call
call: "ai.themes"
with:
data: "{{collect.responses}}"
- name: dashboard
type: call
call: "power-bi.refresh"
with:
dataset: "cx"
consumes:
- type: http
namespace: survey
baseUri: "https://surveys.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.survey_token"
resources:
- name: responses
path: "/surveys/{{id}}/responses"
inputParameters:
- name: id
in: path
operations:
- name: get
method: GET
- type: http
namespace: ai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: analyze
method: POST
- type: http
namespace: power-bi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.power_bi_token"
resources:
- name: datasets
path: "/datasets/{{dataset}}/refreshes"
inputParameters:
- name: dataset
in: path
operations:
- name: refresh
method: POST
Checks GitHub repo at Dow.
naftiko: "0.5"
info:
label: "GitHub Repo Check"
description: "Checks GitHub repo at Dow."
tags:
- devops
- github
- version-control
capability:
exposes:
- type: mcp
namespace: gh-repo
port: 8080
tools:
- name: get-branch
description: "Check branch at Dow."
inputParameters:
- name: repo
in: body
type: string
description: "Repo."
- name: branch
in: body
type: string
description: "Branch."
call: "github.get-branch"
with:
repo: "{{repo}}"
branch: "{{branch}}"
outputParameters:
- name: sha
type: string
mapping: "$.commit.sha"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: branches
path: "/repos/org/{{repo}}/branches/{{branch}}"
inputParameters:
- name: repo
in: path
- name: branch
in: path
operations:
- name: get-branch
method: GET
Checks the GitLab CI pipeline status for process control software, validates the SonarQube quality gate, and creates a ServiceNow change request if both pass.
naftiko: "0.5"
info:
label: "GitLab Pipeline with Quality Gate Validation"
description: "Checks the GitLab CI pipeline status for process control software, validates the SonarQube quality gate, and creates a ServiceNow change request if both pass."
tags:
- devops
- gitlab
- sonarqube
- servicenow
- manufacturing
capability:
exposes:
- type: mcp
namespace: ci-pipeline
port: 8080
tools:
- name: validate-pipeline-quality
description: "Check GitLab pipeline and SonarQube quality, then create change request if approved."
inputParameters:
- name: project_id
in: body
type: string
description: "The GitLab project ID."
- name: sonarqube_key
in: body
type: string
description: "The SonarQube project key."
steps:
- name: get-pipeline
type: call
call: "gitlab.get-latest-pipeline"
with:
project_id: "{{project_id}}"
- name: get-quality
type: call
call: "sonarqube.get-quality-gate"
with:
project_key: "{{sonarqube_key}}"
- name: create-cr
type: call
call: "servicenow.create-change-request"
with:
short_description: "Release candidate: project {{project_id}}"
description: "Pipeline: {{get-pipeline.status}}. Quality gate: {{get-quality.status}}. Ready for deployment review."
category: "software_release"
assigned_group: "Plant_IT"
consumes:
- type: http
namespace: gitlab
baseUri: "https://gitlab.dow.com/api/v4"
authentication:
type: bearer
token: "$secrets.gitlab_token"
resources:
- name: pipelines
path: "/projects/{{project_id}}/pipelines/latest"
inputParameters:
- name: project_id
in: path
operations:
- name: get-latest-pipeline
method: GET
- type: http
namespace: sonarqube
baseUri: "https://sonarqube.dow.com/api"
authentication:
type: bearer
token: "$secrets.sonarqube_token"
resources:
- name: quality-gates
path: "/qualitygates/project_status?projectKey={{project_key}}"
inputParameters:
- name: project_key
in: query
operations:
- name: get-quality-gate
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.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-request
method: POST
Checks Grafana dashboard at Dow.
naftiko: "0.5"
info:
label: "Grafana Dashboard Status"
description: "Checks Grafana dashboard at Dow."
tags:
- monitoring
- grafana
- dashboards
capability:
exposes:
- type: mcp
namespace: grafana
port: 8080
tools:
- name: check-dash
description: "Check dashboard at Dow."
inputParameters:
- name: uid
in: body
type: string
description: "Dashboard UID."
call: "grafana.get-dash"
with:
uid: "{{uid}}"
outputParameters:
- name: title
type: string
mapping: "$.dashboard.title"
consumes:
- type: http
namespace: grafana
baseUri: "https://grafana.dow.com/api"
authentication:
type: bearer
token: "$secrets.grafana_token"
resources:
- name: dashboards
path: "/dashboards/uid/{{uid}}"
inputParameters:
- name: uid
in: path
operations:
- name: get-dash
method: GET
Checks Terraform state drift for Dow Oracle Cloud infrastructure, validates resource costs, and creates a ServiceNow change request for remediation if drift is detected.
naftiko: "0.5"
info:
label: "Infrastructure Drift Detection and Remediation"
description: "Checks Terraform state drift for Dow Oracle Cloud infrastructure, validates resource costs, and creates a ServiceNow change request for remediation if drift is detected."
tags:
- devops
- terraform
- oracle-cloud
- servicenow
capability:
exposes:
- type: mcp
namespace: infra-drift
port: 8080
tools:
- name: detect-and-remediate-drift
description: "Check Terraform drift, assess cost impact, and create remediation change request."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Terraform Cloud workspace ID."
- name: compartment_id
in: body
type: string
description: "Oracle Cloud compartment OCID for cost check."
steps:
- name: check-drift
type: call
call: "terraform.get-workspace-state"
with:
workspace_id: "{{workspace_id}}"
- name: get-costs
type: call
call: "oracle-cloud.get-cost-summary"
with:
compartment_id: "{{compartment_id}}"
- name: create-remediation
type: call
call: "servicenow.create-change-request"
with:
short_description: "Infra drift detected: workspace {{workspace_id}}"
description: "Terraform state: {{check-drift.resource_count}} resources. Drift detected. Current monthly cost: {{get-costs.total_cost}}. Remediation required."
category: "infrastructure"
assigned_group: "Cloud_Ops"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: workspaces
path: "/workspaces/{{workspace_id}}/current-state-version"
inputParameters:
- name: workspace_id
in: path
operations:
- name: get-workspace-state
method: GET
- type: http
namespace: oracle-cloud
baseUri: "https://usageapi.us-ashburn-1.oci.oraclecloud.com/20200107"
authentication:
type: bearer
token: "$secrets.oracle_cloud_token"
resources:
- name: usage
path: "/usage?compartmentId={{compartment_id}}"
inputParameters:
- name: compartment_id
in: query
operations:
- name: get-cost-summary
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.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-request
method: POST
Queries Oracle EBS for raw material inventory, compares against SAP reorder points, and creates a ServiceNow procurement alert if stock is below threshold.
naftiko: "0.5"
info:
label: "Inventory Check with Reorder Alert"
description: "Queries Oracle EBS for raw material inventory, compares against SAP reorder points, and creates a ServiceNow procurement alert if stock is below threshold."
tags:
- supply-chain
- oracle-ebs
- sap
- servicenow
- inventory
capability:
exposes:
- type: mcp
namespace: inventory
port: 8080
tools:
- name: check-inventory-threshold
description: "Check inventory levels against reorder thresholds and alert procurement if low."
inputParameters:
- name: item_number
in: body
type: string
description: "The Oracle item number for the raw material."
- name: site_code
in: body
type: string
description: "The Dow plant site code."
steps:
- name: get-inventory
type: call
call: "oracle-ebs.get-inventory"
with:
item_number: "{{item_number}}"
site_code: "{{site_code}}"
- name: get-reorder-point
type: call
call: "sap.get-material-mrp"
with:
material: "{{item_number}}"
plant: "{{site_code}}"
- name: alert-procurement
type: call
call: "servicenow.create-task"
with:
short_description: "Low inventory alert: {{item_number}} at {{site_code}}"
description: "On-hand: {{get-inventory.on_hand_qty}} {{get-inventory.uom}}. Reorder point: {{get-reorder-point.reorder_point}}. Safety stock: {{get-reorder-point.safety_stock}}."
assigned_group: "Procurement_Team"
category: "inventory_alert"
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://dow-ebs.oracle.com/webservices/rest/inventory/v1"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: on-hand
path: "/onhand?item={{item_number}}&org={{site_code}}"
inputParameters:
- name: item_number
in: query
- name: site_code
in: query
operations:
- name: get-inventory
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: material-mrp
path: "/A_MaterialMRP('{{material}}','{{plant}}')"
inputParameters:
- name: material
in: path
- name: plant
in: path
operations:
- name: get-material-mrp
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Escalates IT incidents at Dow via ServiceNow, PagerDuty, and Slack.
naftiko: "0.5"
info:
label: "IT Incident Escalation Pipeline"
description: "Escalates IT incidents at Dow via ServiceNow, PagerDuty, and Slack."
tags:
- incident-management
- servicenow
- pagerduty
- slack
capability:
exposes:
- type: mcp
namespace: incident-escalation
port: 8080
tools:
- name: escalate-incident
description: "Escalate incidents at Dow."
inputParameters:
- name: incident_id
in: body
type: string
description: "Incident ID."
- name: severity
in: body
type: string
description: "Severity."
steps:
- name: get-incident
type: call
call: "servicenow.get-incident"
with:
incident_id: "{{incident_id}}"
- name: page
type: call
call: "pagerduty.create-incident"
with:
title: "{{get-incident.description}}"
urgency: "{{severity}}"
- name: channel
type: call
call: "slack.create-channel"
with:
name: "inc-{{incident_id}}"
- name: notify
type: call
call: "slack.post-message"
with:
channel: "#inc-{{incident_id}}"
text: "P{{severity}}: {{get-incident.description}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://dow.com.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident/{{incident_id}}"
inputParameters:
- name: incident_id
in: path
operations:
- name: get-incident
method: GET
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: channels
path: "/conversations.create"
operations:
- name: create-channel
method: POST
Retrieves sprint progress at Dow.
naftiko: "0.5"
info:
label: "Jira Sprint Progress Lookup"
description: "Retrieves sprint progress at Dow."
tags:
- project-management
- jira
- agile
capability:
exposes:
- type: mcp
namespace: jira-sprint
port: 8080
tools:
- name: get-sprint
description: "Look up sprint at Dow."
inputParameters:
- name: project_key
in: body
type: string
description: "Project key."
call: "jira.get-sprints"
with:
project: "{{project_key}}"
outputParameters:
- name: name
type: string
mapping: "$.values[0].name"
- name: state
type: string
mapping: "$.values[0].state"
consumes:
- type: http
namespace: jira
baseUri: "https://dow.com.atlassian.net/rest/agile/1.0"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: sprints
path: "/board/1/sprint"
operations:
- name: get-sprints
method: GET
Maintains KB at Dow by finding stale articles and notifying owners.
naftiko: "0.5"
info:
label: "Knowledge Base Maintenance Pipeline"
description: "Maintains KB at Dow by finding stale articles and notifying owners."
tags:
- knowledge-management
- confluence
- maintenance
capability:
exposes:
- type: mcp
namespace: kb-maint
port: 8080
tools:
- name: maintain-kb
description: "Maintain KB at Dow."
inputParameters:
- name: space
in: body
type: string
description: "Confluence space."
- name: stale_days
in: body
type: number
description: "Days threshold."
steps:
- name: find
type: call
call: "confluence.search-stale"
with:
space: "{{space}}"
days: "{{stale_days}}"
- name: notify
type: call
call: "email.batch"
with:
to: "{{find.owners}}"
subject: "KB review needed"
- name: flag
type: call
call: "confluence.add-label"
with:
pages: "{{find.ids}}"
label: "needs-review"
- name: report
type: call
call: "slack.post-message"
with:
channel: "#kb"
text: "KB: {{find.count}} stale articles"
consumes:
- type: http
namespace: confluence
baseUri: "https://dow.com.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: content
path: "/content/search"
operations:
- name: search-stale
method: GET
- type: http
namespace: email
baseUri: "https://email.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: batch
path: "/send-batch"
operations:
- name: batch
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Generates KPI digest at Dow from Snowflake, Oracle, Power BI, and email.
naftiko: "0.5"
info:
label: "Weekly KPI Digest Pipeline"
description: "Generates KPI digest at Dow from Snowflake, Oracle, Power BI, and email."
tags:
- reporting
- kpi
- snowflake
- executive
capability:
exposes:
- type: mcp
namespace: kpi-digest
port: 8080
tools:
- name: gen-digest
description: "Generate KPI digest at Dow."
inputParameters:
- name: week
in: body
type: string
description: "Week ending."
- name: dist
in: body
type: string
description: "Distribution list."
steps:
- name: ops
type: call
call: "snowflake.query"
with:
query: "SELECT * FROM kpis WHERE w='{{week}}'"
- name: fin
type: call
call: "oracle.get-summary"
with:
period: "{{week}}"
- name: refresh
type: call
call: "power-bi.refresh"
with:
dataset: "exec_kpis"
- name: send
type: call
call: "email.send"
with:
to: "{{dist}}"
subject: "KPIs - {{week}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://dow.com.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query
method: POST
- type: http
namespace: oracle
baseUri: "https://oracle.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: fin
path: "/summary"
operations:
- name: get-summary
method: GET
- type: http
namespace: power-bi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.power_bi_token"
resources:
- name: datasets
path: "/datasets/{{dataset}}/refreshes"
inputParameters:
- name: dataset
in: path
operations:
- name: refresh
method: POST
- type: http
namespace: email
baseUri: "https://email.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
Checks K8s pod health at Dow.
naftiko: "0.5"
info:
label: "K8s Pod Health"
description: "Checks K8s pod health at Dow."
tags:
- containers
- kubernetes
- infrastructure
capability:
exposes:
- type: mcp
namespace: k8s-pod
port: 8080
tools:
- name: check-pod
description: "Check pod at Dow."
inputParameters:
- name: namespace
in: body
type: string
description: "Namespace."
- name: pod
in: body
type: string
description: "Pod name."
call: "k8s.get-pod"
with:
namespace: "{{namespace}}"
pod: "{{pod}}"
outputParameters:
- name: phase
type: string
mapping: "$.status.phase"
consumes:
- type: http
namespace: k8s
baseUri: "https://k8s.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.k8s_token"
resources:
- name: pods
path: "/namespaces/{{namespace}}/pods/{{pod}}"
inputParameters:
- name: namespace
in: path
- name: pod
in: path
operations:
- name: get-pod
method: GET
Queries PostgreSQL for lab test results, compares against SAP batch specifications, and creates a ServiceNow quality task if any out-of-spec results are detected.
naftiko: "0.5"
info:
label: "Lab Results with Spec Validation Pipeline"
description: "Queries PostgreSQL for lab test results, compares against SAP batch specifications, and creates a ServiceNow quality task if any out-of-spec results are detected."
tags:
- rnd
- postgresql
- sap
- servicenow
- quality
capability:
exposes:
- type: mcp
namespace: lab-results
port: 8080
tools:
- name: validate-batch-results
description: "Retrieve lab results, compare to SAP specs, and flag out-of-spec batches."
inputParameters:
- name: batch_number
in: body
type: string
description: "The production batch number."
steps:
- name: get-results
type: call
call: "postgresql.get-batch-results"
with:
batch_number: "{{batch_number}}"
- name: get-spec
type: call
call: "sap.get-batch-spec"
with:
batch_number: "{{batch_number}}"
- name: flag-oos
type: call
call: "servicenow.create-task"
with:
short_description: "Batch {{batch_number}} lab results review"
description: "Tests completed: {{get-results.test_count}}. Spec: {{get-spec.spec_id}}. Results require quality review against specification limits."
assigned_group: "Quality_Lab"
category: "lab_review"
consumes:
- type: http
namespace: postgresql
baseUri: "https://dow-lab-api.internal.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.lab_db_token"
resources:
- name: results
path: "/results?batch={{batch_number}}"
inputParameters:
- name: batch_number
in: query
operations:
- name: get-batch-results
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/QM_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batch-specs
path: "/A_BatchSpec('{{batch_number}}')"
inputParameters:
- name: batch_number
in: path
operations:
- name: get-batch-spec
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Checks license compliance at Dow via scanning, entitlements, and procurement.
naftiko: "0.5"
info:
label: "License Compliance Pipeline"
description: "Checks license compliance at Dow via scanning, entitlements, and procurement."
tags:
- compliance
- licensing
- procurement
capability:
exposes:
- type: mcp
namespace: license-comp
port: 8080
tools:
- name: check-licenses
description: "Check license compliance at Dow."
inputParameters:
- name: software
in: body
type: string
description: "Software."
- name: vendor
in: body
type: string
description: "Vendor."
steps:
- name: scan
type: call
call: "assets.installations"
with:
sw: "{{software}}"
- name: entitlements
type: call
call: "licenses.get"
with:
sw: "{{software}}"
- name: flag
type: call
call: "compliance.flag"
with:
installed: "{{scan.count}}"
entitled: "{{entitlements.count}}"
- name: procure
type: call
call: "servicenow.create-request"
with:
type: "license"
sw: "{{software}}"
consumes:
- type: http
namespace: assets
baseUri: "https://assets.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.asset_token"
resources:
- name: installations
path: "/installations"
operations:
- name: installations
method: GET
- type: http
namespace: licenses
baseUri: "https://licenses.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.license_token"
resources:
- name: ent
path: "/entitlements"
operations:
- name: get
method: GET
- type: http
namespace: compliance
baseUri: "https://compliance.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.compliance_token"
resources:
- name: overages
path: "/flag"
operations:
- name: flag
method: POST
- type: http
namespace: servicenow
baseUri: "https://dow.com.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
Orchestrates a Management of Change process for plant modifications: creates a ServiceNow change request, retrieves affected equipment from SAP PM, checks environmental permits in SAP EHS, and notifies stakeholders via HubSpot.
naftiko: "0.5"
info:
label: "Management of Change Pipeline"
description: "Orchestrates a Management of Change process for plant modifications: creates a ServiceNow change request, retrieves affected equipment from SAP PM, checks environmental permits in SAP EHS, and notifies stakeholders via HubSpot."
tags:
- safety
- compliance
- servicenow
- sap
- hubspot
- manufacturing
capability:
exposes:
- type: mcp
namespace: moc-process
port: 8080
tools:
- name: initiate-moc
description: "Given change details and plant info, orchestrate the Management of Change approval workflow."
inputParameters:
- name: change_title
in: body
type: string
description: "Title of the proposed change."
- name: change_description
in: body
type: string
description: "Detailed description of the plant modification."
- name: plant_code
in: body
type: string
description: "The Dow plant site code."
- name: equipment_ids
in: body
type: string
description: "Comma-separated SAP equipment IDs affected."
- name: requestor_email
in: body
type: string
description: "Email of the change requestor."
steps:
- name: create-change-request
type: call
call: "servicenow.create-change-request"
with:
short_description: "MOC: {{change_title}}"
description: "{{change_description}}. Plant: {{plant_code}}. Equipment: {{equipment_ids}}."
category: "management_of_change"
risk: "high"
assigned_group: "MOC_Review_Board"
- name: get-equipment-details
type: call
call: "sap.get-equipment-list"
with:
equipment_ids: "{{equipment_ids}}"
plant: "{{plant_code}}"
- name: check-permits
type: call
call: "sap.get-ehs-permits"
with:
plant: "{{plant_code}}"
- name: notify-requestor
type: call
call: "hubspot.send-email"
with:
to_email: "{{requestor_email}}"
subject: "MOC Initiated: {{change_title}}"
body: "Your Management of Change request has been submitted. Change request: {{create-change-request.number}}. Affected equipment: {{get-equipment-details.count}} items. Active permits on file: {{check-permits.permit_count}}. The MOC Review Board will assess the request."
consumes:
- type: http
namespace: servicenow
baseUri: "https://dow.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-request
method: POST
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: equipment-list
path: "/A_Equipment?$filter=Plant eq '{{plant}}' and EquipmentId in ({{equipment_ids}})"
inputParameters:
- name: plant
in: query
- name: equipment_ids
in: query
operations:
- name: get-equipment-list
method: GET
- name: permits
path: "/A_EHSPermit?$filter=Plant eq '{{plant}}'"
inputParameters:
- name: plant
in: query
operations:
- name: get-ehs-permits
method: GET
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Checks Dynatrace process health for MES, correlates with Datadog infrastructure metrics, and creates a ServiceNow incident if degradation is detected.
naftiko: "0.5"
info:
label: "MES Health Check with Escalation"
description: "Checks Dynatrace process health for MES, correlates with Datadog infrastructure metrics, and creates a ServiceNow incident if degradation is detected."
tags:
- monitoring
- dynatrace
- datadog
- servicenow
- manufacturing
capability:
exposes:
- type: mcp
namespace: mes-health
port: 8080
tools:
- name: check-mes-health
description: "Check MES health across Dynatrace and Datadog, and escalate if degraded."
inputParameters:
- name: entity_id
in: body
type: string
description: "The Dynatrace process group entity ID."
- name: host_tag
in: body
type: string
description: "The Datadog host tag for the MES server."
steps:
- name: get-dynatrace-health
type: call
call: "dynatrace.get-process-health"
with:
entity_id: "{{entity_id}}"
- name: get-infra-metrics
type: call
call: "datadog.get-host-metrics"
with:
host_tag: "{{host_tag}}"
- name: escalate
type: call
call: "servicenow.create-incident"
with:
short_description: "MES health check: {{entity_id}}"
description: "Dynatrace status: {{get-dynatrace-health.status}}. CPU: {{get-infra-metrics.cpu_pct}}%. Memory: {{get-infra-metrics.mem_pct}}%."
severity: "3"
assigned_group: "MES_Support"
consumes:
- type: http
namespace: dynatrace
baseUri: "https://dow.live.dynatrace.com/api/v2"
authentication:
type: bearer
token: "$secrets.dynatrace_token"
resources:
- name: process-groups
path: "/entities/{{entity_id}}"
inputParameters:
- name: entity_id
in: path
operations:
- name: get-process-health
method: GET
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: host-metrics
path: "/hosts?filter=tag:{{host_tag}}"
inputParameters:
- name: host_tag
in: query
operations:
- name: get-host-metrics
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.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
Generates monthly security reports at Dow from Splunk and Qualys.
naftiko: "0.5"
info:
label: "Monthly Security Report Pipeline"
description: "Generates monthly security reports at Dow from Splunk and Qualys."
tags:
- security
- reporting
- splunk
- compliance
capability:
exposes:
- type: mcp
namespace: sec-report
port: 8080
tools:
- name: gen-sec-report
description: "Generate security report at Dow."
inputParameters:
- name: month
in: body
type: string
description: "Month."
steps:
- name: splunk
type: call
call: "splunk.search"
with:
query: "index=security earliest=-30d"
- name: scans
type: call
call: "qualys.results"
with:
month: "{{month}}"
- name: compile
type: call
call: "analytics.compile-security"
with:
events: "{{splunk.count}}"
vulns: "{{scans.critical}}"
- name: send
type: call
call: "email.send"
with:
to: "ciso@co.com"
subject: "Security - {{month}}"
consumes:
- type: http
namespace: splunk
baseUri: "https://splunk.dow.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search
path: "/search/jobs"
operations:
- name: search
method: POST
- type: http
namespace: qualys
baseUri: "https://qualysapi.qualys.com/api/v2"
authentication:
type: bearer
token: "$secrets.qualys_token"
resources:
- name: results
path: "/fo/scan/results"
operations:
- name: results
method: GET
- type: http
namespace: analytics
baseUri: "https://analytics.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.analytics_token"
resources:
- name: security
path: "/compile"
operations:
- name: compile-security
method: POST
- type: http
namespace: email
baseUri: "https://email.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
Onboards employees at Dow with Okta, ServiceNow, Slack, and calendar.
naftiko: "0.5"
info:
label: "New Employee IT Onboarding Pipeline"
description: "Onboards employees at Dow with Okta, ServiceNow, Slack, and calendar."
tags:
- hr
- onboarding
- okta
- servicenow
- slack
capability:
exposes:
- type: mcp
namespace: it-onboarding
port: 8080
tools:
- name: onboard-employee
description: "Onboard employees at Dow."
inputParameters:
- name: name
in: body
type: string
description: "Name."
- name: dept
in: body
type: string
description: "Department."
- name: start
in: body
type: string
description: "Start date."
steps:
- name: okta
type: call
call: "okta.create-user"
with:
name: "{{name}}"
department: "{{dept}}"
- name: equip
type: call
call: "servicenow.create-request"
with:
type: "new_hire"
for: "{{name}}"
- name: slack
type: call
call: "slack.invite"
with:
email: "{{okta.email}}"
- name: orient
type: call
call: "calendar.create-event"
with:
title: "Orientation - {{name}}"
date: "{{start}}"
consumes:
- type: http
namespace: okta
baseUri: "https://dow.com.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: servicenow
baseUri: "https://dow.com.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: users
path: "/users.admin.invite"
operations:
- name: invite
method: POST
- type: http
namespace: calendar
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.microsoft_graph_token"
resources:
- name: events
path: "/users/hr/events"
operations:
- name: create-event
method: POST
Checks New Relic APM at Dow.
naftiko: "0.5"
info:
label: "New Relic APM Check"
description: "Checks New Relic APM at Dow."
tags:
- monitoring
- new-relic
- apm
capability:
exposes:
- type: mcp
namespace: nr-apm
port: 8080
tools:
- name: check-apm
description: "Check APM at Dow."
inputParameters:
- name: app_id
in: body
type: string
description: "App ID."
call: "newrelic.get-app"
with:
app_id: "{{app_id}}"
outputParameters:
- name: health
type: string
mapping: "$.application.health_status"
consumes:
- type: http
namespace: newrelic
baseUri: "https://api.newrelic.com/v2"
authentication:
type: bearer
token: "$secrets.new_relic_api_key"
resources:
- name: applications
path: "/applications/{{app_id}}.json"
inputParameters:
- name: app_id
in: path
operations:
- name: get-app
method: GET
Checks Okta user at Dow.
naftiko: "0.5"
info:
label: "Okta User Check"
description: "Checks Okta user at Dow."
tags:
- identity
- okta
- access-management
capability:
exposes:
- type: mcp
namespace: okta-user
port: 8080
tools:
- name: check-user
description: "Check user at Dow."
inputParameters:
- name: email
in: body
type: string
description: "Email."
call: "okta.get-user"
with:
email: "{{email}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: okta
baseUri: "https://dow.com.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users/{{email}}"
inputParameters:
- name: email
in: path
operations:
- name: get-user
method: GET
Before assigning a plant operator to a chemical process shift, validates Workday certifications, checks Pluralsight training completion, and creates the shift assignment in SAP with a ServiceNow notification.
naftiko: "0.5"
info:
label: "Operator Certification and Shift Assignment Pipeline"
description: "Before assigning a plant operator to a chemical process shift, validates Workday certifications, checks Pluralsight training completion, and creates the shift assignment in SAP with a ServiceNow notification."
tags:
- manufacturing
- safety
- workday
- pluralsight
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: shift-assignment
port: 8080
tools:
- name: assign-operator-shift
description: "Given an operator ID and shift details, validate certifications and training before creating the shift assignment."
inputParameters:
- name: operator_id
in: body
type: string
description: "Workday employee ID of the operator."
- name: shift_date
in: body
type: string
description: "Shift date in YYYY-MM-DD format."
- name: process_area
in: body
type: string
description: "The chemical process area for the shift."
- name: plant_code
in: body
type: string
description: "The Dow plant site code."
steps:
- name: get-operator
type: call
call: "workday.get-worker"
with:
worker_id: "{{operator_id}}"
- name: check-certs
type: call
call: "workday.get-certifications"
with:
employee_id: "{{operator_id}}"
- name: check-training
type: call
call: "pluralsight.get-completions"
with:
employee_email: "{{get-operator.work_email}}"
- name: create-shift
type: call
call: "sap.create-shift-assignment"
with:
operator_id: "{{operator_id}}"
plant: "{{plant_code}}"
process_area: "{{process_area}}"
shift_date: "{{shift_date}}"
- name: notify-supervisor
type: call
call: "servicenow.create-task"
with:
short_description: "Shift assigned: {{get-operator.full_name}} — {{process_area}} on {{shift_date}}"
description: "Operator {{get-operator.full_name}} assigned to {{process_area}} at {{plant_code}}. Certifications: {{check-certs.active_count}}. Training modules completed: {{check-training.completed_count}}."
assigned_group: "Plant_Supervisors_{{plant_code}}"
category: "shift_management"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- name: certifications
path: "/workers/{{employee_id}}/certifications"
inputParameters:
- name: employee_id
in: path
operations:
- name: get-certifications
method: GET
- type: http
namespace: pluralsight
baseUri: "https://api.pluralsight.com/api/v1"
authentication:
type: bearer
token: "$secrets.pluralsight_token"
resources:
- name: completions
path: "/users/{{employee_email}}/course-completions"
inputParameters:
- name: employee_email
in: path
operations:
- name: get-completions
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PP_SHIFT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: shifts
path: "/A_ShiftAssignment"
operations:
- name: create-shift-assignment
method: POST
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Retrieves Oracle Cloud resource utilization and cost data for Dow manufacturing IT workloads, used to identify underutilized resources and cost savings opportunities.
naftiko: "0.5"
info:
label: "Oracle Cloud Cost Optimization Report"
description: "Retrieves Oracle Cloud resource utilization and cost data for Dow manufacturing IT workloads, used to identify underutilized resources and cost savings opportunities."
tags:
- cost-management
- oracle-cloud
- infrastructure
capability:
exposes:
- type: mcp
namespace: cloud-cost
port: 8080
tools:
- name: get-cloud-costs
description: "Retrieve Oracle Cloud cost and utilization summary for a compartment."
inputParameters:
- name: compartment_id
in: body
type: string
description: "The Oracle Cloud compartment OCID."
- name: period
in: body
type: string
description: "Cost reporting period in YYYY-MM format."
call: "oracle-cloud.get-cost-summary"
with:
compartment_id: "{{compartment_id}}"
period: "{{period}}"
consumes:
- type: http
namespace: oracle-cloud
baseUri: "https://usageapi.us-ashburn-1.oci.oraclecloud.com/20200107"
authentication:
type: bearer
token: "$secrets.oracle_cloud_token"
resources:
- name: usage
path: "/usage?compartmentId={{compartment_id}}&granularity=MONTHLY&timeUsageStarted={{period}}-01"
inputParameters:
- name: compartment_id
in: query
- name: period
in: query
operations:
- name: get-cost-summary
method: GET
Checks on-call at Dow.
naftiko: "0.5"
info:
label: "PagerDuty On-Call Check"
description: "Checks on-call at Dow."
tags:
- incident-management
- pagerduty
- on-call
capability:
exposes:
- type: mcp
namespace: pd-oncall
port: 8080
tools:
- name: get-oncall
description: "Check on-call at Dow."
inputParameters:
- name: schedule_id
in: body
type: string
description: "Schedule ID."
call: "pagerduty.get-oncall"
with:
schedule_id: "{{schedule_id}}"
outputParameters:
- name: user
type: string
mapping: "$.oncalls[0].user.summary"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: oncalls
path: "/oncalls"
operations:
- name: get-oncall
method: GET
Retrieves firewall rules from Palo Alto Networks for a specified plant network zone, used for OT security audits of chemical manufacturing control system networks.
naftiko: "0.5"
info:
label: "Palo Alto Networks Firewall Rule Audit"
description: "Retrieves firewall rules from Palo Alto Networks for a specified plant network zone, used for OT security audits of chemical manufacturing control system networks."
tags:
- security
- palo-alto-networks
- manufacturing
capability:
exposes:
- type: mcp
namespace: firewall-audit
port: 8080
tools:
- name: get-firewall-rules
description: "Retrieve Palo Alto Networks firewall rules for a plant OT network zone."
inputParameters:
- name: zone_name
in: body
type: string
description: "The network security zone name for the plant."
call: "palo-alto.get-rules"
with:
zone_name: "{{zone_name}}"
consumes:
- type: http
namespace: palo-alto
baseUri: "https://dow-pan.internal.dow.com/restapi/v10.1"
authentication:
type: bearer
token: "$secrets.palo_alto_token"
resources:
- name: security-rules
path: "/Policies/SecurityRules?location=vsys&vsys=vsys1&name={{zone_name}}"
inputParameters:
- name: zone_name
in: query
operations:
- name: get-rules
method: GET
Retrieves employee benefits enrollment status from PeopleSoft HR, including health plan, retirement contributions, and life insurance details for benefits administration.
naftiko: "0.5"
info:
label: "PeopleSoft Benefits Enrollment Query"
description: "Retrieves employee benefits enrollment status from PeopleSoft HR, including health plan, retirement contributions, and life insurance details for benefits administration."
tags:
- hr
- peoplesoft
- benefits
capability:
exposes:
- type: mcp
namespace: benefits
port: 8080
tools:
- name: get-benefits-enrollment
description: "Retrieve PeopleSoft benefits enrollment for an employee by ID."
inputParameters:
- name: emplid
in: body
type: string
description: "The PeopleSoft employee ID."
call: "peoplesoft.get-benefits"
with:
emplid: "{{emplid}}"
consumes:
- type: http
namespace: peoplesoft
baseUri: "https://dow-ps.internal.dow.com/PSIGW/RESTListeningConnector/PSFT_HR"
authentication:
type: basic
username: "$secrets.peoplesoft_user"
password: "$secrets.peoplesoft_password"
resources:
- name: benefits
path: "/benefits/enrollment/{{emplid}}"
inputParameters:
- name: emplid
in: path
operations:
- name: get-benefits
method: GET
Queries Pluralsight for an employee's completed safety and chemical handling training courses, validating compliance with Dow mandatory training requirements.
naftiko: "0.5"
info:
label: "Pluralsight Training Compliance Check"
description: "Queries Pluralsight for an employee's completed safety and chemical handling training courses, validating compliance with Dow mandatory training requirements."
tags:
- hr
- pluralsight
- safety
- training
capability:
exposes:
- type: mcp
namespace: training-compliance
port: 8080
tools:
- name: check-training-status
description: "Retrieve Pluralsight course completions for an employee email."
inputParameters:
- name: employee_email
in: body
type: string
description: "The employee's email address registered in Pluralsight."
call: "pluralsight.get-completions"
with:
employee_email: "{{employee_email}}"
consumes:
- type: http
namespace: pluralsight
baseUri: "https://api.pluralsight.com/api/v1"
authentication:
type: bearer
token: "$secrets.pluralsight_token"
resources:
- name: completions
path: "/users/{{employee_email}}/course-completions"
inputParameters:
- name: employee_email
in: path
operations:
- name: get-completions
method: GET
Creates postmortems at Dow.
naftiko: "0.5"
info:
label: "Incident Postmortem Pipeline"
description: "Creates postmortems at Dow."
tags:
- incident-management
- postmortem
- pagerduty
- confluence
capability:
exposes:
- type: mcp
namespace: postmortem
port: 8080
tools:
- name: create-postmortem
description: "Create postmortem at Dow."
inputParameters:
- name: incident_id
in: body
type: string
description: "Incident ID."
steps:
- name: timeline
type: call
call: "pagerduty.get-log"
with:
id: "{{incident_id}}"
- name: metrics
type: call
call: "datadog.get-metrics"
with:
incident: "{{incident_id}}"
- name: doc
type: call
call: "confluence.create-page"
with:
title: "Postmortem: {{timeline.title}}"
body: "Impact: {{metrics.impact}}"
- name: review
type: call
call: "calendar.create-event"
with:
title: "Review: {{timeline.title}}"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents/{{id}}/log_entries"
inputParameters:
- name: id
in: path
operations:
- name: get-log
method: GET
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: incidents
path: "/incidents"
operations:
- name: get-metrics
method: GET
- type: http
namespace: confluence
baseUri: "https://dow.com.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
- type: http
namespace: calendar
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.microsoft_graph_token"
resources:
- name: events
path: "/users/sre/events"
operations:
- name: create-event
method: POST
Checks Power BI refresh at Dow.
naftiko: "0.5"
info:
label: "Power BI Refresh Check"
description: "Checks Power BI refresh at Dow."
tags:
- analytics
- power-bi
- dashboards
capability:
exposes:
- type: mcp
namespace: pbi-refresh
port: 8080
tools:
- name: check-refresh
description: "Check refresh at Dow."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Dataset ID."
call: "power-bi.get-refresh"
with:
dataset_id: "{{dataset_id}}"
outputParameters:
- name: status
type: string
mapping: "$.value[0].status"
consumes:
- type: http
namespace: power-bi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.power_bi_token"
resources:
- name: datasets
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: get-refresh
method: GET
When a TensorFlow model detects impending equipment failure via Kubeflow, retrieves asset details from SAP PM, schedules a maintenance window in ServiceNow, and notifies the plant engineer via HubSpot.
naftiko: "0.5"
info:
label: "Predictive Maintenance Alert Pipeline"
description: "When a TensorFlow model detects impending equipment failure via Kubeflow, retrieves asset details from SAP PM, schedules a maintenance window in ServiceNow, and notifies the plant engineer via HubSpot."
tags:
- maintenance
- manufacturing
- kubeflow
- tensorflow
- sap
- servicenow
- hubspot
capability:
exposes:
- type: mcp
namespace: predictive-maintenance
port: 8080
tools:
- name: handle-prediction-alert
description: "Given a model prediction and equipment ID, create a proactive maintenance workflow."
inputParameters:
- name: equipment_id
in: body
type: string
description: "SAP equipment ID flagged by the prediction model."
- name: prediction_score
in: body
type: number
description: "Failure probability score from the model (0-1)."
- name: model_name
in: body
type: string
description: "Name of the TensorFlow model that triggered the alert."
steps:
- name: get-model-details
type: call
call: "kubeflow.get-model-metrics"
with:
model_name: "{{model_name}}"
- name: get-equipment
type: call
call: "sap.get-equipment"
with:
equipment_id: "{{equipment_id}}"
- name: schedule-maintenance
type: call
call: "servicenow.create-work-order"
with:
short_description: "Predictive maintenance: {{get-equipment.description}}"
description: "Model {{model_name}} predicted failure probability {{prediction_score}}. Equipment: {{get-equipment.description}} at plant {{get-equipment.plant}}. Model accuracy: {{get-model-details.accuracy}}."
priority: "2"
assigned_group: "Plant_Maintenance_{{get-equipment.plant}}"
- name: notify-engineer
type: call
call: "hubspot.send-email"
with:
to_email: "{{get-equipment.responsible_engineer_email}}"
subject: "Predictive Maintenance Alert: {{get-equipment.description}}"
body: "Failure probability: {{prediction_score}}. Work order: {{schedule-maintenance.number}}. Please review and confirm maintenance window."
consumes:
- type: http
namespace: kubeflow
baseUri: "https://kubeflow.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.kubeflow_token"
resources:
- name: model-metrics
path: "/models/{{model_name}}/metrics"
inputParameters:
- name: model_name
in: path
operations:
- name: get-model-metrics
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: equipment
path: "/A_Equipment('{{equipment_id}}')"
inputParameters:
- name: equipment_id
in: path
operations:
- name: get-equipment
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Retrieves equipment maintenance schedules from SAP Plant Maintenance, checks Workday for technician availability, creates a ServiceNow work order, and updates the Microsoft Planner task board.
naftiko: "0.5"
info:
label: "Preventive Maintenance Scheduler"
description: "Retrieves equipment maintenance schedules from SAP Plant Maintenance, checks Workday for technician availability, creates a ServiceNow work order, and updates the Microsoft Planner task board."
tags:
- maintenance
- sap
- workday
- servicenow
- microsoft-planner
capability:
exposes:
- type: mcp
namespace: maintenance-scheduling
port: 8080
tools:
- name: schedule-maintenance
description: "Given equipment ID and maintenance type, find available technician, create work order, and update planner."
inputParameters:
- name: equipment_id
in: body
type: string
description: "SAP equipment ID for the asset requiring maintenance."
- name: maintenance_type
in: body
type: string
description: "Type of maintenance (preventive, corrective, inspection)."
- name: target_date
in: body
type: string
description: "Target completion date in YYYY-MM-DD format."
steps:
- name: get-equipment
type: call
call: "sap.get-equipment"
with:
equipment_id: "{{equipment_id}}"
- name: find-technician
type: call
call: "workday.search-available-worker"
with:
skill_tag: "{{get-equipment.equipment_category}}"
plant: "{{get-equipment.plant}}"
date: "{{target_date}}"
- name: create-work-order
type: call
call: "servicenow.create-work-order"
with:
short_description: "{{maintenance_type}} maintenance: {{get-equipment.description}}"
equipment_id: "{{equipment_id}}"
assigned_to: "{{find-technician.worker_id}}"
scheduled_date: "{{target_date}}"
- name: update-planner
type: call
call: "planner.create-task"
with:
plan_id: "plant_maintenance_plan"
title: "{{maintenance_type}}: {{get-equipment.description}} — {{target_date}}"
assigned_to: "{{find-technician.work_email}}"
due_date: "{{target_date}}"
consumes:
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: equipment
path: "/A_Equipment('{{equipment_id}}')"
inputParameters:
- name: equipment_id
in: path
operations:
- name: get-equipment
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers?skill={{skill_tag}}&location={{plant}}&available={{date}}"
inputParameters:
- name: skill_tag
in: query
- name: plant
in: query
- name: date
in: query
operations:
- name: search-available-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: planner
baseUri: "https://graph.microsoft.com/v1.0/planner"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: tasks
path: "/tasks"
operations:
- name: create-task
method: POST
Validates a GitLab pipeline passed, checks SonarQube quality gate, gets Azure DevOps release approval, and creates a ServiceNow change request for plant DCS software deployment.
naftiko: "0.5"
info:
label: "Process Control Software Deployment Pipeline"
description: "Validates a GitLab pipeline passed, checks SonarQube quality gate, gets Azure DevOps release approval, and creates a ServiceNow change request for plant DCS software deployment."
tags:
- devops
- gitlab
- sonarqube
- azure-devops
- servicenow
- manufacturing
capability:
exposes:
- type: mcp
namespace: dcs-deployment
port: 8080
tools:
- name: deploy-dcs-software
description: "Given a GitLab project and release, validate quality gates and create a change request for deployment to plant control systems."
inputParameters:
- name: gitlab_project_id
in: body
type: string
description: "GitLab project ID for the process control software."
- name: sonarqube_key
in: body
type: string
description: "SonarQube project key."
- name: azdo_project
in: body
type: string
description: "Azure DevOps project name."
- name: release_id
in: body
type: string
description: "Azure DevOps release ID."
- name: plant_code
in: body
type: string
description: "Target plant code for deployment."
steps:
- name: check-pipeline
type: call
call: "gitlab.get-latest-pipeline"
with:
project_id: "{{gitlab_project_id}}"
- name: check-quality
type: call
call: "sonarqube.get-quality-gate"
with:
project_key: "{{sonarqube_key}}"
- name: check-release
type: call
call: "azure-devops.get-release"
with:
project: "{{azdo_project}}"
release_id: "{{release_id}}"
- name: create-change-request
type: call
call: "servicenow.create-change-request"
with:
short_description: "DCS deployment to {{plant_code}}: release {{release_id}}"
description: "Pipeline: {{check-pipeline.status}}. Quality gate: {{check-quality.status}}. Release: {{check-release.status}}. Deploying to plant {{plant_code}} DCS systems."
category: "software_deployment"
risk: "high"
assigned_group: "Plant_IT_{{plant_code}}"
consumes:
- type: http
namespace: gitlab
baseUri: "https://gitlab.dow.com/api/v4"
authentication:
type: bearer
token: "$secrets.gitlab_token"
resources:
- name: pipelines
path: "/projects/{{project_id}}/pipelines/latest"
inputParameters:
- name: project_id
in: path
operations:
- name: get-latest-pipeline
method: GET
- type: http
namespace: sonarqube
baseUri: "https://sonarqube.dow.com/api"
authentication:
type: bearer
token: "$secrets.sonarqube_token"
resources:
- name: quality-gates
path: "/qualitygates/project_status?projectKey={{project_key}}"
inputParameters:
- name: project_key
in: query
operations:
- name: get-quality-gate
method: GET
- type: http
namespace: azure-devops
baseUri: "https://vsrm.dev.azure.com/dow"
authentication:
type: bearer
token: "$secrets.azure_devops_token"
resources:
- name: releases
path: "/{{project}}/_apis/release/releases/{{release_id}}?api-version=7.0"
inputParameters:
- name: project
in: path
- name: release_id
in: path
operations:
- name: get-release
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.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-request
method: POST
Retrieves SAP BW production KPIs, correlates with Datadog real-time plant metrics, and archives the combined dashboard snapshot in SharePoint for management review.
naftiko: "0.5"
info:
label: "Production KPI Dashboard Pipeline"
description: "Retrieves SAP BW production KPIs, correlates with Datadog real-time plant metrics, and archives the combined dashboard snapshot in SharePoint for management review."
tags:
- manufacturing
- sap-bw
- datadog
- sharepoint
- analytics
capability:
exposes:
- type: mcp
namespace: production-kpi
port: 8080
tools:
- name: compile-kpi-dashboard
description: "Retrieve SAP BW KPIs, correlate with live metrics, and archive dashboard snapshot."
inputParameters:
- name: plant_code
in: body
type: string
description: "The Dow plant site code."
- name: period
in: body
type: string
description: "Reporting period in YYYY-MM format."
steps:
- name: get-kpis
type: call
call: "sap-bw.get-production-kpis"
with:
plant_code: "{{plant_code}}"
period: "{{period}}"
- name: get-live-metrics
type: call
call: "datadog.get-plant-metrics"
with:
plant_tag: "{{plant_code}}"
- name: archive-dashboard
type: call
call: "sharepoint.create-file"
with:
site_id: "plant_ops_site"
file_path: "KPIDashboards/{{plant_code}}/{{period}}_dashboard.json"
consumes:
- type: http
namespace: sap-bw
baseUri: "https://dow-bw.sap.com/sap/opu/odata/sap/BW_PROD_KPI_SRV"
authentication:
type: basic
username: "$secrets.sap_bw_user"
password: "$secrets.sap_bw_password"
resources:
- name: kpis
path: "/ProductionKPIs?$filter=Plant eq '{{plant_code}}' and Period eq '{{period}}'"
inputParameters:
- name: plant_code
in: query
- name: period
in: query
operations:
- name: get-production-kpis
method: GET
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: plant-metrics
path: "/query?query=avg:plant.*{plant:{{plant_tag}}}"
inputParameters:
- name: plant_tag
in: query
operations:
- name: get-plant-metrics
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
Generates compliance reports at Dow from Snowflake, Power BI, and email.
naftiko: "0.5"
info:
label: "Quarterly Compliance Report Pipeline"
description: "Generates compliance reports at Dow from Snowflake, Power BI, and email."
tags:
- compliance
- reporting
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: compliance-rpt
port: 8080
tools:
- name: gen-report
description: "Generate compliance reports at Dow."
inputParameters:
- name: quarter
in: body
type: string
description: "Quarter."
- name: type
in: body
type: string
description: "Type."
steps:
- name: data
type: call
call: "snowflake.query"
with:
query: "SELECT * FROM compliance WHERE q='{{quarter}}'"
- name: metrics
type: call
call: "analytics.compute"
with:
data: "{{data.results}}"
- name: refresh
type: call
call: "power-bi.refresh"
with:
dataset: "compliance"
- name: send
type: call
call: "email.send"
with:
to: "compliance@co.com"
subject: "{{type}} - {{quarter}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://dow.com.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query
method: POST
- type: http
namespace: analytics
baseUri: "https://analytics.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.analytics_token"
resources:
- name: metrics
path: "/compute"
operations:
- name: compute
method: POST
- type: http
namespace: power-bi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.power_bi_token"
resources:
- name: datasets
path: "/datasets/{{dataset}}/refreshes"
inputParameters:
- name: dataset
in: path
operations:
- name: refresh
method: POST
- type: http
namespace: email
baseUri: "https://email.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
When Oracle EBS inventory drops below reorder point, checks Bloomberg commodity pricing, creates a SAP purchase requisition, and notifies procurement via ServiceNow.
naftiko: "0.5"
info:
label: "Raw Material Reorder Orchestrator"
description: "When Oracle EBS inventory drops below reorder point, checks Bloomberg commodity pricing, creates a SAP purchase requisition, and notifies procurement via ServiceNow."
tags:
- supply-chain
- oracle-ebs
- sap
- bloomberg
- servicenow
- procurement
capability:
exposes:
- type: mcp
namespace: reorder-automation
port: 8080
tools:
- name: trigger-material-reorder
description: "Given a material item and site, check inventory, get current commodity price, create a purchase requisition in SAP, and notify procurement."
inputParameters:
- name: item_number
in: body
type: string
description: "The Oracle item number for the raw material."
- name: site_code
in: body
type: string
description: "The Dow plant site code."
- name: reorder_quantity
in: body
type: number
description: "The quantity to reorder."
- name: commodity_ticker
in: body
type: string
description: "Bloomberg ticker for the commodity."
steps:
- name: check-inventory
type: call
call: "oracle-ebs.get-inventory"
with:
item_number: "{{item_number}}"
site_code: "{{site_code}}"
- name: get-price
type: call
call: "bloomberg.get-price"
with:
ticker: "{{commodity_ticker}}"
- name: create-pr
type: call
call: "sap.create-purchase-requisition"
with:
material: "{{item_number}}"
plant: "{{site_code}}"
quantity: "{{reorder_quantity}}"
estimated_price: "{{get-price.price}}"
- name: notify-procurement
type: call
call: "servicenow.create-task"
with:
short_description: "Reorder: {{item_number}} at {{site_code}} — PR {{create-pr.pr_number}}"
description: "Inventory at {{check-inventory.on_hand_qty}} {{check-inventory.uom}}. Market price: {{get-price.price}} {{get-price.currency}}/unit. PR created for {{reorder_quantity}} units."
assigned_group: "Procurement_Team"
category: "material_reorder"
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://dow-ebs.oracle.com/webservices/rest/inventory/v1"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: on-hand
path: "/onhand?item={{item_number}}&org={{site_code}}"
inputParameters:
- name: item_number
in: query
- name: site_code
in: query
operations:
- name: get-inventory
method: GET
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: prices
path: "/prices?ticker={{ticker}}"
inputParameters:
- name: ticker
in: query
operations:
- name: get-price
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/MM_PUR_REQ_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-requisitions
path: "/A_PurchaseRequisition"
operations:
- name: create-purchase-requisition
method: POST
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Creates a new experiment record in PostgreSQL, provisions a SharePoint folder for lab notebooks, logs the experiment in SAP R&D project, and notifies the research team via HubSpot.
naftiko: "0.5"
info:
label: "R&D Experiment Tracking Pipeline"
description: "Creates a new experiment record in PostgreSQL, provisions a SharePoint folder for lab notebooks, logs the experiment in SAP R&D project, and notifies the research team via HubSpot."
tags:
- rnd
- postgresql
- sharepoint
- sap
- hubspot
capability:
exposes:
- type: mcp
namespace: experiment-tracking
port: 8080
tools:
- name: create-experiment
description: "Given experiment details, create records across lab database, SharePoint, SAP, and notify the team."
inputParameters:
- name: experiment_name
in: body
type: string
description: "Name of the new experiment."
- name: project_id
in: body
type: string
description: "SAP R&D project ID."
- name: lead_researcher_email
in: body
type: string
description: "Email of the lead researcher."
- name: material_class
in: body
type: string
description: "Chemical material class being researched."
steps:
- name: create-lab-record
type: call
call: "postgresql.create-experiment"
with:
name: "{{experiment_name}}"
project_id: "{{project_id}}"
material_class: "{{material_class}}"
- name: provision-folder
type: call
call: "sharepoint.create-folder"
with:
site_id: "rnd_lab_site"
folder_path: "Experiments/{{project_id}}/{{create-lab-record.experiment_id}}"
- name: log-in-sap
type: call
call: "sap.create-rnd-activity"
with:
project_id: "{{project_id}}"
activity_name: "{{experiment_name}}"
experiment_id: "{{create-lab-record.experiment_id}}"
- name: notify-team
type: call
call: "hubspot.send-email"
with:
to_email: "{{lead_researcher_email}}"
subject: "New Experiment: {{experiment_name}}"
body: "Experiment {{create-lab-record.experiment_id}} created for project {{project_id}}. Lab notebook folder: {{provision-folder.url}}. SAP activity: {{log-in-sap.activity_id}}."
consumes:
- type: http
namespace: postgresql
baseUri: "https://dow-lab-api.internal.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.lab_db_token"
resources:
- name: experiments
path: "/experiments"
operations:
- name: create-experiment
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/{{site_id}}/drive/root:/{{folder_path}}"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
operations:
- name: create-folder
method: POST
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PS_PROJECT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: activities
path: "/A_ProjectActivity"
operations:
- name: create-rnd-activity
method: POST
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Fetches active Datadog alerts for a reactor, retrieves the current process order from SAP, and creates a prioritized ServiceNow incident for plant operations triage.
naftiko: "0.5"
info:
label: "Reactor Alert Triage Pipeline"
description: "Fetches active Datadog alerts for a reactor, retrieves the current process order from SAP, and creates a prioritized ServiceNow incident for plant operations triage."
tags:
- monitoring
- datadog
- sap
- servicenow
- manufacturing
capability:
exposes:
- type: mcp
namespace: reactor-monitoring
port: 8080
tools:
- name: triage-reactor-alerts
description: "Retrieve Datadog alerts for a reactor, gather SAP context, and create a triage incident."
inputParameters:
- name: reactor_id
in: body
type: string
description: "The reactor unit identifier tag in Datadog."
steps:
- name: get-alerts
type: call
call: "datadog.get-alerts"
with:
reactor_id: "{{reactor_id}}"
- name: get-process-order
type: call
call: "sap.get-process-order"
with:
reactor_id: "{{reactor_id}}"
- name: create-triage-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Reactor {{reactor_id}} alert triage — {{get-alerts.count}} active alerts"
description: "Active alerts: {{get-alerts.count}}. Current process order: {{get-process-order.order_number}}. Material: {{get-process-order.material}}."
severity: "2"
assigned_group: "Plant_Operations"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor?monitor_tags=reactor:{{reactor_id}}"
inputParameters:
- name: reactor_id
in: query
operations:
- name: get-alerts
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PP_PROCESS_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: process-orders
path: "/A_ProcessOrder?$filter=Reactor eq '{{reactor_id}}'"
inputParameters:
- name: reactor_id
in: query
operations:
- name: get-process-order
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
When Datadog detects a reactor temperature anomaly, retrieves process parameters from SAP, checks operator certifications in Workday, and creates a prioritized ServiceNow incident.
naftiko: "0.5"
info:
label: "Reactor Anomaly Detection and Escalation"
description: "When Datadog detects a reactor temperature anomaly, retrieves process parameters from SAP, checks operator certifications in Workday, and creates a prioritized ServiceNow incident."
tags:
- manufacturing
- safety
- datadog
- sap
- workday
- servicenow
capability:
exposes:
- type: mcp
namespace: reactor-anomaly
port: 8080
tools:
- name: escalate-reactor-anomaly
description: "Given a reactor ID and anomaly type, gather process context and escalate via ServiceNow."
inputParameters:
- name: reactor_id
in: body
type: string
description: "The reactor unit identifier."
- name: anomaly_type
in: body
type: string
description: "Type of anomaly detected (temperature, pressure, flow)."
- name: operator_id
in: body
type: string
description: "Workday ID of the current shift operator."
steps:
- name: get-reactor-data
type: call
call: "datadog.get-reactor-metrics"
with:
reactor_id: "{{reactor_id}}"
- name: get-process-params
type: call
call: "sap.get-process-order"
with:
reactor_id: "{{reactor_id}}"
- name: get-operator
type: call
call: "workday.get-worker"
with:
worker_id: "{{operator_id}}"
- name: create-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Reactor {{reactor_id}} anomaly: {{anomaly_type}}"
severity: "2"
description: "Anomaly detected on reactor {{reactor_id}}. Current process order: {{get-process-params.order_number}}. Operator: {{get-operator.full_name}}. Metrics: temp={{get-reactor-data.temperature}}, pressure={{get-reactor-data.pressure}}."
assigned_group: "Plant_Operations"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: reactor-metrics
path: "/query?query=avg:reactor.*{reactor:{{reactor_id}}}"
inputParameters:
- name: reactor_id
in: query
operations:
- name: get-reactor-metrics
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PP_PROCESS_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: process-orders
path: "/A_ProcessOrder?$filter=Reactor eq '{{reactor_id}}'"
inputParameters:
- name: reactor_id
in: query
operations:
- name: get-process-order
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.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
Checks Redis at Dow.
naftiko: "0.5"
info:
label: "Redis Cache Status"
description: "Checks Redis at Dow."
tags:
- caching
- redis
- infrastructure
capability:
exposes:
- type: mcp
namespace: redis
port: 8080
tools:
- name: check-cache
description: "Check Redis at Dow."
inputParameters:
- name: instance
in: body
type: string
description: "Instance ID."
call: "redis.get-info"
with:
instance: "{{instance}}"
outputParameters:
- name: memory
type: string
mapping: "$.used_memory_human"
consumes:
- type: http
namespace: redis
baseUri: "https://redis.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.redis_token"
resources:
- name: instances
path: "/instances/{{instance}}/info"
inputParameters:
- name: instance
in: path
operations:
- name: get-info
method: GET
Prepares for a regulatory audit by collecting SAP EHS compliance records, retrieving training completion from Pluralsight, gathering open ServiceNow safety incidents, and compiling an audit package in SharePoint.
naftiko: "0.5"
info:
label: "Regulatory Audit Preparation Pipeline"
description: "Prepares for a regulatory audit by collecting SAP EHS compliance records, retrieving training completion from Pluralsight, gathering open ServiceNow safety incidents, and compiling an audit package in SharePoint."
tags:
- compliance
- sap
- pluralsight
- servicenow
- sharepoint
- environmental
capability:
exposes:
- type: mcp
namespace: audit-prep
port: 8080
tools:
- name: prepare-audit-package
description: "Given a plant code and audit type, compile compliance records into an audit-ready package."
inputParameters:
- name: plant_code
in: body
type: string
description: "The Dow plant site code."
- name: audit_type
in: body
type: string
description: "Type of audit (EPA, OSHA, ISO)."
- name: audit_date
in: body
type: string
description: "Scheduled audit date in YYYY-MM-DD format."
steps:
- name: get-ehs-records
type: call
call: "sap.get-ehs-compliance-records"
with:
plant: "{{plant_code}}"
audit_type: "{{audit_type}}"
- name: get-training-records
type: call
call: "pluralsight.get-team-completions"
with:
team_tag: "plant_{{plant_code}}"
- name: get-open-incidents
type: call
call: "servicenow.get-open-incidents"
with:
plant_code: "{{plant_code}}"
- name: compile-package
type: call
call: "sharepoint.create-file"
with:
site_id: "regulatory_audit_site"
file_path: "AuditPackages/{{plant_code}}/{{audit_type}}_{{audit_date}}.json"
consumes:
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/EHS_COMPLIANCE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: compliance-records
path: "/A_ComplianceRecord?$filter=Plant eq '{{plant}}' and AuditType eq '{{audit_type}}'"
inputParameters:
- name: plant
in: query
- name: audit_type
in: query
operations:
- name: get-ehs-compliance-records
method: GET
- type: http
namespace: pluralsight
baseUri: "https://api.pluralsight.com/api/v1"
authentication:
type: bearer
token: "$secrets.pluralsight_token"
resources:
- name: team-completions
path: "/teams/{{team_tag}}/course-completions"
inputParameters:
- name: team_tag
in: path
operations:
- name: get-team-completions
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident?sysparm_query=u_plant_code={{plant_code}}^active=true"
inputParameters:
- name: plant_code
in: query
operations:
- name: get-open-incidents
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
Fetches a regulatory document from SharePoint, validates the permit status against SAP EHS records, and creates a ServiceNow review task if the permit is nearing expiration.
naftiko: "0.5"
info:
label: "Regulatory Document Review Pipeline"
description: "Fetches a regulatory document from SharePoint, validates the permit status against SAP EHS records, and creates a ServiceNow review task if the permit is nearing expiration."
tags:
- compliance
- sharepoint
- sap
- servicenow
- environmental
capability:
exposes:
- type: mcp
namespace: regulatory-docs
port: 8080
tools:
- name: review-regulatory-document
description: "Fetch a regulatory document, check permit expiry in SAP EHS, and create review task if needed."
inputParameters:
- name: site_id
in: body
type: string
description: "The SharePoint site identifier."
- name: document_path
in: body
type: string
description: "Path to the document within the site drive."
- name: plant_code
in: body
type: string
description: "The Dow plant site code for permit lookup."
steps:
- name: get-document
type: call
call: "sharepoint.get-document"
with:
site_id: "{{site_id}}"
document_path: "{{document_path}}"
- name: check-permit
type: call
call: "sap.get-ehs-permits"
with:
plant: "{{plant_code}}"
- name: create-review-task
type: call
call: "servicenow.create-task"
with:
short_description: "Permit review: {{document_path}} at {{plant_code}}"
description: "Document retrieved from SharePoint. Active permits: {{check-permit.permit_count}}. Next expiry: {{check-permit.nearest_expiry}}."
assigned_group: "EHS_Compliance"
category: "permit_review"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: documents
path: "/{{site_id}}/drive/root:/{{document_path}}"
inputParameters:
- name: site_id
in: path
- name: document_path
in: path
operations:
- name: get-document
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/EHS_PERMIT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: permits
path: "/A_EHSPermit?$filter=Plant eq '{{plant}}'"
inputParameters:
- name: plant
in: query
operations:
- name: get-ehs-permits
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Checks release readiness at Dow.
naftiko: "0.5"
info:
label: "Release Readiness Pipeline"
description: "Checks release readiness at Dow."
tags:
- release-management
- devops
- quality
capability:
exposes:
- type: mcp
namespace: release-ready
port: 8080
tools:
- name: check-release
description: "Check release at Dow."
inputParameters:
- name: release_id
in: body
type: string
description: "Release ID."
- name: project
in: body
type: string
description: "Project."
steps:
- name: tests
type: call
call: "azdo.get-tests"
with:
project: "{{project}}"
release: "{{release_id}}"
- name: quality
type: call
call: "sonarqube.get-gate"
with:
project: "{{project}}"
- name: security
type: call
call: "security.get-scan"
with:
project: "{{project}}"
- name: doc
type: call
call: "confluence.create-page"
with:
title: "Release - {{release_id}}"
body: "Tests: {{tests.pass_rate}}% Quality: {{quality.status}}"
consumes:
- type: http
namespace: azdo
baseUri: "https://dev.azure.com/dow.com"
authentication:
type: bearer
token: "$secrets.azdo_token"
resources:
- name: tests
path: "/{{project}}/_apis/test/runs"
inputParameters:
- name: project
in: path
operations:
- name: get-tests
method: GET
- type: http
namespace: sonarqube
baseUri: "https://sonarqube.dow.com/api"
authentication:
type: bearer
token: "$secrets.sonarqube_token"
resources:
- name: quality
path: "/qualitygates/project_status"
operations:
- name: get-gate
method: GET
- type: http
namespace: security
baseUri: "https://security.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.security_token"
resources:
- name: scans
path: "/results"
operations:
- name: get-scan
method: GET
- type: http
namespace: confluence
baseUri: "https://dow.com.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
On a safety incident report, creates a ServiceNow incident, notifies the plant safety manager via SharePoint site, logs the event in SAP EHS, and sends alerts to the responsible team in LinkedIn (Workplace).
naftiko: "0.5"
info:
label: "Safety Incident Response Orchestrator"
description: "On a safety incident report, creates a ServiceNow incident, notifies the plant safety manager via SharePoint site, logs the event in SAP EHS, and sends alerts to the responsible team in LinkedIn (Workplace)."
tags:
- safety
- servicenow
- sap
- sharepoint
- incident-response
capability:
exposes:
- type: mcp
namespace: safety-response
port: 8080
tools:
- name: trigger-safety-response
description: "Given incident details, orchestrate safety incident response across ServiceNow, SAP EHS, SharePoint, and team notifications."
inputParameters:
- name: incident_type
in: body
type: string
description: "Type of safety incident (e.g., spill, exposure, equipment_failure)."
- name: plant_code
in: body
type: string
description: "The Dow plant site code where the incident occurred."
- name: description
in: body
type: string
description: "Detailed description of the incident."
- name: severity
in: body
type: string
description: "Severity level: low, medium, high, critical."
steps:
- name: create-incident
type: call
call: "servicenow.create-safety-incident"
with:
short_description: "Safety Incident at {{plant_code}}: {{incident_type}}"
severity: "{{severity}}"
description: "{{description}}"
category: "ehs_incident"
- name: log-sap-ehs
type: call
call: "sap.create-ehs-event"
with:
plant: "{{plant_code}}"
event_type: "{{incident_type}}"
severity: "{{severity}}"
description: "{{description}}"
- name: upload-report
type: call
call: "sharepoint.create-folder"
with:
site_id: "ehs_incidents_site"
folder_path: "Incidents/{{plant_code}}/{{create-incident.number}}"
- name: notify-safety-team
type: call
call: "servicenow.update-incident"
with:
incident_id: "{{create-incident.sys_id}}"
work_notes: "SAP EHS event {{log-sap-ehs.event_id}} created. SharePoint folder: {{upload-report.url}}."
consumes:
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: safety-incidents
path: "/table/u_safety_incident"
operations:
- name: create-safety-incident
method: POST
- name: incidents
path: "/table/u_safety_incident/{{incident_id}}"
inputParameters:
- name: incident_id
in: path
operations:
- name: update-incident
method: PATCH
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/EHS_INCIDENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: ehs-events
path: "/A_IncidentHeader"
operations:
- name: create-ehs-event
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/{{site_id}}/drive/root:/{{folder_path}}"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
operations:
- name: create-folder
method: POST
Retrieves a safety incident from ServiceNow, pulls the assigned investigator details from Workday, and archives the incident summary to the EHS SharePoint compliance library.
naftiko: "0.5"
info:
label: "Safety Incident Review Pipeline"
description: "Retrieves a safety incident from ServiceNow, pulls the assigned investigator details from Workday, and archives the incident summary to the EHS SharePoint compliance library."
tags:
- safety
- servicenow
- workday
- sharepoint
- ehs
capability:
exposes:
- type: mcp
namespace: safety-incidents
port: 8080
tools:
- name: review-safety-incident
description: "Look up a safety incident, enrich with investigator details, and archive to SharePoint."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow safety incident number."
steps:
- name: get-incident
type: call
call: "servicenow.get-safety-incident"
with:
incident_number: "{{incident_number}}"
- name: get-investigator
type: call
call: "workday.get-worker"
with:
worker_id: "{{get-incident.assigned_to}}"
- name: archive-summary
type: call
call: "sharepoint.create-file"
with:
site_id: "ehs_compliance_site"
file_path: "IncidentReviews/{{incident_number}}_review.json"
consumes:
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: safety-incidents
path: "/table/u_safety_incident/{{incident_number}}"
inputParameters:
- name: incident_number
in: path
operations:
- name: get-safety-incident
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
Checks SAP PO at Dow.
naftiko: "0.5"
info:
label: "SAP PO Check"
description: "Checks SAP PO at Dow."
tags:
- procurement
- sap
- purchase-orders
capability:
exposes:
- type: mcp
namespace: sap-po
port: 8080
tools:
- name: get-po
description: "Check PO at Dow."
inputParameters:
- name: po_number
in: body
type: string
description: "PO number."
call: "sap.get-po"
with:
po_number: "{{po_number}}"
outputParameters:
- name: vendor
type: string
mapping: "$.order.vendor"
- name: status
type: string
mapping: "$.order.status"
consumes:
- type: http
namespace: sap
baseUri: "https://sap.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.sap_token"
resources:
- name: purchase-orders
path: "/purchase-orders/{{po_number}}"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
Looks up a SAP S/4HANA production order by number, retrieves current reactor metrics from Datadog, and logs the combined status snapshot in SharePoint for shift supervisors.
naftiko: "0.5"
info:
label: "SAP Production Order Status with Monitoring"
description: "Looks up a SAP S/4HANA production order by number, retrieves current reactor metrics from Datadog, and logs the combined status snapshot in SharePoint for shift supervisors."
tags:
- manufacturing
- erp
- sap
- datadog
- sharepoint
capability:
exposes:
- type: mcp
namespace: mfg-orders
port: 8080
tools:
- name: get-production-order-status
description: "Look up a SAP production order, gather live reactor metrics, and archive a status snapshot."
inputParameters:
- name: order_number
in: body
type: string
description: "The SAP production order number."
- name: reactor_id
in: body
type: string
description: "The reactor unit running this order."
steps:
- name: get-order
type: call
call: "sap.get-production-order"
with:
order_number: "{{order_number}}"
- name: get-reactor-metrics
type: call
call: "datadog.get-reactor-metrics"
with:
reactor_id: "{{reactor_id}}"
- name: archive-snapshot
type: call
call: "sharepoint.create-file"
with:
site_id: "plant_ops_site"
file_path: "OrderSnapshots/{{order_number}}_snapshot.json"
consumes:
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: production-orders
path: "/A_ProductionOrder('{{order_number}}')"
inputParameters:
- name: order_number
in: path
operations:
- name: get-production-order
method: GET
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: reactor-metrics
path: "/query?query=avg:reactor.*{reactor:{{reactor_id}}}"
inputParameters:
- name: reactor_id
in: query
operations:
- name: get-reactor-metrics
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
Searches Elasticsearch for a safety data sheet, retrieves the SAP material hazard classification, and logs the compliance check in ServiceNow for regulatory audit trail.
naftiko: "0.5"
info:
label: "SDS Lookup and Compliance Validation"
description: "Searches Elasticsearch for a safety data sheet, retrieves the SAP material hazard classification, and logs the compliance check in ServiceNow for regulatory audit trail."
tags:
- safety
- elasticsearch
- sap
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: sds-compliance
port: 8080
tools:
- name: validate-sds-compliance
description: "Search for an SDS, validate hazard classification against SAP, and log the check."
inputParameters:
- name: query_text
in: body
type: string
description: "Product name or CAS number to search for."
- name: material_number
in: body
type: string
description: "SAP material number for hazard classification."
steps:
- name: search-sds
type: call
call: "elasticsearch.search-sds"
with:
query_text: "{{query_text}}"
- name: get-hazard-class
type: call
call: "sap.get-material-hazard"
with:
material_number: "{{material_number}}"
- name: log-check
type: call
call: "servicenow.create-task"
with:
short_description: "SDS compliance check: {{query_text}}"
description: "SDS found: {{search-sds.hit_count}} results. Material {{material_number}} hazard class: {{get-hazard-class.ghs_class}}. Signal words: {{get-hazard-class.signal_words}}."
assigned_group: "EHS_Compliance"
category: "sds_validation"
consumes:
- type: http
namespace: elasticsearch
baseUri: "https://dow-es.internal.dow.com"
authentication:
type: bearer
token: "$secrets.elasticsearch_token"
resources:
- name: sds-index
path: "/sds/_search"
operations:
- name: search-sds
method: POST
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/EHS_MATERIAL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: material-hazard
path: "/A_MaterialHazard('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-material-hazard
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
Remediates vulnerabilities at Dow via scanning, Jira, and Slack.
naftiko: "0.5"
info:
label: "Security Vulnerability Remediation Pipeline"
description: "Remediates vulnerabilities at Dow via scanning, Jira, and Slack."
tags:
- security
- vulnerability-management
- jira
capability:
exposes:
- type: mcp
namespace: vuln-fix
port: 8080
tools:
- name: remediate
description: "Fix vulnerabilities at Dow."
inputParameters:
- name: target
in: body
type: string
description: "Target."
- name: policy
in: body
type: string
description: "Policy."
steps:
- name: scan
type: call
call: "qualys.scan"
with:
target: "{{target}}"
policy: "{{policy}}"
- name: prioritize
type: call
call: "security.prioritize"
with:
scan: "{{scan.id}}"
- name: ticket
type: call
call: "jira.create-issue"
with:
project: "SEC"
summary: "Vulns: {{prioritize.critical}} critical"
- name: notify
type: call
call: "slack.post-message"
with:
channel: "#security"
text: "Scan: {{prioritize.critical}} critical"
consumes:
- type: http
namespace: qualys
baseUri: "https://qualysapi.qualys.com/api/v2"
authentication:
type: bearer
token: "$secrets.qualys_token"
resources:
- name: scans
path: "/fo/scan"
operations:
- name: scan
method: POST
- type: http
namespace: security
baseUri: "https://security.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.security_token"
resources:
- name: vulns
path: "/prioritize"
operations:
- name: prioritize
method: POST
- type: http
namespace: jira
baseUri: "https://dow.com.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
Checks IT incident in ServiceNow for Dow.
naftiko: "0.5"
info:
label: "ServiceNow Incident Detail Check"
description: "Checks IT incident in ServiceNow for Dow."
tags:
- it-service
- servicenow
- incident-management
capability:
exposes:
- type: mcp
namespace: snow-incident
port: 8080
tools:
- name: check-incident
description: "Check incident at Dow."
inputParameters:
- name: incident_number
in: body
type: string
description: "Incident number."
call: "servicenow.get-incident"
with:
number: "{{incident_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result.state"
- name: priority
type: string
mapping: "$.result.priority"
consumes:
- type: http
namespace: servicenow
baseUri: "https://dow.com.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
Retrieves SharePoint metadata at Dow.
naftiko: "0.5"
info:
label: "SharePoint File Metadata"
description: "Retrieves SharePoint metadata at Dow."
tags:
- document-management
- sharepoint
- collaboration
capability:
exposes:
- type: mcp
namespace: sp-docs
port: 8080
tools:
- name: get-file
description: "Look up file at Dow."
inputParameters:
- name: site_id
in: body
type: string
description: "Site ID."
- name: file_path
in: body
type: string
description: "Path."
call: "sharepoint.get-file"
with:
site_id: "{{site_id}}"
path: "{{file_path}}"
outputParameters:
- name: name
type: string
mapping: "$.name"
- name: size
type: number
mapping: "$.size"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.microsoft_graph_token"
resources:
- name: files
path: "/sites/{{site_id}}/drive/root:/{{path}}"
inputParameters:
- name: site_id
in: path
- name: path
in: path
operations:
- name: get-file
method: GET
At shift change, collects Datadog plant status, SAP production order progress, open ServiceNow incidents, and compiles a handover report in SharePoint for the incoming shift.
naftiko: "0.5"
info:
label: "Shift Handover Documentation Pipeline"
description: "At shift change, collects Datadog plant status, SAP production order progress, open ServiceNow incidents, and compiles a handover report in SharePoint for the incoming shift."
tags:
- manufacturing
- datadog
- sap
- servicenow
- sharepoint
capability:
exposes:
- type: mcp
namespace: shift-handover
port: 8080
tools:
- name: generate-shift-handover
description: "Given a plant code and shift ID, compile handover report from monitoring, production, and incident systems."
inputParameters:
- name: plant_code
in: body
type: string
description: "The Dow plant site code."
- name: shift_id
in: body
type: string
description: "The outgoing shift identifier."
- name: shift_date
in: body
type: string
description: "Shift date in YYYY-MM-DD format."
steps:
- name: get-plant-status
type: call
call: "datadog.get-plant-dashboard"
with:
plant_tag: "{{plant_code}}"
- name: get-production-progress
type: call
call: "sap.get-active-orders"
with:
plant: "{{plant_code}}"
- name: get-open-incidents
type: call
call: "servicenow.get-open-incidents"
with:
plant_code: "{{plant_code}}"
- name: archive-handover
type: call
call: "sharepoint.create-file"
with:
site_id: "plant_ops_site"
file_path: "ShiftHandovers/{{plant_code}}/{{shift_date}}_{{shift_id}}.json"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: dashboards
path: "/dashboard?filter[tags]=plant:{{plant_tag}}"
inputParameters:
- name: plant_tag
in: query
operations:
- name: get-plant-dashboard
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: active-orders
path: "/A_ProductionOrder?$filter=Plant eq '{{plant}}' and Status eq 'REL'"
inputParameters:
- name: plant
in: query
operations:
- name: get-active-orders
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident?sysparm_query=u_plant_code={{plant_code}}^active=true"
inputParameters:
- name: plant_code
in: query
operations:
- name: get-open-incidents
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
Monitors SLAs at Dow via Datadog and Slack.
naftiko: "0.5"
info:
label: "SLA Monitoring Pipeline"
description: "Monitors SLAs at Dow via Datadog and Slack."
tags:
- operations
- sla
- datadog
- slack
capability:
exposes:
- type: mcp
namespace: sla-monitor
port: 8080
tools:
- name: check-sla
description: "Monitor SLAs at Dow."
inputParameters:
- name: service
in: body
type: string
description: "Service."
- name: target
in: body
type: number
description: "SLA target %."
steps:
- name: metrics
type: call
call: "datadog.get-sla"
with:
service: "{{service}}"
- name: check
type: call
call: "analytics.check-sla"
with:
uptime: "{{metrics.uptime}}"
target: "{{target}}"
- name: alert
type: call
call: "slack.post-message"
with:
channel: "#ops"
text: "SLA: {{service}} at {{metrics.uptime}}% (target: {{target}}%)"
- name: log
type: call
call: "servicenow.create-incident"
with:
desc: "SLA breach: {{service}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v2"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: metrics
path: "/metrics"
operations:
- name: get-sla
method: GET
- type: http
namespace: slack
baseUri: "https://slack.com/api"
authentication:
type: bearer
token: "$secrets.slack_token"
resources:
- name: messages
path: "/chat.postMessage"
operations:
- name: post-message
method: POST
- type: http
namespace: servicenow
baseUri: "https://dow.com.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Fetches SonarQube quality gate status for process control software, returning quality gate result, coverage percentage, and code smells count.
naftiko: "0.5"
info:
label: "SonarQube Code Quality Gate for DCS Software"
description: "Fetches SonarQube quality gate status for process control software, returning quality gate result, coverage percentage, and code smells count."
tags:
- devops
- sonarqube
- quality
capability:
exposes:
- type: mcp
namespace: code-quality
port: 8080
tools:
- name: get-quality-gate
description: "Retrieve SonarQube quality gate status for a project key."
inputParameters:
- name: project_key
in: body
type: string
description: "The SonarQube project key."
call: "sonarqube.get-quality-gate"
with:
project_key: "{{project_key}}"
consumes:
- type: http
namespace: sonarqube
baseUri: "https://sonarqube.dow.com/api"
authentication:
type: bearer
token: "$secrets.sonarqube_token"
resources:
- name: quality-gates
path: "/qualitygates/project_status?projectKey={{project_key}}"
inputParameters:
- name: project_key
in: query
operations:
- name: get-quality-gate
method: GET
Exports a process flow model from Sparx Enterprise Architect for a chemical manufacturing process, returning the model diagram and element list for documentation.
naftiko: "0.5"
info:
label: "Sparx Enterprise Architect Model Export"
description: "Exports a process flow model from Sparx Enterprise Architect for a chemical manufacturing process, returning the model diagram and element list for documentation."
tags:
- engineering
- sparx-enterprise-architect
- design
capability:
exposes:
- type: mcp
namespace: ea-models
port: 8080
tools:
- name: export-process-model
description: "Export a Sparx Enterprise Architect process model by package GUID."
inputParameters:
- name: package_guid
in: body
type: string
description: "The EA package GUID for the process model."
call: "sparx-ea.export-package"
with:
package_guid: "{{package_guid}}"
consumes:
- type: http
namespace: sparx-ea
baseUri: "https://dow-ea.internal.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.sparx_ea_token"
resources:
- name: packages
path: "/packages/{{package_guid}}/export"
inputParameters:
- name: package_guid
in: path
operations:
- name: export-package
method: GET
Searches Splunk at Dow.
naftiko: "0.5"
info:
label: "Splunk Log Search"
description: "Searches Splunk at Dow."
tags:
- security
- splunk
- logging
capability:
exposes:
- type: mcp
namespace: splunk-search
port: 8080
tools:
- name: search-logs
description: "Search logs at Dow."
inputParameters:
- name: query
in: body
type: string
description: "SPL query."
call: "splunk.search"
with:
query: "{{query}}"
outputParameters:
- name: count
type: number
mapping: "$.results.count"
consumes:
- type: http
namespace: splunk
baseUri: "https://splunk.dow.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search
path: "/search/jobs"
operations:
- name: search
method: POST
When a supplier delivery delay is detected in Oracle EBS, checks SAP for alternative material sources, notifies the supply chain team via ServiceNow, and updates the Salesforce customer order with revised ETA.
naftiko: "0.5"
info:
label: "Supply Chain Disruption Alert Pipeline"
description: "When a supplier delivery delay is detected in Oracle EBS, checks SAP for alternative material sources, notifies the supply chain team via ServiceNow, and updates the Salesforce customer order with revised ETA."
tags:
- supply-chain
- oracle-ebs
- sap
- servicenow
- salesforce
capability:
exposes:
- type: mcp
namespace: supply-disruption
port: 8080
tools:
- name: handle-supply-disruption
description: "Given a delayed PO and affected customer order, find alternatives and notify stakeholders."
inputParameters:
- name: po_number
in: body
type: string
description: "The delayed purchase order number in Oracle EBS."
- name: customer_order_id
in: body
type: string
description: "The affected Salesforce customer order ID."
- name: new_eta
in: body
type: string
description: "Revised estimated delivery date."
steps:
- name: get-po-details
type: call
call: "oracle-ebs.get-po"
with:
po_number: "{{po_number}}"
- name: find-alternatives
type: call
call: "sap.search-material-sources"
with:
material: "{{get-po-details.item_number}}"
plant: "{{get-po-details.ship_to_site}}"
- name: notify-supply-chain
type: call
call: "servicenow.create-task"
with:
short_description: "Supply disruption: PO {{po_number}} delayed"
description: "Material: {{get-po-details.item_number}}. Original ETA: {{get-po-details.delivery_date}}. New ETA: {{new_eta}}. Alternative sources: {{find-alternatives.source_count}} found."
assigned_group: "Supply_Chain_Ops"
category: "supply_disruption"
- name: update-customer-order
type: call
call: "salesforce.update-order"
with:
order_id: "{{customer_order_id}}"
delivery_date: "{{new_eta}}"
status_note: "Supplier delay on PO {{po_number}}. Revised ETA: {{new_eta}}."
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://dow-ebs.oracle.com/webservices/rest/purchasing/v1"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: purchase-orders
path: "/purchaseOrders/{{po_number}}"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/MM_SOURCE_LIST_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: source-list
path: "/A_SourceList?$filter=Material eq '{{material}}' and Plant eq '{{plant}}'"
inputParameters:
- name: material
in: query
- name: plant
in: query
operations:
- name: search-material-sources
method: GET
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: salesforce
baseUri: "https://dow.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: orders
path: "/sobjects/Order/{{order_id}}"
inputParameters:
- name: order_id
in: path
operations:
- name: update-order
method: PATCH
Aggregates sustainability KPIs from Datadog (energy usage), SAP EHS (waste volumes), Oracle EBS (water consumption), and compiles a quarterly ESG report in SharePoint.
naftiko: "0.5"
info:
label: "Sustainability Metrics Collection Pipeline"
description: "Aggregates sustainability KPIs from Datadog (energy usage), SAP EHS (waste volumes), Oracle EBS (water consumption), and compiles a quarterly ESG report in SharePoint."
tags:
- sustainability
- environmental
- datadog
- sap
- oracle-ebs
- sharepoint
capability:
exposes:
- type: mcp
namespace: esg-reporting
port: 8080
tools:
- name: compile-esg-report
description: "Given a plant and quarter, aggregate sustainability metrics and archive the ESG report."
inputParameters:
- name: plant_code
in: body
type: string
description: "The Dow plant site code."
- name: quarter
in: body
type: string
description: "Reporting quarter (e.g., 2026-Q1)."
steps:
- name: get-energy-data
type: call
call: "datadog.get-energy-metrics"
with:
plant_tag: "{{plant_code}}"
quarter: "{{quarter}}"
- name: get-waste-data
type: call
call: "sap.get-ehs-waste"
with:
plant: "{{plant_code}}"
quarter: "{{quarter}}"
- name: get-water-data
type: call
call: "oracle-ebs.get-water-consumption"
with:
site_code: "{{plant_code}}"
quarter: "{{quarter}}"
- name: archive-report
type: call
call: "sharepoint.create-file"
with:
site_id: "sustainability_site"
file_path: "ESGReports/{{plant_code}}/{{quarter}}_esg_report.json"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: energy-metrics
path: "/query?query=avg:energy.*{plant:{{plant_tag}}}&period={{quarter}}"
inputParameters:
- name: plant_tag
in: query
- name: quarter
in: query
operations:
- name: get-energy-metrics
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/EHS_WASTE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: waste
path: "/A_WasteVolume?$filter=Plant eq '{{plant}}' and Quarter eq '{{quarter}}'"
inputParameters:
- name: plant
in: query
- name: quarter
in: query
operations:
- name: get-ehs-waste
method: GET
- type: http
namespace: oracle-ebs
baseUri: "https://dow-ebs.oracle.com/webservices/rest/utilities/v1"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: water
path: "/waterConsumption?site={{site_code}}&quarter={{quarter}}"
inputParameters:
- name: site_code
in: query
- name: quarter
in: query
operations:
- name: get-water-consumption
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
Retrieves Teams activity at Dow.
naftiko: "0.5"
info:
label: "Teams Channel Activity"
description: "Retrieves Teams activity at Dow."
tags:
- communications
- microsoft-teams
- analytics
capability:
exposes:
- type: mcp
namespace: teams-activity
port: 8080
tools:
- name: get-activity
description: "Check Teams activity at Dow."
inputParameters:
- name: team_id
in: body
type: string
description: "Team ID."
- name: channel_id
in: body
type: string
description: "Channel ID."
call: "teams.get-messages"
with:
team_id: "{{team_id}}"
channel_id: "{{channel_id}}"
outputParameters:
- name: count
type: number
mapping: "$.value.length"
consumes:
- type: http
namespace: teams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.microsoft_graph_token"
resources:
- name: messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: get-messages
method: GET
Retrieves inference metrics for a TensorFlow-based predictive maintenance model deployed via Kubeflow, returning accuracy, latency, and prediction drift indicators.
naftiko: "0.5"
info:
label: "TensorFlow Model Performance Check"
description: "Retrieves inference metrics for a TensorFlow-based predictive maintenance model deployed via Kubeflow, returning accuracy, latency, and prediction drift indicators."
tags:
- rnd
- tensorflow
- kubeflow
- machine-learning
capability:
exposes:
- type: mcp
namespace: ml-model-health
port: 8080
tools:
- name: get-model-metrics
description: "Retrieve Kubeflow serving metrics for a TensorFlow predictive maintenance model."
inputParameters:
- name: model_name
in: body
type: string
description: "The deployed model name in Kubeflow."
call: "kubeflow.get-model-metrics"
with:
model_name: "{{model_name}}"
consumes:
- type: http
namespace: kubeflow
baseUri: "https://kubeflow.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.kubeflow_token"
resources:
- name: model-metrics
path: "/models/{{model_name}}/metrics"
inputParameters:
- name: model_name
in: path
operations:
- name: get-model-metrics
method: GET
Checks Terraform workspace at Dow.
naftiko: "0.5"
info:
label: "Terraform Workspace Check"
description: "Checks Terraform workspace at Dow."
tags:
- infrastructure
- terraform
- iac
capability:
exposes:
- type: mcp
namespace: tf-ws
port: 8080
tools:
- name: check-ws
description: "Check workspace at Dow."
inputParameters:
- name: workspace_id
in: body
type: string
description: "Workspace ID."
call: "terraform.get-ws"
with:
workspace_id: "{{workspace_id}}"
outputParameters:
- name: name
type: string
mapping: "$.data.attributes.name"
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: workspaces
path: "/workspaces/{{workspace_id}}"
inputParameters:
- name: workspace_id
in: path
operations:
- name: get-ws
method: GET
Checks Vault secret at Dow.
naftiko: "0.5"
info:
label: "Vault Secret Metadata"
description: "Checks Vault secret at Dow."
tags:
- security
- vault
- secrets-management
capability:
exposes:
- type: mcp
namespace: vault
port: 8080
tools:
- name: check-secret
description: "Check secret at Dow."
inputParameters:
- name: path
in: body
type: string
description: "Secret path."
call: "vault.get-metadata"
with:
path: "{{path}}"
outputParameters:
- name: version
type: number
mapping: "$.data.current_version"
consumes:
- type: http
namespace: vault
baseUri: "https://vault.dow.com/v1"
authentication:
type: bearer
token: "$secrets.vault_token"
resources:
- name: secrets
path: "/secret/metadata/{{path}}"
inputParameters:
- name: path
in: path
operations:
- name: get-metadata
method: GET
Processes invoices at Dow via OCR, SAP matching, approval, and Oracle recording.
naftiko: "0.5"
info:
label: "Vendor Invoice Processing Pipeline"
description: "Processes invoices at Dow via OCR, SAP matching, approval, and Oracle recording."
tags:
- finance
- accounts-payable
- sap
- oracle
capability:
exposes:
- type: mcp
namespace: invoice-proc
port: 8080
tools:
- name: process-invoice
description: "Process invoices at Dow."
inputParameters:
- name: invoice_id
in: body
type: string
description: "Invoice ID."
- name: vendor_id
in: body
type: string
description: "Vendor ID."
steps:
- name: extract
type: call
call: "ocr.extract"
with:
doc: "{{invoice_id}}"
- name: match
type: call
call: "sap.match-po"
with:
vendor: "{{vendor_id}}"
amount: "{{extract.total}}"
- name: approve
type: call
call: "workflow.submit"
with:
invoice: "{{invoice_id}}"
- name: record
type: call
call: "oracle.create-payment"
with:
invoice: "{{invoice_id}}"
consumes:
- type: http
namespace: ocr
baseUri: "https://ocr.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.ocr_token"
resources:
- name: invoices
path: "/extract"
operations:
- name: extract
method: POST
- type: http
namespace: sap
baseUri: "https://sap.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.sap_token"
resources:
- name: pos
path: "/match"
operations:
- name: match-po
method: POST
- type: http
namespace: workflow
baseUri: "https://workflow.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.workflow_token"
resources:
- name: approvals
path: "/submit"
operations:
- name: submit
method: POST
- type: http
namespace: oracle
baseUri: "https://oracle.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: payments
path: "/payments"
operations:
- name: create-payment
method: POST
Pulls vendor delivery data from Oracle EBS, quality metrics from SAP QM, and financial data from SAP BW, then creates a vendor scorecard report in SharePoint.
naftiko: "0.5"
info:
label: "Vendor Performance Scorecard Generator"
description: "Pulls vendor delivery data from Oracle EBS, quality metrics from SAP QM, and financial data from SAP BW, then creates a vendor scorecard report in SharePoint."
tags:
- procurement
- oracle-ebs
- sap
- sap-bw
- sharepoint
capability:
exposes:
- type: mcp
namespace: vendor-scorecard
port: 8080
tools:
- name: generate-vendor-scorecard
description: "Given a vendor ID and review period, compile performance data and archive scorecard to SharePoint."
inputParameters:
- name: vendor_id
in: body
type: string
description: "The vendor identifier in Oracle EBS."
- name: period
in: body
type: string
description: "Review period in YYYY-MM format."
steps:
- name: get-delivery-metrics
type: call
call: "oracle-ebs.get-vendor-deliveries"
with:
vendor_id: "{{vendor_id}}"
period: "{{period}}"
- name: get-quality-metrics
type: call
call: "sap.get-vendor-quality"
with:
vendor_id: "{{vendor_id}}"
period: "{{period}}"
- name: get-spend-data
type: call
call: "sap-bw.get-vendor-spend"
with:
vendor_id: "{{vendor_id}}"
period: "{{period}}"
- name: archive-scorecard
type: call
call: "sharepoint.create-file"
with:
site_id: "procurement_site"
file_path: "VendorScorecards/{{vendor_id}}/{{period}}_scorecard.json"
consumes:
- type: http
namespace: oracle-ebs
baseUri: "https://dow-ebs.oracle.com/webservices/rest/purchasing/v1"
authentication:
type: basic
username: "$secrets.oracle_ebs_user"
password: "$secrets.oracle_ebs_password"
resources:
- name: vendor-deliveries
path: "/vendorDeliveries?vendor={{vendor_id}}&period={{period}}"
inputParameters:
- name: vendor_id
in: query
- name: period
in: query
operations:
- name: get-vendor-deliveries
method: GET
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/QM_VENDOR_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: vendor-quality
path: "/A_VendorQuality?$filter=Vendor eq '{{vendor_id}}' and Period eq '{{period}}'"
inputParameters:
- name: vendor_id
in: query
- name: period
in: query
operations:
- name: get-vendor-quality
method: GET
- type: http
namespace: sap-bw
baseUri: "https://dow-bw.sap.com/sap/opu/odata/sap/BW_SPEND_SRV"
authentication:
type: basic
username: "$secrets.sap_bw_user"
password: "$secrets.sap_bw_password"
resources:
- name: vendor-spend
path: "/VendorSpend?$filter=Vendor eq '{{vendor_id}}' and Period eq '{{period}}'"
inputParameters:
- name: vendor_id
in: query
- name: period
in: query
operations:
- name: get-vendor-spend
method: GET
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
Reviews vendors at Dow.
naftiko: "0.5"
info:
label: "Quarterly Vendor Review Pipeline"
description: "Reviews vendors at Dow."
tags:
- procurement
- vendor-management
- review
capability:
exposes:
- type: mcp
namespace: vendor-review
port: 8080
tools:
- name: review-vendor
description: "Review vendors at Dow."
inputParameters:
- name: vendor_id
in: body
type: string
description: "Vendor ID."
- name: quarter
in: body
type: string
description: "Quarter."
steps:
- name: perf
type: call
call: "procurement.get-metrics"
with:
vendor: "{{vendor_id}}"
q: "{{quarter}}"
- name: scorecard
type: call
call: "analytics.scorecard"
with:
data: "{{perf.data}}"
- name: invite
type: call
call: "email.send"
with:
to: "{{perf.contact}}"
subject: "QBR - {{quarter}}"
- name: schedule
type: call
call: "calendar.create-event"
with:
title: "QBR - {{perf.name}}"
consumes:
- type: http
namespace: procurement
baseUri: "https://procurement.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.procurement_token"
resources:
- name: vendors
path: "/vendors/{{vendor}}/metrics"
inputParameters:
- name: vendor
in: path
operations:
- name: get-metrics
method: GET
- type: http
namespace: analytics
baseUri: "https://analytics.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.analytics_token"
resources:
- name: scorecards
path: "/compute"
operations:
- name: scorecard
method: POST
- type: http
namespace: email
baseUri: "https://email.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
- type: http
namespace: calendar
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.microsoft_graph_token"
resources:
- name: events
path: "/users/proc/events"
operations:
- name: create-event
method: POST
Creates a hazardous waste manifest in SAP EHS, schedules disposal pickup via ServiceNow, updates the environmental compliance tracker in SharePoint, and notifies the EHS coordinator via HubSpot.
naftiko: "0.5"
info:
label: "Waste Manifest and Disposal Tracking Pipeline"
description: "Creates a hazardous waste manifest in SAP EHS, schedules disposal pickup via ServiceNow, updates the environmental compliance tracker in SharePoint, and notifies the EHS coordinator via HubSpot."
tags:
- environmental
- safety
- sap
- servicenow
- sharepoint
- hubspot
capability:
exposes:
- type: mcp
namespace: waste-disposal
port: 8080
tools:
- name: process-waste-manifest
description: "Given waste details and plant info, create manifest, schedule disposal, and update compliance records."
inputParameters:
- name: waste_type
in: body
type: string
description: "Hazardous waste classification code."
- name: quantity_kg
in: body
type: number
description: "Waste quantity in kilograms."
- name: plant_code
in: body
type: string
description: "The Dow plant site code."
- name: ehs_coordinator_email
in: body
type: string
description: "Email of the EHS coordinator."
steps:
- name: create-manifest
type: call
call: "sap.create-waste-manifest"
with:
waste_type: "{{waste_type}}"
quantity: "{{quantity_kg}}"
plant: "{{plant_code}}"
- name: schedule-pickup
type: call
call: "servicenow.create-work-order"
with:
short_description: "Hazardous waste pickup: {{waste_type}} at {{plant_code}}"
description: "Manifest: {{create-manifest.manifest_number}}. Quantity: {{quantity_kg}} kg. Classification: {{waste_type}}."
assigned_group: "Waste_Management"
- name: update-tracker
type: call
call: "sharepoint.create-file"
with:
site_id: "ehs_compliance_site"
file_path: "WasteManifests/{{plant_code}}/{{create-manifest.manifest_number}}.json"
- name: notify-coordinator
type: call
call: "hubspot.send-email"
with:
to_email: "{{ehs_coordinator_email}}"
subject: "Waste Manifest Created: {{create-manifest.manifest_number}}"
body: "Manifest {{create-manifest.manifest_number}} for {{quantity_kg}} kg of {{waste_type}} at plant {{plant_code}}. Pickup work order: {{schedule-pickup.number}}. Compliance record: {{update-tracker.url}}."
consumes:
- type: http
namespace: sap
baseUri: "https://dow-s4.sap.com/sap/opu/odata/sap/EHS_WASTE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: manifests
path: "/A_WasteManifest"
operations:
- name: create-waste-manifest
method: POST
- type: http
namespace: servicenow
baseUri: "https://dow.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: work-orders
path: "/table/wm_order"
operations:
- name: create-work-order
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: create-file
method: PUT
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: emails
path: "/marketing/v3/transactional/single-email/send"
operations:
- name: send-email
method: POST
Queries Workday for an employee's active safety and compliance certifications, used to validate operator eligibility before assigning chemical plant shifts.
naftiko: "0.5"
info:
label: "Workday Employee Certification Check"
description: "Queries Workday for an employee's active safety and compliance certifications, used to validate operator eligibility before assigning chemical plant shifts."
tags:
- safety
- workday
- hr
capability:
exposes:
- type: mcp
namespace: hr-certifications
port: 8080
tools:
- name: get-employee-certifications
description: "Retrieve active safety and compliance certifications for a Workday employee."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
call: "workday.get-certifications"
with:
employee_id: "{{employee_id}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: certifications
path: "/workers/{{employee_id}}/certifications"
inputParameters:
- name: employee_id
in: path
operations:
- name: get-certifications
method: GET
Retrieves employee profile from Workday for Dow.
naftiko: "0.5"
info:
label: "Workday Employee Profile Lookup"
description: "Retrieves employee profile from Workday for Dow."
tags:
- hr
- workday
- employee-directory
capability:
exposes:
- type: mcp
namespace: workday-profile
port: 8080
tools:
- name: get-employee-profile
description: "Look up Dow employee in Workday."
inputParameters:
- name: employee_id
in: body
type: string
description: "Employee ID."
call: "workday.get-worker"
with:
employee_id: "{{employee_id}}"
outputParameters:
- name: name
type: string
mapping: "$.worker.name"
- name: title
type: string
mapping: "$.worker.title"
consumes:
- type: http
namespace: workday
baseUri: "https://wd5.dow.com/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{employee_id}}"
inputParameters:
- name: employee_id
in: path
operations:
- name: get-worker
method: GET
Enriches a sales prospect record with ZoomInfo company data, returning industry classification, revenue, employee count, and key contacts for targeted chemical sales outreach.
naftiko: "0.5"
info:
label: "ZoomInfo Prospect Enrichment for Chemical Sales"
description: "Enriches a sales prospect record with ZoomInfo company data, returning industry classification, revenue, employee count, and key contacts for targeted chemical sales outreach."
tags:
- sales
- zoominfo
- crm
capability:
exposes:
- type: mcp
namespace: prospect-enrichment
port: 8080
tools:
- name: enrich-prospect
description: "Enrich a prospect with ZoomInfo company and contact data."
inputParameters:
- name: company_name
in: body
type: string
description: "The prospect company name."
call: "zoominfo.search-company"
with:
company_name: "{{company_name}}"
consumes:
- type: http
namespace: zoominfo
baseUri: "https://api.zoominfo.com/search"
authentication:
type: bearer
token: "$secrets.zoominfo_token"
resources:
- name: companies
path: "/company"
operations:
- name: search-company
method: POST