Duke Energy Capabilities
Naftiko 0.5 capability definitions for Duke Energy - 100 capabilities showing integration workflows and service orchestrations.
Reviews access at Duke Energy via Okta, IAM, and Jira.
naftiko: "0.5"
info:
label: "Access Review Pipeline"
description: "Reviews access at Duke Energy 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 Duke Energy."
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://duke-energy.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.duke-energy.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://duke-energy.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 Duke Energy via consumer identification, notices, and tracking.
naftiko: "0.5"
info:
label: "API Deprecation Pipeline"
description: "Manages API deprecation at Duke Energy 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 Duke Energy."
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.duke-energy.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.duke-energy.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.duke-energy.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://duke-energy.com.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Fetches an AutoCAD engineering drawing from SharePoint by drawing number and returns the file metadata and download link.
naftiko: "0.5"
info:
label: "AutoCAD Drawing Retrieval"
description: "Fetches an AutoCAD engineering drawing from SharePoint by drawing number and returns the file metadata and download link."
tags:
- engineering
- autocad
- sharepoint
capability:
exposes:
- type: mcp
namespace: engineering-drawings
port: 8080
tools:
- name: get-drawing
description: "Retrieve an AutoCAD drawing from SharePoint by drawing number."
inputParameters:
- name: drawing_number
in: body
type: string
description: "The engineering drawing number."
steps:
- name: find-drawing
type: call
call: "sharepoint.search-file"
with:
site_id: "engineering_site"
query: "{{drawing_number}}.dwg"
- name: get-file
type: call
call: "sharepoint.get-file"
with:
site_id: "engineering_site"
file_path: "{{find-drawing.path}}"
consumes:
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: search
path: "/{{site_id}}/drive/root/search(q='{{query}}')"
inputParameters:
- name: site_id
in: path
- name: query
in: path
operations:
- name: search-file
method: GET
- name: files
path: "/{{site_id}}/drive/root:/{{file_path}}"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: get-file
method: GET
Looks up a user in Azure Active Directory by UPN and returns profile, department, and group memberships.
naftiko: "0.5"
info:
label: "Azure Active Directory User Lookup"
description: "Looks up a user in Azure Active Directory by UPN and returns profile, department, and group memberships."
tags:
- identity
- azure-active-directory
capability:
exposes:
- type: mcp
namespace: identity
port: 8080
tools:
- name: lookup-user
description: "Look up an Azure AD user by UPN."
inputParameters:
- name: upn
in: body
type: string
description: "User principal name (email)."
call: "azuread.get-user"
with:
upn: "{{upn}}"
consumes:
- type: http
namespace: azuread
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{upn}}"
inputParameters:
- name: upn
in: path
operations:
- name: get-user
method: GET
Checks build at Duke Energy.
naftiko: "0.5"
info:
label: "Azure DevOps Build Check"
description: "Checks build at Duke Energy."
tags:
- devops
- azure-devops
- ci-cd
capability:
exposes:
- type: mcp
namespace: azdo-build
port: 8080
tools:
- name: check-build
description: "Check build at Duke Energy."
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/duke-energy.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
Retrieves the latest build pipeline run status from Azure DevOps for a specified project and pipeline.
naftiko: "0.5"
info:
label: "Azure DevOps Build Pipeline Status"
description: "Retrieves the latest build pipeline run status from Azure DevOps for a specified project and pipeline."
tags:
- development
- azure-devops
capability:
exposes:
- type: mcp
namespace: build-status
port: 8080
tools:
- name: get-build-status
description: "Fetch latest Azure DevOps build pipeline run status."
inputParameters:
- name: project
in: body
type: string
description: "The Azure DevOps project name."
- name: pipeline_id
in: body
type: string
description: "The pipeline identifier."
call: "azdo.get-build"
with:
project: "{{project}}"
pipeline_id: "{{pipeline_id}}"
consumes:
- type: http
namespace: azdo
baseUri: "https://dev.azure.com/duke-energy"
authentication:
type: bearer
token: "$secrets.azdo_token"
resources:
- name: builds
path: "/{{project}}/_apis/build/builds"
inputParameters:
- name: project
in: path
operations:
- name: get-build
method: GET
Verifies backups at Duke Energy.
naftiko: "0.5"
info:
label: "Backup Verification Pipeline"
description: "Verifies backups at Duke Energy."
tags:
- database
- backup
- operations
capability:
exposes:
- type: mcp
namespace: backup-verify
port: 8080
tools:
- name: verify-backups
description: "Verify backups at Duke Energy."
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.duke-energy.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://duke-energy.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
Analyzes budget variance at Duke Energy via Oracle, Workday, and Slack.
naftiko: "0.5"
info:
label: "Budget Variance Pipeline"
description: "Analyzes budget variance at Duke Energy 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 Duke Energy."
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.duke-energy.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.duke-energy.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.duke-energy.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
Plans capacity at Duke Energy by collecting utilization and forecasting.
naftiko: "0.5"
info:
label: "Capacity Planning Pipeline"
description: "Plans capacity at Duke Energy 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 Duke Energy."
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.duke-energy.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.duke-energy.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://duke-energy.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 Duke Energy.
naftiko: "0.5"
info:
label: "Certificate Expiry Pipeline"
description: "Monitors cert expiry at Duke Energy."
tags:
- security
- certificates
- monitoring
capability:
exposes:
- type: mcp
namespace: cert-monitor
port: 8080
tools:
- name: check-certs
description: "Monitor certs at Duke Energy."
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.duke-energy.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://duke-energy.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 Duke Energy through ServiceNow and CAB approval.
naftiko: "0.5"
info:
label: "Change Management Pipeline"
description: "Routes changes at Duke Energy 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 Duke Energy."
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://duke-energy.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.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
Queries Cisco network infrastructure for device status, interface health, and uptime metrics.
naftiko: "0.5"
info:
label: "Cisco Network Device Status"
description: "Queries Cisco network infrastructure for device status, interface health, and uptime metrics."
tags:
- infrastructure
- networking
- cisco
capability:
exposes:
- type: mcp
namespace: network-status
port: 8080
tools:
- name: get-device-status
description: "Fetch Cisco device status by hostname or IP."
inputParameters:
- name: device_id
in: body
type: string
description: "The Cisco device hostname or IP address."
call: "cisco.get-device"
with:
device_id: "{{device_id}}"
consumes:
- type: http
namespace: cisco
baseUri: "https://dnac.duke-energy.com/dna/intent/api/v1"
authentication:
type: bearer
token: "$secrets.cisco_token"
resources:
- name: devices
path: "/network-device/{{device_id}}"
inputParameters:
- name: device_id
in: path
operations:
- name: get-device
method: GET
Optimizes cloud costs at Duke Energy via Azure, FinOps, Jira, and Power BI.
naftiko: "0.5"
info:
label: "Cloud Cost Optimization Pipeline"
description: "Optimizes cloud costs at Duke Energy 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 Duke Energy."
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.duke-energy.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://duke-energy.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
Retrieves DNS records for a Cloudflare-managed zone for utility web infrastructure.
naftiko: "0.5"
info:
label: "Cloudflare DNS Record Lookup"
description: "Retrieves DNS records for a Cloudflare-managed zone for utility web infrastructure."
tags:
- infrastructure
- cloudflare
capability:
exposes:
- type: mcp
namespace: dns-mgmt
port: 8080
tools:
- name: lookup-dns-record
description: "Look up Cloudflare DNS records by zone and name."
inputParameters:
- name: zone_id
in: body
type: string
description: "Cloudflare zone identifier."
- name: record_name
in: body
type: string
description: "DNS record name."
call: "cloudflare.get-dns-records"
with:
zone_id: "{{zone_id}}"
record_name: "{{record_name}}"
consumes:
- type: http
namespace: cloudflare
baseUri: "https://api.cloudflare.com/client/v4"
authentication:
type: bearer
token: "$secrets.cloudflare_token"
resources:
- name: dns-records
path: "/zones/{{zone_id}}/dns_records"
inputParameters:
- name: zone_id
in: path
operations:
- name: get-dns-records
method: GET
Searches Confluence at Duke Energy.
naftiko: "0.5"
info:
label: "Confluence Article Search"
description: "Searches Confluence at Duke Energy."
tags:
- knowledge-management
- confluence
- documentation
capability:
exposes:
- type: mcp
namespace: confluence-search
port: 8080
tools:
- name: search-articles
description: "Search Confluence at Duke Energy."
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://duke-energy.com.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: content
path: "/content/search"
operations:
- name: search
method: GET
Searches the Duke Energy Confluence knowledge base by query and returns matching pages with titles and excerpts.
naftiko: "0.5"
info:
label: "Confluence Knowledge Base Search"
description: "Searches the Duke Energy Confluence knowledge base by query and returns matching pages with titles and excerpts."
tags:
- knowledge
- confluence
capability:
exposes:
- type: mcp
namespace: knowledge-base
port: 8080
tools:
- name: search-knowledge-base
description: "Search Confluence knowledge base by keyword."
inputParameters:
- name: query
in: body
type: string
description: "Search query string."
call: "confluence.search"
with:
query: "{{query}}"
consumes:
- type: http
namespace: confluence
baseUri: "https://duke-energy.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_token"
resources:
- name: search
path: "/search"
operations:
- name: search
method: GET
Tracks contract renewals at Duke Energy via contracts system, email, Jira, and Salesforce.
naftiko: "0.5"
info:
label: "Contract Renewal Pipeline"
description: "Tracks contract renewals at Duke Energy 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 Duke Energy."
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.duke-energy.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.duke-energy.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://duke-energy.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://duke-energy.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 Duke Energy.
naftiko: "0.5"
info:
label: "Cost Reallocation Pipeline"
description: "Reallocates costs at Duke Energy."
tags:
- finance
- cost-allocation
- oracle
capability:
exposes:
- type: mcp
namespace: cost-realloc
port: 8080
tools:
- name: reallocate
description: "Reallocate costs at Duke Energy."
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.duke-energy.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.duke-energy.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
Retrieves customer billing details from SAP by account number including current balance, payment history, and rate plan.
naftiko: "0.5"
info:
label: "Customer Billing Lookup"
description: "Retrieves customer billing details from SAP by account number including current balance, payment history, and rate plan."
tags:
- billing
- sap
capability:
exposes:
- type: mcp
namespace: billing
port: 8080
tools:
- name: get-billing-details
description: "Look up customer billing in SAP by account number."
inputParameters:
- name: account_number
in: body
type: string
description: "The SAP customer account number."
call: "sap.get-billing"
with:
account_number: "{{account_number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: billing
path: "/billing/accounts/{{account_number}}"
inputParameters:
- name: account_number
in: path
operations:
- name: get-billing
method: GET
When a customer submits a service request via Google Forms, creates a ServiceNow case, looks up account in SAP, and sends an acknowledgment via Microsoft Outlook.
naftiko: "0.5"
info:
label: "Customer Service Request Pipeline"
description: "When a customer submits a service request via Google Forms, creates a ServiceNow case, looks up account in SAP, and sends an acknowledgment via Microsoft Outlook."
tags:
- customer-service
- google-forms
- servicenow
- sap
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: customer-service
port: 8080
tools:
- name: process-service-request
description: "Process a customer service request from form submission through case creation and acknowledgment."
inputParameters:
- name: form_id
in: body
type: string
description: "The Google Forms form ID."
- name: response_id
in: body
type: string
description: "The specific form response ID."
steps:
- name: get-response
type: call
call: "gforms.get-response"
with:
form_id: "{{form_id}}"
response_id: "{{response_id}}"
- name: lookup-account
type: call
call: "sap.get-customer"
with:
email: "{{get-response.customer_email}}"
- name: create-case
type: call
call: "servicenow.create-case"
with:
short_description: "Service request: {{get-response.request_type}}"
description: "Customer: {{get-response.customer_name}} (Account: {{lookup-account.account_number}}). Request: {{get-response.description}}"
assigned_group: "Customer_Service"
- name: send-acknowledgment
type: call
call: "outlook.send-email"
with:
to: "{{get-response.customer_email}}"
subject: "Service Request Received — Case {{create-case.number}}"
body: "Dear {{get-response.customer_name}}, your service request has been received. Case number: {{create-case.number}}. We will respond within 24 hours."
consumes:
- type: http
namespace: gforms
baseUri: "https://forms.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.google_forms_token"
resources:
- name: responses
path: "/forms/{{form_id}}/responses/{{response_id}}"
inputParameters:
- name: form_id
in: path
- name: response_id
in: path
operations:
- name: get-response
method: GET
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: customers
path: "/customers/search"
operations:
- name: get-customer
method: GET
- type: http
namespace: servicenow
baseUri: "https://duke-energy.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cases
path: "/table/sn_customerservice_case"
operations:
- name: create-case
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail
path: "/users/noreply@duke-energy.com/sendMail"
operations:
- name: send-email
method: POST
Monitors data pipelines at Duke Energy via Databricks, Snowflake, Slack, and ServiceNow.
naftiko: "0.5"
info:
label: "Data Pipeline Monitor Pipeline"
description: "Monitors data pipelines at Duke Energy 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 Duke Energy."
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://duke-energy.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://duke-energy.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://duke-energy.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
Queries Datadog for a specific metric time series over a given window for grid monitoring dashboards.
naftiko: "0.5"
info:
label: "Datadog Metric Query"
description: "Queries Datadog for a specific metric time series over a given window for grid monitoring dashboards."
tags:
- monitoring
- datadog
capability:
exposes:
- type: mcp
namespace: metrics
port: 8080
tools:
- name: query-metric
description: "Query a Datadog metric by name and time range."
inputParameters:
- name: metric_name
in: body
type: string
description: "The Datadog metric name."
- name: from_ts
in: body
type: string
description: "Start timestamp (epoch seconds)."
- name: to_ts
in: body
type: string
description: "End timestamp (epoch seconds)."
call: "datadog.query-metric"
with:
query: "{{metric_name}}"
from: "{{from_ts}}"
to: "{{to_ts}}"
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"
operations:
- name: query-metric
method: GET
Checks Datadog monitor at Duke Energy.
naftiko: "0.5"
info:
label: "Datadog Monitor Check"
description: "Checks Datadog monitor at Duke Energy."
tags:
- monitoring
- datadog
- observability
capability:
exposes:
- type: mcp
namespace: dd-monitor
port: 8080
tools:
- name: check-monitor
description: "Check monitor at Duke Energy."
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
Activates a demand response event by notifying enrolled customers via WhatsApp, adjusting smart thermostats through Azure IoT Hub, and logging the event in SAP energy management.
naftiko: "0.5"
info:
label: "Demand Response Program Activation"
description: "Activates a demand response event by notifying enrolled customers via WhatsApp, adjusting smart thermostats through Azure IoT Hub, and logging the event in SAP energy management."
tags:
- grid-ops
- demand-response
- whatsapp
- sap
capability:
exposes:
- type: mcp
namespace: demand-response
port: 8080
tools:
- name: activate-demand-response
description: "Activate DR event: notify customers, adjust devices, and log in SAP."
inputParameters:
- name: event_id
in: body
type: string
description: "The demand response event identifier."
- name: region
in: body
type: string
description: "Target region for DR activation."
- name: duration_hours
in: body
type: number
description: "Duration of the DR event in hours."
steps:
- name: notify-customers
type: call
call: "whatsapp.send-broadcast"
with:
template: "demand_response"
parameters: '{"event":"{{event_id}}","region":"{{region}}","duration":"{{duration_hours}}"}'
- name: log-event
type: call
call: "sap.create-dr-event"
with:
event_id: "{{event_id}}"
region: "{{region}}"
duration: "{{duration_hours}}"
consumes:
- type: http
namespace: whatsapp
baseUri: "https://graph.facebook.com/v17.0"
authentication:
type: bearer
token: "$secrets.whatsapp_token"
resources:
- name: messages
path: "/messages"
operations:
- name: send-broadcast
method: POST
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: dr-events
path: "/demand-response/events"
operations:
- name: create-dr-event
method: POST
Tests disaster recovery at Duke Energy via failover, health checks, and reporting.
naftiko: "0.5"
info:
label: "DR Test Pipeline"
description: "Tests disaster recovery at Duke Energy 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 Duke Energy."
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.duke-energy.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.duke-energy.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://duke-energy.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 Duke Energy via Terraform, Slack, and Jira.
naftiko: "0.5"
info:
label: "Drift Detection Pipeline"
description: "Detects infrastructure drift at Duke Energy 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 Duke Energy."
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://duke-energy.com.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Retrieves Dynatrace host health metrics for data center monitoring.
naftiko: "0.5"
info:
label: "Dynatrace Infrastructure Health"
description: "Retrieves Dynatrace host health metrics for data center monitoring."
tags:
- monitoring
- dynatrace
capability:
exposes:
- type: mcp
namespace: infra-health
port: 8080
tools:
- name: get-host-health
description: "Fetch Dynatrace host health by entity ID."
inputParameters:
- name: entity_id
in: body
type: string
description: "Dynatrace host entity ID."
call: "dynatrace.get-host"
with:
entity_id: "{{entity_id}}"
consumes:
- type: http
namespace: dynatrace
baseUri: "https://duke-energy.live.dynatrace.com/api/v2"
authentication:
type: bearer
token: "$secrets.dynatrace_token"
resources:
- name: hosts
path: "/entities/{{entity_id}}"
inputParameters:
- name: entity_id
in: path
operations:
- name: get-host
method: GET
Checks ES index at Duke Energy.
naftiko: "0.5"
info:
label: "ES Index Health"
description: "Checks ES index at Duke Energy."
tags:
- search
- elasticsearch
- infrastructure
capability:
exposes:
- type: mcp
namespace: es-health
port: 8080
tools:
- name: check-index
description: "Check ES index at Duke Energy."
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.duke-energy.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 Duke Energy via Okta, Slack, ServiceNow, and storage.
naftiko: "0.5"
info:
label: "Employee Offboarding Pipeline"
description: "Offboards employees at Duke Energy 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 Duke Energy."
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://duke-energy.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://duke-energy.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.duke-energy.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 Azure AD access, and sends a welcome message in Microsoft Teams.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions Azure AD access, and sends a welcome message in Microsoft Teams."
tags:
- hr
- onboarding
- workday
- servicenow
- azure-active-directory
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Orchestrate onboarding across ServiceNow, Azure AD, and Teams."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "Employee start date YYYY-MM-DD."
- name: department
in: body
type: string
description: "Department the new hire is joining."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{worker_id}}"
- name: open-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-employee.full_name}}"
category: "hr_onboarding"
assigned_group: "IT_Onboarding"
- name: provision-ad
type: call
call: "azuread.create-user"
with:
email: "{{get-employee.work_email}}"
display_name: "{{get-employee.full_name}}"
department: "{{department}}"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-employee.work_email}}"
text: "Welcome to Duke Energy, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://duke-energy.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: azuread
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Pulls trading positions from Bloomberg AIM, validates against SAP financial records, and generates a position report in Power BI.
naftiko: "0.5"
info:
label: "Energy Trading Position Report"
description: "Pulls trading positions from Bloomberg AIM, validates against SAP financial records, and generates a position report in Power BI."
tags:
- trading
- bloomberg-aim
- sap
- power-bi
capability:
exposes:
- type: mcp
namespace: energy-trading
port: 8080
tools:
- name: generate-position-report
description: "Pull trading positions, validate, and refresh Power BI report."
inputParameters:
- name: portfolio_id
in: body
type: string
description: "The Bloomberg AIM portfolio identifier."
- name: valuation_date
in: body
type: string
description: "Valuation date YYYY-MM-DD."
steps:
- name: get-positions
type: call
call: "bloomberg-aim.get-portfolio"
with:
portfolio_id: "{{portfolio_id}}"
date: "{{valuation_date}}"
- name: validate-sap
type: call
call: "sap.get-trading-positions"
with:
portfolio_id: "{{portfolio_id}}"
date: "{{valuation_date}}"
- name: refresh-report
type: call
call: "powerbi.refresh-dataset"
with:
group_id: "energy_trading_ws"
dataset_id: "positions_dataset"
consumes:
- type: http
namespace: bloomberg-aim
baseUri: "https://api.bloomberg.com/aim/v1"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: portfolios
path: "/portfolios/{{portfolio_id}}/positions"
inputParameters:
- name: portfolio_id
in: path
operations:
- name: get-portfolio
method: GET
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: positions
path: "/trading/positions"
operations:
- name: get-trading-positions
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: group_id
in: path
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
Gathers emissions data from SCADA via Azure Databricks, cross-references against EPA limits in SAP, generates a compliance report in Crystal Reports, and files it to SharePoint.
naftiko: "0.5"
info:
label: "Environmental Compliance Reporting"
description: "Gathers emissions data from SCADA via Azure Databricks, cross-references against EPA limits in SAP, generates a compliance report in Crystal Reports, and files it to SharePoint."
tags:
- compliance
- renewable
- azure-databricks
- sap
- crystal-reports
- sharepoint
capability:
exposes:
- type: mcp
namespace: environmental-compliance
port: 8080
tools:
- name: generate-compliance-report
description: "Collect emissions data, check limits, generate and file compliance report."
inputParameters:
- name: plant_id
in: body
type: string
description: "The power plant identifier."
- name: reporting_period
in: body
type: string
description: "Reporting period (e.g., 2026-Q1)."
steps:
- name: get-emissions
type: call
call: "databricks.submit-job"
with:
job_name: "emissions_aggregation"
parameters: '{"plant":"{{plant_id}}","period":"{{reporting_period}}"}'
- name: get-limits
type: call
call: "sap.get-epa-limits"
with:
plant_id: "{{plant_id}}"
- name: generate-report
type: call
call: "crystal.generate-report"
with:
template_id: "epa_compliance"
parameters: '{"plant":"{{plant_id}}","emissions":"{{get-emissions.totals}}","limits":"{{get-limits.limits}}"}'
- name: file-report
type: call
call: "sharepoint.upload-file"
with:
site_id: "compliance_site"
folder_path: "EPA/{{plant_id}}/{{reporting_period}}"
file_name: "compliance_report.pdf"
content: "{{generate-report.output_url}}"
consumes:
- type: http
namespace: databricks
baseUri: "https://eastus.azuredatabricks.net/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/run-now"
operations:
- name: submit-job
method: POST
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: limits
path: "/compliance/epa-limits/{{plant_id}}"
inputParameters:
- name: plant_id
in: path
operations:
- name: get-epa-limits
method: GET
- type: http
namespace: crystal
baseUri: "https://reports.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.crystal_reports_token"
resources:
- name: reports
path: "/reports/generate"
operations:
- name: generate-report
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:/{{folder_path}}/{{file_name}}:/content"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
- name: file_name
in: path
operations:
- name: upload-file
method: PUT
Monitors EV charging station utilization from Azure Databricks, checks against billing records in SAP, and flags discrepancies in ServiceNow.
naftiko: "0.5"
info:
label: "EV Charging Station Monitoring"
description: "Monitors EV charging station utilization from Azure Databricks, checks against billing records in SAP, and flags discrepancies in ServiceNow."
tags:
- renewable
- billing
- azure-databricks
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: ev-charging
port: 8080
tools:
- name: monitor-charging-stations
description: "Check EV charging utilization against billing and flag discrepancies."
inputParameters:
- name: station_group
in: body
type: string
description: "EV charging station group ID."
- name: date
in: body
type: string
description: "Monitoring date YYYY-MM-DD."
steps:
- name: get-utilization
type: call
call: "databricks.submit-job"
with:
job_name: "ev_utilization_report"
parameters: '{"station_group":"{{station_group}}","date":"{{date}}"}'
- name: get-billing
type: call
call: "sap.get-ev-billing"
with:
station_group: "{{station_group}}"
date: "{{date}}"
- name: flag-discrepancies
type: call
call: "servicenow.create-task"
with:
short_description: "EV billing discrepancy: {{station_group}}"
description: "Utilization: {{get-utilization.total_kwh}} kWh. Billed: {{get-billing.billed_kwh}} kWh. Variance: {{get-utilization.variance_pct}}%."
assigned_group: "EV_Operations"
consumes:
- type: http
namespace: databricks
baseUri: "https://eastus.azuredatabricks.net/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/run-now"
operations:
- name: submit-job
method: POST
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: ev-billing
path: "/billing/ev-charges"
operations:
- name: get-ev-billing
method: GET
- type: http
namespace: servicenow
baseUri: "https://duke-energy.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Audits expenses at Duke Energy via Concur, compliance checks, and email.
naftiko: "0.5"
info:
label: "Expense Audit Pipeline"
description: "Audits expenses at Duke Energy 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 Duke Energy."
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.duke-energy.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.duke-energy.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.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
Analyzes feedback at Duke Energy via surveys, AI sentiment, and Power BI.
naftiko: "0.5"
info:
label: "Customer Feedback Pipeline"
description: "Analyzes feedback at Duke Energy 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 Duke Energy."
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.duke-energy.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 Duke Energy.
naftiko: "0.5"
info:
label: "GitHub Repo Check"
description: "Checks GitHub repo at Duke Energy."
tags:
- devops
- github
- version-control
capability:
exposes:
- type: mcp
namespace: gh-repo
port: 8080
tools:
- name: get-branch
description: "Check branch at Duke Energy."
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
Fetches a file from Google Drive for shared utility documentation.
naftiko: "0.5"
info:
label: "Google Drive Document Access"
description: "Fetches a file from Google Drive for shared utility documentation."
tags:
- content
- google-drive
capability:
exposes:
- type: mcp
namespace: drive-files
port: 8080
tools:
- name: get-drive-file
description: "Retrieve a Google Drive file by ID."
inputParameters:
- name: file_id
in: body
type: string
description: "Google Drive file ID."
call: "gdrive.get-file"
with:
file_id: "{{file_id}}"
consumes:
- type: http
namespace: gdrive
baseUri: "https://www.googleapis.com/drive/v3"
authentication:
type: bearer
token: "$secrets.google_drive_token"
resources:
- name: files
path: "/files/{{file_id}}"
inputParameters:
- name: file_id
in: path
operations:
- name: get-file
method: GET
Retrieves geospatial coordinates for grid assets from SAP and plots them on Google Maps for field operations visualization.
naftiko: "0.5"
info:
label: "Google Maps Asset Mapping"
description: "Retrieves geospatial coordinates for grid assets from SAP and plots them on Google Maps for field operations visualization."
tags:
- grid-ops
- google-maps
- sap
capability:
exposes:
- type: mcp
namespace: asset-mapping
port: 8080
tools:
- name: map-grid-assets
description: "Fetch asset locations from SAP and create Google Maps visualization."
inputParameters:
- name: region
in: body
type: string
description: "Grid region identifier."
- name: asset_type
in: body
type: string
description: "Asset type (transformer, pole, substation)."
steps:
- name: get-assets
type: call
call: "sap.get-assets"
with:
region: "{{region}}"
asset_type: "{{asset_type}}"
- name: create-map
type: call
call: "googlemaps.create-static-map"
with:
markers: "{{get-assets.coordinates}}"
zoom: "12"
consumes:
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: assets
path: "/assets/search"
operations:
- name: get-assets
method: GET
- type: http
namespace: googlemaps
baseUri: "https://maps.googleapis.com/maps/api"
authentication:
type: bearer
token: "$secrets.google_maps_key"
resources:
- name: static-maps
path: "/staticmap"
operations:
- name: create-static-map
method: GET
Checks Grafana dashboard at Duke Energy.
naftiko: "0.5"
info:
label: "Grafana Dashboard Status"
description: "Checks Grafana dashboard at Duke Energy."
tags:
- monitoring
- grafana
- dashboards
capability:
exposes:
- type: mcp
namespace: grafana
port: 8080
tools:
- name: check-dash
description: "Check dashboard at Duke Energy."
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.duke-energy.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
Runs an Azure Machine Learning model to forecast grid load for the next 24 hours, compares against current generation capacity in SAP, and alerts operations in Microsoft Teams if a shortfall is predicted.
naftiko: "0.5"
info:
label: "Grid Load Forecasting Pipeline"
description: "Runs an Azure Machine Learning model to forecast grid load for the next 24 hours, compares against current generation capacity in SAP, and alerts operations in Microsoft Teams if a shortfall is predicted."
tags:
- grid-ops
- forecasting
- azure-machine-learning
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: load-forecasting
port: 8080
tools:
- name: forecast-grid-load
description: "Run load forecast, compare to capacity, and alert on shortfalls."
inputParameters:
- name: region
in: body
type: string
description: "Grid region identifier."
- name: forecast_date
in: body
type: string
description: "Date to forecast YYYY-MM-DD."
steps:
- name: run-forecast
type: call
call: "azureml.score-model"
with:
endpoint: "load_forecast_v2"
data: '{"region":"{{region}}","date":"{{forecast_date}}"}'
- name: get-capacity
type: call
call: "sap.get-generation-capacity"
with:
region: "{{region}}"
date: "{{forecast_date}}"
- name: alert-ops
type: call
call: "msteams.send-message"
with:
channel_id: "grid_operations"
text: "Load Forecast ({{region}}, {{forecast_date}}): Peak {{run-forecast.peak_mw}} MW. Available capacity: {{get-capacity.total_mw}} MW. Margin: {{get-capacity.margin_pct}}%."
consumes:
- type: http
namespace: azureml
baseUri: "https://duke-energy-ml.eastus.inference.ml.azure.com"
authentication:
type: bearer
token: "$secrets.azureml_token"
resources:
- name: endpoints
path: "/score"
operations:
- name: score-model
method: POST
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: capacity
path: "/generation/capacity"
operations:
- name: get-generation-capacity
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Aggregates SAIDI and SAIFI reliability metrics from Azure Databricks, compares against regulatory targets in SAP, and posts a weekly summary to Microsoft Teams.
naftiko: "0.5"
info:
label: "Grid Reliability KPI Dashboard"
description: "Aggregates SAIDI and SAIFI reliability metrics from Azure Databricks, compares against regulatory targets in SAP, and posts a weekly summary to Microsoft Teams."
tags:
- grid-ops
- analytics
- azure-databricks
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: reliability-kpis
port: 8080
tools:
- name: build-reliability-summary
description: "Aggregate reliability KPIs and post weekly summary."
inputParameters:
- name: region
in: body
type: string
description: "Grid region identifier."
- name: week_ending
in: body
type: string
description: "Week ending date YYYY-MM-DD."
steps:
- name: get-metrics
type: call
call: "databricks.submit-job"
with:
job_name: "reliability_kpi_agg"
parameters: '{"region":"{{region}}","week_ending":"{{week_ending}}"}'
- name: get-targets
type: call
call: "sap.get-reliability-targets"
with:
region: "{{region}}"
- name: post-summary
type: call
call: "msteams.send-message"
with:
channel_id: "grid_reliability"
text: "Weekly Reliability ({{region}}, w/e {{week_ending}}): SAIDI {{get-metrics.saidi}} (target: {{get-targets.saidi_target}}), SAIFI {{get-metrics.saifi}} (target: {{get-targets.saifi_target}})."
consumes:
- type: http
namespace: databricks
baseUri: "https://eastus.azuredatabricks.net/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/run-now"
operations:
- name: submit-job
method: POST
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: targets
path: "/reliability/targets"
operations:
- name: get-reliability-targets
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates a HubSpot email marketing campaign for energy efficiency programs and tracks enrollment.
naftiko: "0.5"
info:
label: "HubSpot Campaign Creation"
description: "Creates a HubSpot email marketing campaign for energy efficiency programs and tracks enrollment."
tags:
- marketing
- hubspot
capability:
exposes:
- type: mcp
namespace: marketing-campaigns
port: 8080
tools:
- name: create-campaign
description: "Create a HubSpot email campaign for energy programs."
inputParameters:
- name: campaign_name
in: body
type: string
description: "Campaign name."
- name: segment_id
in: body
type: string
description: "HubSpot contact list ID."
- name: template_id
in: body
type: string
description: "Email template ID."
call: "hubspot.create-campaign"
with:
name: "{{campaign_name}}"
list_id: "{{segment_id}}"
template_id: "{{template_id}}"
consumes:
- type: http
namespace: hubspot
baseUri: "https://api.hubapi.com"
authentication:
type: bearer
token: "$secrets.hubspot_token"
resources:
- name: campaigns
path: "/marketing/v3/campaigns"
operations:
- name: create-campaign
method: POST
Escalates IT incidents at Duke Energy via ServiceNow, PagerDuty, and Slack.
naftiko: "0.5"
info:
label: "IT Incident Escalation Pipeline"
description: "Escalates IT incidents at Duke Energy 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 Duke Energy."
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://duke-energy.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 Duke Energy.
naftiko: "0.5"
info:
label: "Jira Sprint Progress Lookup"
description: "Retrieves sprint progress at Duke Energy."
tags:
- project-management
- jira
- agile
capability:
exposes:
- type: mcp
namespace: jira-sprint
port: 8080
tools:
- name: get-sprint
description: "Look up sprint at Duke Energy."
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://duke-energy.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 Duke Energy by finding stale articles and notifying owners.
naftiko: "0.5"
info:
label: "Knowledge Base Maintenance Pipeline"
description: "Maintains KB at Duke Energy 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 Duke Energy."
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://duke-energy.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.duke-energy.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 Duke Energy from Snowflake, Oracle, Power BI, and email.
naftiko: "0.5"
info:
label: "Weekly KPI Digest Pipeline"
description: "Generates KPI digest at Duke Energy 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 Duke Energy."
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://duke-energy.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.duke-energy.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.duke-energy.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 Duke Energy.
naftiko: "0.5"
info:
label: "K8s Pod Health"
description: "Checks K8s pod health at Duke Energy."
tags:
- containers
- kubernetes
- infrastructure
capability:
exposes:
- type: mcp
namespace: k8s-pod
port: 8080
tools:
- name: check-pod
description: "Check pod at Duke Energy."
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.duke-energy.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
Checks license compliance at Duke Energy via scanning, entitlements, and procurement.
naftiko: "0.5"
info:
label: "License Compliance Pipeline"
description: "Checks license compliance at Duke Energy 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 Duke Energy."
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.duke-energy.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.duke-energy.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.duke-energy.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://duke-energy.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
Collects smart meter readings via Azure IoT Hub, processes through Azure Databricks, stores in SAP billing, and flags anomalies to ServiceNow for investigation.
naftiko: "0.5"
info:
label: "Meter Data Collection Pipeline"
description: "Collects smart meter readings via Azure IoT Hub, processes through Azure Databricks, stores in SAP billing, and flags anomalies to ServiceNow for investigation."
tags:
- billing
- grid-ops
- azure-databricks
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: meter-data
port: 8080
tools:
- name: process-meter-readings
description: "Collect meter data, process analytics, store in billing, and flag anomalies."
inputParameters:
- name: meter_group_id
in: body
type: string
description: "The meter group identifier."
- name: collection_date
in: body
type: string
description: "Data collection date YYYY-MM-DD."
steps:
- name: process-data
type: call
call: "databricks.submit-job"
with:
job_name: "meter_data_processing"
parameters: '{"meter_group":"{{meter_group_id}}","date":"{{collection_date}}"}'
- name: update-billing
type: call
call: "sap.update-meter-reads"
with:
meter_group_id: "{{meter_group_id}}"
readings: "{{process-data.validated_readings}}"
- name: flag-anomalies
type: call
call: "servicenow.create-task"
with:
short_description: "Meter anomalies: {{meter_group_id}} on {{collection_date}}"
description: "Anomalies detected: {{process-data.anomaly_count}} meters flagged. Details: {{process-data.anomaly_summary}}"
assigned_group: "Meter_Operations"
consumes:
- type: http
namespace: databricks
baseUri: "https://eastus.azuredatabricks.net/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/run-now"
operations:
- name: submit-job
method: POST
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: meters
path: "/meters/readings"
operations:
- name: update-meter-reads
method: POST
- type: http
namespace: servicenow
baseUri: "https://duke-energy.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Checks device compliance status in Microsoft Endpoint Manager and returns compliance state, OS version, and last check-in.
naftiko: "0.5"
info:
label: "Microsoft Endpoint Manager Device Compliance"
description: "Checks device compliance status in Microsoft Endpoint Manager and returns compliance state, OS version, and last check-in."
tags:
- security
- microsoft-endpoint-manager
capability:
exposes:
- type: mcp
namespace: device-compliance
port: 8080
tools:
- name: check-device-compliance
description: "Check Intune device compliance by device ID."
inputParameters:
- name: device_id
in: body
type: string
description: "The Intune managed device ID."
call: "intune.get-device-compliance"
with:
device_id: "{{device_id}}"
consumes:
- type: http
namespace: intune
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: devices
path: "/deviceManagement/managedDevices/{{device_id}}"
inputParameters:
- name: device_id
in: path
operations:
- name: get-device-compliance
method: GET
Pulls project schedules from Microsoft Project, maps milestones to ServiceNow change requests, and notifies stakeholders via Microsoft Teams.
naftiko: "0.5"
info:
label: "Microsoft Project Schedule Sync"
description: "Pulls project schedules from Microsoft Project, maps milestones to ServiceNow change requests, and notifies stakeholders via Microsoft Teams."
tags:
- project-management
- microsoft-project
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: project-sync
port: 8080
tools:
- name: sync-project-milestones
description: "Sync Microsoft Project milestones to ServiceNow and notify teams."
inputParameters:
- name: project_id
in: body
type: string
description: "The Microsoft Project project ID."
- name: channel_id
in: body
type: string
description: "Teams channel for notifications."
steps:
- name: get-milestones
type: call
call: "msproject.get-tasks"
with:
project_id: "{{project_id}}"
filter: "milestones"
- name: create-change-request
type: call
call: "servicenow.create-change"
with:
short_description: "Project milestone: {{get-milestones.next_milestone}}"
planned_start: "{{get-milestones.next_start_date}}"
assigned_group: "Change_Management"
- name: notify-stakeholders
type: call
call: "msteams.send-message"
with:
channel_id: "{{channel_id}}"
text: "Upcoming milestone: {{get-milestones.next_milestone}} on {{get-milestones.next_start_date}}. Change: {{create-change-request.number}}"
consumes:
- type: http
namespace: msproject
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: tasks
path: "/planner/plans/{{project_id}}/tasks"
inputParameters:
- name: project_id
in: path
operations:
- name: get-tasks
method: GET
- type: http
namespace: servicenow
baseUri: "https://duke-energy.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Generates monthly security reports at Duke Energy from Splunk and Qualys.
naftiko: "0.5"
info:
label: "Monthly Security Report Pipeline"
description: "Generates monthly security reports at Duke Energy 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 Duke Energy."
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.duke-energy.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.duke-energy.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.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
Onboards employees at Duke Energy with Okta, ServiceNow, Slack, and calendar.
naftiko: "0.5"
info:
label: "New Employee IT Onboarding Pipeline"
description: "Onboards employees at Duke Energy 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 Duke Energy."
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://duke-energy.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://duke-energy.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 Duke Energy.
naftiko: "0.5"
info:
label: "New Relic APM Check"
description: "Checks New Relic APM at Duke Energy."
tags:
- monitoring
- new-relic
- apm
capability:
exposes:
- type: mcp
namespace: nr-apm
port: 8080
tools:
- name: check-apm
description: "Check APM at Duke Energy."
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
Retrieves application performance metrics from New Relic for grid management system monitoring.
naftiko: "0.5"
info:
label: "New Relic Application Performance"
description: "Retrieves application performance metrics from New Relic for grid management system monitoring."
tags:
- monitoring
- new-relic
capability:
exposes:
- type: mcp
namespace: apm
port: 8080
tools:
- name: get-app-performance
description: "Fetch New Relic APM metrics for an application."
inputParameters:
- name: app_id
in: body
type: string
description: "New Relic application ID."
call: "newrelic.get-app-metrics"
with:
app_id: "{{app_id}}"
consumes:
- type: http
namespace: newrelic
baseUri: "https://api.newrelic.com/v2"
authentication:
type: bearer
token: "$secrets.newrelic_api_key"
resources:
- name: applications
path: "/applications/{{app_id}}/metrics/data.json"
inputParameters:
- name: app_id
in: path
operations:
- name: get-app-metrics
method: GET
Pulls maintenance schedules from SAP Plant Maintenance, checks inspector availability in Workday, creates ServiceNow work orders, and notifies the nuclear safety team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Nuclear Plant Maintenance Scheduling"
description: "Pulls maintenance schedules from SAP Plant Maintenance, checks inspector availability in Workday, creates ServiceNow work orders, and notifies the nuclear safety team in Microsoft Teams."
tags:
- safety
- maintenance
- sap
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: nuclear-maintenance
port: 8080
tools:
- name: schedule-maintenance
description: "Schedule nuclear plant maintenance with inspector assignment and notifications."
inputParameters:
- name: plant_id
in: body
type: string
description: "The nuclear plant identifier."
- name: work_type
in: body
type: string
description: "Maintenance work type."
- name: scheduled_date
in: body
type: string
description: "Scheduled maintenance date YYYY-MM-DD."
steps:
- name: get-schedule
type: call
call: "sap.get-maintenance-schedule"
with:
plant_id: "{{plant_id}}"
work_type: "{{work_type}}"
- name: check-inspector
type: call
call: "workday.get-available-inspector"
with:
skill: "nuclear_{{work_type}}"
date: "{{scheduled_date}}"
- name: create-work-order
type: call
call: "servicenow.create-task"
with:
short_description: "Nuclear maintenance: {{work_type}} at {{plant_id}}"
description: "Inspector: {{check-inspector.full_name}}. Schedule: {{get-schedule.details}}."
assigned_group: "Nuclear_Maintenance"
due_date: "{{scheduled_date}}"
- name: notify-safety-team
type: call
call: "msteams.send-message"
with:
channel_id: "nuclear_safety"
text: "Maintenance scheduled: {{work_type}} at {{plant_id}} on {{scheduled_date}}. Inspector: {{check-inspector.full_name}}. WO: {{create-work-order.number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: maintenance
path: "/plant-maintenance/schedules"
operations:
- name: get-maintenance-schedule
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: inspectors
path: "/workers/search"
operations:
- name: get-available-inspector
method: POST
- type: http
namespace: servicenow
baseUri: "https://duke-energy.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks Okta user at Duke Energy.
naftiko: "0.5"
info:
label: "Okta User Check"
description: "Checks Okta user at Duke Energy."
tags:
- identity
- okta
- access-management
capability:
exposes:
- type: mcp
namespace: okta-user
port: 8080
tools:
- name: check-user
description: "Check user at Duke Energy."
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://duke-energy.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
Retrieves cost and usage data from Oracle Cloud for a specified compartment and date range.
naftiko: "0.5"
info:
label: "Oracle Cloud Cost Reporting"
description: "Retrieves cost and usage data from Oracle Cloud for a specified compartment and date range."
tags:
- finance
- cloud
- oracle-cloud
capability:
exposes:
- type: mcp
namespace: cloud-costs
port: 8080
tools:
- name: get-cloud-costs
description: "Fetch Oracle Cloud cost and usage data."
inputParameters:
- name: compartment_id
in: body
type: string
description: "Oracle Cloud compartment OCID."
- name: start_date
in: body
type: string
description: "Start date YYYY-MM-DD."
- name: end_date
in: body
type: string
description: "End date YYYY-MM-DD."
call: "oraclecloud.get-usage"
with:
compartment_id: "{{compartment_id}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
consumes:
- type: http
namespace: oraclecloud
baseUri: "https://usageapi.us-ashburn-1.oci.oraclecloud.com/20200107"
authentication:
type: bearer
token: "$secrets.oracle_cloud_token"
resources:
- name: usage
path: "/usage"
operations:
- name: get-usage
method: POST
Retrieves an invoice from Oracle Integration by invoice number.
naftiko: "0.5"
info:
label: "Oracle Integration Invoice Lookup"
description: "Retrieves an invoice from Oracle Integration by invoice number."
tags:
- finance
- oracle-integration
capability:
exposes:
- type: mcp
namespace: ap-invoices
port: 8080
tools:
- name: get-invoice
description: "Fetch an Oracle Integration invoice by number."
inputParameters:
- name: invoice_number
in: body
type: string
description: "Invoice number."
call: "oracle-integration.get-invoice"
with:
invoice_number: "{{invoice_number}}"
consumes:
- type: http
namespace: oracle-integration
baseUri: "https://oracle.duke-energy.com/ic/api/integration/v1"
authentication:
type: bearer
token: "$secrets.oracle_integration_token"
resources:
- name: invoices
path: "/invoices/{{invoice_number}}"
inputParameters:
- name: invoice_number
in: path
operations:
- name: get-invoice
method: GET
When a SolarWinds grid monitoring alert fires, creates a ServiceNow incident, dispatches a crew via Microsoft Power Automate, and notifies affected customers through WhatsApp.
naftiko: "0.5"
info:
label: "Outage Detection and Response Orchestrator"
description: "When a SolarWinds grid monitoring alert fires, creates a ServiceNow incident, dispatches a crew via Microsoft Power Automate, and notifies affected customers through WhatsApp."
tags:
- grid-ops
- outage
- solarwinds
- servicenow
- microsoft-power-automate
- whatsapp
capability:
exposes:
- type: mcp
namespace: outage-response
port: 8080
tools:
- name: handle-outage-alert
description: "On grid outage alert, create incident, dispatch crew, and notify customers."
inputParameters:
- name: alert_id
in: body
type: string
description: "The SolarWinds alert identifier."
- name: feeder_id
in: body
type: string
description: "The affected distribution feeder ID."
- name: estimated_customers
in: body
type: number
description: "Estimated number of affected customers."
steps:
- name: get-alert
type: call
call: "solarwinds.get-alert"
with:
alert_id: "{{alert_id}}"
- name: create-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Grid outage: Feeder {{feeder_id}} — {{get-alert.message}}"
severity: "1"
assigned_group: "Distribution_Ops"
description: "Outage detected on feeder {{feeder_id}}. Affected customers: {{estimated_customers}}. Alert: {{get-alert.message}}"
- name: dispatch-crew
type: call
call: "powerautomate.trigger-flow"
with:
flow_id: "crew_dispatch"
parameters: '{"feeder":"{{feeder_id}}","incident":"{{create-incident.number}}","priority":"critical"}'
- name: notify-customers
type: call
call: "whatsapp.send-broadcast"
with:
template: "outage_notification"
parameters: '{"feeder":"{{feeder_id}}","estimated_restore":"{{get-alert.estimated_restore}}"}'
consumes:
- type: http
namespace: solarwinds
baseUri: "https://solarwinds.duke-energy.com:17778/SolarWinds/InformationService/v3/Json"
authentication:
type: basic
username: "$secrets.solarwinds_user"
password: "$secrets.solarwinds_password"
resources:
- name: alerts
path: "/Query"
operations:
- name: get-alert
method: POST
- type: http
namespace: servicenow
baseUri: "https://duke-energy.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: powerautomate
baseUri: "https://prod-00.eastus.logic.azure.com/workflows"
authentication:
type: bearer
token: "$secrets.power_automate_token"
resources:
- name: flows
path: "/{{flow_id}}/triggers/manual/paths/invoke"
inputParameters:
- name: flow_id
in: path
operations:
- name: trigger-flow
method: POST
- type: http
namespace: whatsapp
baseUri: "https://graph.facebook.com/v17.0"
authentication:
type: bearer
token: "$secrets.whatsapp_token"
resources:
- name: messages
path: "/messages"
operations:
- name: send-broadcast
method: POST
Checks on-call at Duke Energy.
naftiko: "0.5"
info:
label: "PagerDuty On-Call Check"
description: "Checks on-call at Duke Energy."
tags:
- incident-management
- pagerduty
- on-call
capability:
exposes:
- type: mcp
namespace: pd-oncall
port: 8080
tools:
- name: get-oncall
description: "Check on-call at Duke Energy."
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
Queries Palo Alto Networks firewall for active rules by zone and returns matching security policies.
naftiko: "0.5"
info:
label: "Palo Alto Networks Firewall Rule Lookup"
description: "Queries Palo Alto Networks firewall for active rules by zone and returns matching security policies."
tags:
- security
- palo-alto-networks
capability:
exposes:
- type: mcp
namespace: firewall-mgmt
port: 8080
tools:
- name: get-firewall-rules
description: "Fetch Palo Alto firewall rules for a specific zone."
inputParameters:
- name: zone_name
in: body
type: string
description: "The firewall zone name."
call: "paloalto.get-rules"
with:
zone: "{{zone_name}}"
consumes:
- type: http
namespace: paloalto
baseUri: "https://firewall.duke-energy.com/restapi/v10.1"
authentication:
type: bearer
token: "$secrets.paloalto_token"
resources:
- name: rules
path: "/Policies/SecurityRules"
operations:
- name: get-rules
method: GET
Assigns a Pluralsight learning path to employees by department from Workday and tracks completion.
naftiko: "0.5"
info:
label: "Pluralsight Training Assignment"
description: "Assigns a Pluralsight learning path to employees by department from Workday and tracks completion."
tags:
- learning
- pluralsight
- workday
capability:
exposes:
- type: mcp
namespace: training
port: 8080
tools:
- name: assign-training
description: "Assign a Pluralsight learning path to a department."
inputParameters:
- name: department_id
in: body
type: string
description: "Workday department identifier."
- name: path_id
in: body
type: string
description: "Pluralsight learning path ID."
steps:
- name: get-department
type: call
call: "workday.get-department"
with:
department_id: "{{department_id}}"
- name: assign-path
type: call
call: "pluralsight.assign-path"
with:
path_id: "{{path_id}}"
emails: "{{get-department.employee_emails}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: departments
path: "/departments/{{department_id}}"
inputParameters:
- name: department_id
in: path
operations:
- name: get-department
method: GET
- type: http
namespace: pluralsight
baseUri: "https://api.pluralsight.com/v1"
authentication:
type: bearer
token: "$secrets.pluralsight_token"
resources:
- name: assignments
path: "/assignments"
operations:
- name: assign-path
method: POST
Creates postmortems at Duke Energy.
naftiko: "0.5"
info:
label: "Incident Postmortem Pipeline"
description: "Creates postmortems at Duke Energy."
tags:
- incident-management
- postmortem
- pagerduty
- confluence
capability:
exposes:
- type: mcp
namespace: postmortem
port: 8080
tools:
- name: create-postmortem
description: "Create postmortem at Duke Energy."
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://duke-energy.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 Duke Energy.
naftiko: "0.5"
info:
label: "Power BI Refresh Check"
description: "Checks Power BI refresh at Duke Energy."
tags:
- analytics
- power-bi
- dashboards
capability:
exposes:
- type: mcp
namespace: pbi-refresh
port: 8080
tools:
- name: check-refresh
description: "Check refresh at Duke Energy."
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
Triggers a Power BI dataset refresh and returns the refresh status for operational dashboards.
naftiko: "0.5"
info:
label: "Power BI Report Refresh"
description: "Triggers a Power BI dataset refresh and returns the refresh status for operational dashboards."
tags:
- analytics
- power-bi
capability:
exposes:
- type: mcp
namespace: bi-refresh
port: 8080
tools:
- name: refresh-dataset
description: "Trigger a Power BI dataset refresh by group and dataset ID."
inputParameters:
- name: group_id
in: body
type: string
description: "The Power BI workspace/group ID."
- name: dataset_id
in: body
type: string
description: "The Power BI dataset ID."
call: "powerbi.refresh-dataset"
with:
group_id: "{{group_id}}"
dataset_id: "{{dataset_id}}"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: group_id
in: path
- name: dataset_id
in: path
operations:
- name: refresh-dataset
method: POST
Triggers a Qlik Sense app reload for operational reporting dashboards and returns the reload status.
naftiko: "0.5"
info:
label: "Qlik Sense Dashboard Refresh"
description: "Triggers a Qlik Sense app reload for operational reporting dashboards and returns the reload status."
tags:
- analytics
- qlik-sense
capability:
exposes:
- type: mcp
namespace: qlik-ops
port: 8080
tools:
- name: reload-app
description: "Trigger a Qlik Sense app reload by app ID."
inputParameters:
- name: app_id
in: body
type: string
description: "The Qlik Sense app identifier."
call: "qlik.reload-app"
with:
app_id: "{{app_id}}"
consumes:
- type: http
namespace: qlik
baseUri: "https://qlik.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.qlik_token"
resources:
- name: reloads
path: "/reloads"
operations:
- name: reload-app
method: POST
Generates compliance reports at Duke Energy from Snowflake, Power BI, and email.
naftiko: "0.5"
info:
label: "Quarterly Compliance Report Pipeline"
description: "Generates compliance reports at Duke Energy 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 Duke Energy."
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://duke-energy.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.duke-energy.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.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.email_token"
resources:
- name: messages
path: "/send"
operations:
- name: send
method: POST
Pulls financial data from SAP, runs rate case modeling in MATLAB, generates a Crystal Reports output, and distributes to regulatory team via SharePoint and Microsoft Teams.
naftiko: "0.5"
info:
label: "Rate Case Financial Analysis"
description: "Pulls financial data from SAP, runs rate case modeling in MATLAB, generates a Crystal Reports output, and distributes to regulatory team via SharePoint and Microsoft Teams."
tags:
- billing
- regulatory
- sap
- matlab
- crystal-reports
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: rate-case
port: 8080
tools:
- name: run-rate-case-analysis
description: "Pull financials, run rate model, generate report, and distribute."
inputParameters:
- name: case_id
in: body
type: string
description: "The rate case identifier."
- name: fiscal_year
in: body
type: string
description: "Fiscal year for analysis."
steps:
- name: get-financials
type: call
call: "sap.get-financial-data"
with:
case_id: "{{case_id}}"
year: "{{fiscal_year}}"
- name: run-model
type: call
call: "matlab.execute-script"
with:
script: "rate_case_model"
parameters: '{"revenue":"{{get-financials.revenue}}","costs":"{{get-financials.costs}}","rate_base":"{{get-financials.rate_base}}"}'
- name: generate-report
type: call
call: "crystal.generate-report"
with:
template_id: "rate_case_analysis"
parameters: '{"case":"{{case_id}}","results":"{{run-model.output}}"}'
- name: upload-report
type: call
call: "sharepoint.upload-file"
with:
site_id: "regulatory_site"
folder_path: "RateCases/{{case_id}}"
file_name: "analysis_{{fiscal_year}}.pdf"
content: "{{generate-report.output_url}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "regulatory_team"
text: "Rate case analysis ready: {{case_id}} (FY{{fiscal_year}}). ROE: {{run-model.roe_pct}}%. Download: {{upload-report.url}}"
consumes:
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: financials
path: "/financials/rate-case"
operations:
- name: get-financial-data
method: GET
- type: http
namespace: matlab
baseUri: "https://matlab.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.matlab_token"
resources:
- name: scripts
path: "/execute"
operations:
- name: execute-script
method: POST
- type: http
namespace: crystal
baseUri: "https://reports.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.crystal_reports_token"
resources:
- name: reports
path: "/reports/generate"
operations:
- name: generate-report
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:/{{folder_path}}/{{file_name}}:/content"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
- name: file_name
in: path
operations:
- name: upload-file
method: PUT
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks Redis at Duke Energy.
naftiko: "0.5"
info:
label: "Redis Cache Status"
description: "Checks Redis at Duke Energy."
tags:
- caching
- redis
- infrastructure
capability:
exposes:
- type: mcp
namespace: redis
port: 8080
tools:
- name: check-cache
description: "Check Redis at Duke Energy."
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.duke-energy.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
Checks release readiness at Duke Energy.
naftiko: "0.5"
info:
label: "Release Readiness Pipeline"
description: "Checks release readiness at Duke Energy."
tags:
- release-management
- devops
- quality
capability:
exposes:
- type: mcp
namespace: release-ready
port: 8080
tools:
- name: check-release
description: "Check release at Duke Energy."
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/duke-energy.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.duke-energy.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.duke-energy.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://duke-energy.com.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
Aggregates solar and wind generation data from SCADA systems via Azure Databricks, merges with weather forecasts from an external API, and posts a daily generation summary to Microsoft Teams.
naftiko: "0.5"
info:
label: "Renewable Energy Generation Dashboard"
description: "Aggregates solar and wind generation data from SCADA systems via Azure Databricks, merges with weather forecasts from an external API, and posts a daily generation summary to Microsoft Teams."
tags:
- renewable
- generation
- azure-databricks
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: renewable-dashboard
port: 8080
tools:
- name: build-generation-summary
description: "Aggregate renewable generation data and post daily summary to Teams."
inputParameters:
- name: date
in: body
type: string
description: "Summary date YYYY-MM-DD."
- name: region
in: body
type: string
description: "Grid region identifier."
steps:
- name: get-generation-data
type: call
call: "databricks.submit-job"
with:
job_name: "renewable_generation_agg"
parameters: '{"date":"{{date}}","region":"{{region}}"}'
- name: get-weather
type: call
call: "weather.get-forecast"
with:
region: "{{region}}"
date: "{{date}}"
- name: post-summary
type: call
call: "msteams.send-message"
with:
channel_id: "renewable_ops"
text: "Renewable Generation ({{date}}, {{region}}): Solar {{get-generation-data.solar_mwh}} MWh, Wind {{get-generation-data.wind_mwh}} MWh. Weather: {{get-weather.condition}}, {{get-weather.wind_speed}} mph."
consumes:
- type: http
namespace: databricks
baseUri: "https://eastus.azuredatabricks.net/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/run-now"
operations:
- name: submit-job
method: POST
- type: http
namespace: weather
baseUri: "https://api.weather.gov"
authentication:
type: bearer
token: "$secrets.weather_api_token"
resources:
- name: forecasts
path: "/gridpoints/{{region}}/forecast"
inputParameters:
- name: region
in: path
operations:
- name: get-forecast
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates a safety inspection record in ServiceNow, assigns a field inspector via Workday org data, uploads the inspection form from Google Forms to SharePoint, and notifies the safety team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Safety Inspection Orchestrator"
description: "Creates a safety inspection record in ServiceNow, assigns a field inspector via Workday org data, uploads the inspection form from Google Forms to SharePoint, and notifies the safety team in Microsoft Teams."
tags:
- safety
- servicenow
- workday
- google-forms
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: safety-inspections
port: 8080
tools:
- name: schedule-inspection
description: "Create inspection record, assign inspector, store forms, and notify the team."
inputParameters:
- name: facility_id
in: body
type: string
description: "The facility identifier for inspection."
- name: inspection_type
in: body
type: string
description: "Type of safety inspection."
- name: due_date
in: body
type: string
description: "Inspection due date YYYY-MM-DD."
steps:
- name: create-record
type: call
call: "servicenow.create-task"
with:
short_description: "Safety inspection: {{inspection_type}} at {{facility_id}}"
category: "safety_inspection"
assigned_group: "Safety_Ops"
due_date: "{{due_date}}"
- name: get-inspector
type: call
call: "workday.get-available-inspector"
with:
facility_id: "{{facility_id}}"
inspection_type: "{{inspection_type}}"
- name: get-form
type: call
call: "gforms.get-form"
with:
form_id: "inspection_{{inspection_type}}"
- name: upload-form
type: call
call: "sharepoint.upload-file"
with:
site_id: "safety_site"
folder_path: "Inspections/{{facility_id}}/{{due_date}}"
file_name: "inspection_form.pdf"
content: "{{get-form.pdf_url}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "safety_team"
text: "Inspection scheduled: {{inspection_type}} at {{facility_id}} on {{due_date}}. Inspector: {{get-inspector.full_name}}. Task: {{create-record.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://duke-energy.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: inspectors
path: "/workers/search"
operations:
- name: get-available-inspector
method: POST
- type: http
namespace: gforms
baseUri: "https://forms.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.google_forms_token"
resources:
- name: forms
path: "/forms/{{form_id}}"
inputParameters:
- name: form_id
in: path
operations:
- name: get-form
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:/{{folder_path}}/{{file_name}}:/content"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
- name: file_name
in: path
operations:
- name: upload-file
method: PUT
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Synchronizes customer account data from SAP to Salesforce CRM and updates the account team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Customer Account Sync"
description: "Synchronizes customer account data from SAP to Salesforce CRM and updates the account team in Microsoft Teams."
tags:
- crm
- salesforce
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: crm-sync
port: 8080
tools:
- name: sync-customer-account
description: "Sync a SAP customer to Salesforce and notify the account team."
inputParameters:
- name: sap_account_id
in: body
type: string
description: "The SAP customer account ID."
steps:
- name: get-customer
type: call
call: "sap.get-customer-detail"
with:
account_id: "{{sap_account_id}}"
- name: upsert-salesforce
type: call
call: "salesforce.upsert-account"
with:
external_id: "{{sap_account_id}}"
name: "{{get-customer.name}}"
address: "{{get-customer.address}}"
type: "{{get-customer.account_type}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "account_mgmt"
text: "Customer sync: {{get-customer.name}} (SAP: {{sap_account_id}}) updated in Salesforce. SF ID: {{upsert-salesforce.id}}"
consumes:
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: customers
path: "/customers/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-customer-detail
method: GET
- type: http
namespace: salesforce
baseUri: "https://duke-energy.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account"
operations:
- name: upsert-account
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks SAP PO at Duke Energy.
naftiko: "0.5"
info:
label: "SAP PO Check"
description: "Checks SAP PO at Duke Energy."
tags:
- procurement
- sap
- purchase-orders
capability:
exposes:
- type: mcp
namespace: sap-po
port: 8080
tools:
- name: get-po
description: "Check PO at Duke Energy."
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.duke-energy.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 purchase order by number and returns header status, vendor, total value, and delivery date.
naftiko: "0.5"
info:
label: "SAP Purchase Order Status"
description: "Looks up a SAP purchase order by number and returns header status, vendor, total value, and delivery date."
tags:
- procurement
- sap
capability:
exposes:
- type: mcp
namespace: procurement
port: 8080
tools:
- name: get-purchase-order
description: "Look up a SAP purchase order by PO number."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number."
call: "sap.get-po"
with:
po_number: "{{po_number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
Remediates vulnerabilities at Duke Energy via scanning, Jira, and Slack.
naftiko: "0.5"
info:
label: "Security Vulnerability Remediation Pipeline"
description: "Remediates vulnerabilities at Duke Energy 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 Duke Energy."
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.duke-energy.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://duke-energy.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 Duke Energy.
naftiko: "0.5"
info:
label: "ServiceNow Incident Detail Check"
description: "Checks IT incident in ServiceNow for Duke Energy."
tags:
- it-service
- servicenow
- incident-management
capability:
exposes:
- type: mcp
namespace: snow-incident
port: 8080
tools:
- name: check-incident
description: "Check incident at Duke Energy."
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://duke-energy.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 the current status of a ServiceNow incident by number including priority, assignment group, and resolution notes.
naftiko: "0.5"
info:
label: "ServiceNow Incident Status"
description: "Retrieves the current status of a ServiceNow incident by number including priority, assignment group, and resolution notes."
tags:
- operations
- servicenow
capability:
exposes:
- type: mcp
namespace: incident-mgmt
port: 8080
tools:
- name: get-incident-status
description: "Fetch a ServiceNow incident by number."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number."
call: "servicenow.get-incident"
with:
number: "{{incident_number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://duke-energy.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
Fetches a document from a SharePoint site by path and returns file metadata and download URL.
naftiko: "0.5"
info:
label: "SharePoint Document Retrieval"
description: "Fetches a document from a SharePoint site by path and returns file metadata and download URL."
tags:
- content
- sharepoint
capability:
exposes:
- type: mcp
namespace: document-mgmt
port: 8080
tools:
- name: get-document
description: "Retrieve a SharePoint document by site and file path."
inputParameters:
- name: site_id
in: body
type: string
description: "The SharePoint site identifier."
- name: file_path
in: body
type: string
description: "Path to the document."
call: "sharepoint.get-file"
with:
site_id: "{{site_id}}"
file_path: "{{file_path}}"
consumes:
- 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}}"
inputParameters:
- name: site_id
in: path
- name: file_path
in: path
operations:
- name: get-file
method: GET
Retrieves SharePoint metadata at Duke Energy.
naftiko: "0.5"
info:
label: "SharePoint File Metadata"
description: "Retrieves SharePoint metadata at Duke Energy."
tags:
- document-management
- sharepoint
- collaboration
capability:
exposes:
- type: mcp
namespace: sp-docs
port: 8080
tools:
- name: get-file
description: "Look up file at Duke Energy."
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
Monitors SLAs at Duke Energy via Datadog and Slack.
naftiko: "0.5"
info:
label: "SLA Monitoring Pipeline"
description: "Monitors SLAs at Duke Energy 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 Duke Energy."
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://duke-energy.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
Collects solar panel telemetry from Azure Databricks, compares against expected output from the weather API, and flags underperforming arrays in ServiceNow.
naftiko: "0.5"
info:
label: "Solar Panel Performance Monitoring"
description: "Collects solar panel telemetry from Azure Databricks, compares against expected output from the weather API, and flags underperforming arrays in ServiceNow."
tags:
- renewable
- monitoring
- azure-databricks
- servicenow
capability:
exposes:
- type: mcp
namespace: solar-monitoring
port: 8080
tools:
- name: monitor-solar-performance
description: "Analyze solar panel output against expected levels and flag issues."
inputParameters:
- name: array_id
in: body
type: string
description: "The solar array identifier."
- name: date
in: body
type: string
description: "Monitoring date YYYY-MM-DD."
steps:
- name: get-telemetry
type: call
call: "databricks.submit-job"
with:
job_name: "solar_telemetry_agg"
parameters: '{"array":"{{array_id}}","date":"{{date}}"}'
- name: get-expected
type: call
call: "weather.get-solar-irradiance"
with:
location: "{{array_id}}"
date: "{{date}}"
- name: flag-underperformance
type: call
call: "servicenow.create-task"
with:
short_description: "Solar underperformance: Array {{array_id}}"
description: "Actual: {{get-telemetry.output_kwh}} kWh vs Expected: {{get-expected.expected_kwh}} kWh. Efficiency: {{get-telemetry.efficiency_pct}}%."
assigned_group: "Solar_Operations"
consumes:
- type: http
namespace: databricks
baseUri: "https://eastus.azuredatabricks.net/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/run-now"
operations:
- name: submit-job
method: POST
- type: http
namespace: weather
baseUri: "https://api.weather.gov"
authentication:
type: bearer
token: "$secrets.weather_api_token"
resources:
- name: solar
path: "/gridpoints/{{location}}/forecast"
inputParameters:
- name: location
in: path
operations:
- name: get-solar-irradiance
method: GET
- type: http
namespace: servicenow
baseUri: "https://duke-energy.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Retrieves the current health status of a SolarWinds monitored node including CPU, memory, and interface metrics.
naftiko: "0.5"
info:
label: "SolarWinds Node Status"
description: "Retrieves the current health status of a SolarWinds monitored node including CPU, memory, and interface metrics."
tags:
- monitoring
- solarwinds
capability:
exposes:
- type: mcp
namespace: node-monitoring
port: 8080
tools:
- name: get-node-status
description: "Fetch SolarWinds node health status."
inputParameters:
- name: node_id
in: body
type: string
description: "The SolarWinds node identifier."
call: "solarwinds.get-node"
with:
node_id: "{{node_id}}"
consumes:
- type: http
namespace: solarwinds
baseUri: "https://solarwinds.duke-energy.com:17778/SolarWinds/InformationService/v3/Json"
authentication:
type: basic
username: "$secrets.solarwinds_user"
password: "$secrets.solarwinds_password"
resources:
- name: nodes
path: "/Query"
operations:
- name: get-node
method: POST
Exports a Sparx EA architecture model package and uploads it to SharePoint.
naftiko: "0.5"
info:
label: "Sparx Enterprise Architect Model Export"
description: "Exports a Sparx EA architecture model package and uploads it to SharePoint."
tags:
- architecture
- sparx-enterprise-architect
- sharepoint
capability:
exposes:
- type: mcp
namespace: architecture-models
port: 8080
tools:
- name: export-model
description: "Export a Sparx EA model and store in SharePoint."
inputParameters:
- name: package_id
in: body
type: string
description: "The Sparx EA package GUID."
- name: output_folder
in: body
type: string
description: "SharePoint folder for the export."
steps:
- name: export-package
type: call
call: "sparxea.export-package"
with:
package_id: "{{package_id}}"
- name: upload-export
type: call
call: "sharepoint.upload-file"
with:
site_id: "architecture_site"
folder_path: "{{output_folder}}"
file_name: "{{export-package.file_name}}"
content: "{{export-package.xmi_url}}"
consumes:
- type: http
namespace: sparxea
baseUri: "https://sparxea.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.sparxea_token"
resources:
- name: packages
path: "/packages/{{package_id}}/export"
inputParameters:
- name: package_id
in: path
operations:
- name: export-package
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:/{{folder_path}}/{{file_name}}:/content"
inputParameters:
- name: site_id
in: path
- name: folder_path
in: path
- name: file_name
in: path
operations:
- name: upload-file
method: PUT
Searches Splunk at Duke Energy.
naftiko: "0.5"
info:
label: "Splunk Log Search"
description: "Searches Splunk at Duke Energy."
tags:
- security
- splunk
- logging
capability:
exposes:
- type: mcp
namespace: splunk-search
port: 8080
tools:
- name: search-logs
description: "Search logs at Duke Energy."
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.duke-energy.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search
path: "/search/jobs"
operations:
- name: search
method: POST
When a severe weather alert triggers, pulls outage predictions from Azure ML, pre-positions crews via Microsoft Power Automate, stocks materials in SAP, and broadcasts customer alerts through WhatsApp and Twitter.
naftiko: "0.5"
info:
label: "Storm Response Coordination"
description: "When a severe weather alert triggers, pulls outage predictions from Azure ML, pre-positions crews via Microsoft Power Automate, stocks materials in SAP, and broadcasts customer alerts through WhatsApp and Twitter."
tags:
- outage
- grid-ops
- azure-machine-learning
- microsoft-power-automate
- sap
- whatsapp
- twitter
capability:
exposes:
- type: mcp
namespace: storm-response
port: 8080
tools:
- name: activate-storm-protocol
description: "Predict outages, pre-position crews, stock materials, and alert customers."
inputParameters:
- name: storm_id
in: body
type: string
description: "The weather event identifier."
- name: affected_regions
in: body
type: string
description: "Comma-separated list of affected grid regions."
steps:
- name: predict-outages
type: call
call: "azureml.score-model"
with:
endpoint: "storm_outage_prediction"
data: '{"storm":"{{storm_id}}","regions":"{{affected_regions}}"}'
- name: dispatch-crews
type: call
call: "powerautomate.trigger-flow"
with:
flow_id: "storm_crew_staging"
parameters: '{"regions":"{{affected_regions}}","severity":"{{predict-outages.severity}}"}'
- name: stock-materials
type: call
call: "sap.create-reservation"
with:
material_type: "storm_response_kit"
regions: "{{affected_regions}}"
quantity: "{{predict-outages.estimated_poles}}"
- name: alert-customers
type: call
call: "whatsapp.send-broadcast"
with:
template: "storm_warning"
parameters: '{"regions":"{{affected_regions}}","severity":"{{predict-outages.severity}}"}'
- name: post-twitter
type: call
call: "twitter.create-tweet"
with:
text: "Storm preparedness update: Duke Energy is pre-positioning crews for {{affected_regions}}. Follow for outage updates."
consumes:
- type: http
namespace: azureml
baseUri: "https://duke-energy-ml.eastus.inference.ml.azure.com"
authentication:
type: bearer
token: "$secrets.azureml_token"
resources:
- name: endpoints
path: "/score"
operations:
- name: score-model
method: POST
- type: http
namespace: powerautomate
baseUri: "https://prod-00.eastus.logic.azure.com/workflows"
authentication:
type: bearer
token: "$secrets.power_automate_token"
resources:
- name: flows
path: "/{{flow_id}}/triggers/manual/paths/invoke"
inputParameters:
- name: flow_id
in: path
operations:
- name: trigger-flow
method: POST
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: reservations
path: "/materials/reservations"
operations:
- name: create-reservation
method: POST
- type: http
namespace: whatsapp
baseUri: "https://graph.facebook.com/v17.0"
authentication:
type: bearer
token: "$secrets.whatsapp_token"
resources:
- name: messages
path: "/messages"
operations:
- name: send-broadcast
method: POST
- type: http
namespace: twitter
baseUri: "https://api.twitter.com/2"
authentication:
type: bearer
token: "$secrets.twitter_token"
resources:
- name: tweets
path: "/tweets"
operations:
- name: create-tweet
method: POST
Queries SCADA telemetry from Azure Databricks for a specific substation and returns voltage, current, and power readings.
naftiko: "0.5"
info:
label: "Substation SCADA Data Retrieval"
description: "Queries SCADA telemetry from Azure Databricks for a specific substation and returns voltage, current, and power readings."
tags:
- grid-ops
- scada
- azure-databricks
capability:
exposes:
- type: mcp
namespace: scada-data
port: 8080
tools:
- name: get-substation-telemetry
description: "Fetch SCADA telemetry data for a substation."
inputParameters:
- name: substation_id
in: body
type: string
description: "The substation identifier."
- name: time_range
in: body
type: string
description: "Time range (e.g., last_1h, last_24h)."
call: "databricks.query-telemetry"
with:
substation_id: "{{substation_id}}"
time_range: "{{time_range}}"
consumes:
- type: http
namespace: databricks
baseUri: "https://eastus.azuredatabricks.net/api/2.0"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: sql
path: "/sql/statements"
operations:
- name: query-telemetry
method: POST
Retrieves Teams activity at Duke Energy.
naftiko: "0.5"
info:
label: "Teams Channel Activity"
description: "Retrieves Teams activity at Duke Energy."
tags:
- communications
- microsoft-teams
- analytics
capability:
exposes:
- type: mcp
namespace: teams-activity
port: 8080
tools:
- name: get-activity
description: "Check Teams activity at Duke Energy."
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
Triggers a Terraform plan for a specified workspace and posts the summary to Microsoft Teams for approval.
naftiko: "0.5"
info:
label: "Terraform Infrastructure Plan"
description: "Triggers a Terraform plan for a specified workspace and posts the summary to Microsoft Teams for approval."
tags:
- infrastructure
- terraform
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: infra-automation
port: 8080
tools:
- name: run-terraform-plan
description: "Trigger a Terraform plan and post the summary to Teams for review."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Terraform Cloud workspace ID."
- name: team_channel
in: body
type: string
description: "Teams channel for plan review."
steps:
- name: create-run
type: call
call: "terraform.create-run"
with:
workspace_id: "{{workspace_id}}"
plan_only: true
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "{{team_channel}}"
text: "Terraform plan ready for {{workspace_id}}: {{create-run.resource_additions}} additions, {{create-run.resource_changes}} changes, {{create-run.resource_destructions}} destructions."
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/runs"
operations:
- name: create-run
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks Terraform workspace at Duke Energy.
naftiko: "0.5"
info:
label: "Terraform Workspace Check"
description: "Checks Terraform workspace at Duke Energy."
tags:
- infrastructure
- terraform
- iac
capability:
exposes:
- type: mcp
namespace: tf-ws
port: 8080
tools:
- name: check-ws
description: "Check workspace at Duke Energy."
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
Calculates dynamic line ratings for transmission lines using weather data and MATLAB thermal models, updating the results in SAP grid management.
naftiko: "0.5"
info:
label: "Transmission Line Thermal Rating"
description: "Calculates dynamic line ratings for transmission lines using weather data and MATLAB thermal models, updating the results in SAP grid management."
tags:
- grid-ops
- engineering
- matlab
- sap
capability:
exposes:
- type: mcp
namespace: line-ratings
port: 8080
tools:
- name: calculate-line-rating
description: "Compute dynamic thermal rating for a transmission line."
inputParameters:
- name: line_id
in: body
type: string
description: "The transmission line identifier."
- name: timestamp
in: body
type: string
description: "Calculation timestamp ISO 8601."
steps:
- name: get-weather
type: call
call: "weather.get-conditions"
with:
line_id: "{{line_id}}"
- name: run-thermal-model
type: call
call: "matlab.execute-script"
with:
script: "dynamic_line_rating"
parameters: '{"line":"{{line_id}}","temp":"{{get-weather.temperature}}","wind":"{{get-weather.wind_speed}}","solar":"{{get-weather.solar_radiation}}"}'
- name: update-rating
type: call
call: "sap.update-line-rating"
with:
line_id: "{{line_id}}"
rating_mw: "{{run-thermal-model.rating_mw}}"
timestamp: "{{timestamp}}"
consumes:
- type: http
namespace: weather
baseUri: "https://api.weather.gov"
authentication:
type: bearer
token: "$secrets.weather_api_token"
resources:
- name: conditions
path: "/stations/{{line_id}}/observations/latest"
inputParameters:
- name: line_id
in: path
operations:
- name: get-conditions
method: GET
- type: http
namespace: matlab
baseUri: "https://matlab.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.matlab_token"
resources:
- name: scripts
path: "/execute"
operations:
- name: execute-script
method: POST
- type: http
namespace: sap
baseUri: "https://duke-energy-sap.s4hana.cloud/api/v1"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: line-ratings
path: "/grid/line-ratings"
operations:
- name: update-line-rating
method: PUT
Checks Vault secret at Duke Energy.
naftiko: "0.5"
info:
label: "Vault Secret Metadata"
description: "Checks Vault secret at Duke Energy."
tags:
- security
- vault
- secrets-management
capability:
exposes:
- type: mcp
namespace: vault
port: 8080
tools:
- name: check-secret
description: "Check secret at Duke Energy."
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.duke-energy.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 satellite imagery through Azure Machine Learning to identify vegetation encroachment near power lines, creates work orders in ServiceNow, and notifies field teams via Microsoft Teams.
naftiko: "0.5"
info:
label: "Vegetation Management Workflow"
description: "Processes satellite imagery through Azure Machine Learning to identify vegetation encroachment near power lines, creates work orders in ServiceNow, and notifies field teams via Microsoft Teams."
tags:
- grid-ops
- vegetation
- azure-machine-learning
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: vegetation-mgmt
port: 8080
tools:
- name: process-vegetation-scan
description: "Analyze satellite imagery for vegetation encroachment and create work orders."
inputParameters:
- name: corridor_id
in: body
type: string
description: "The transmission corridor identifier."
- name: scan_date
in: body
type: string
description: "Satellite scan date YYYY-MM-DD."
steps:
- name: analyze-imagery
type: call
call: "azureml.score-model"
with:
endpoint: "vegetation_detection_v3"
data: '{"corridor":"{{corridor_id}}","date":"{{scan_date}}"}'
- name: create-work-order
type: call
call: "servicenow.create-task"
with:
short_description: "Vegetation trimming: Corridor {{corridor_id}}"
description: "Encroachment zones: {{analyze-imagery.zones_flagged}}. Risk level: {{analyze-imagery.risk_level}}. Scan date: {{scan_date}}."
assigned_group: "Vegetation_Mgmt"
category: "vegetation"
- name: notify-field-team
type: call
call: "msteams.send-message"
with:
channel_id: "field_operations"
text: "Vegetation alert: Corridor {{corridor_id}} has {{analyze-imagery.zones_flagged}} zones flagged ({{analyze-imagery.risk_level}} risk). Work order: {{create-work-order.number}}"
consumes:
- type: http
namespace: azureml
baseUri: "https://duke-energy-ml.eastus.inference.ml.azure.com"
authentication:
type: bearer
token: "$secrets.azureml_token"
resources:
- name: endpoints
path: "/score"
operations:
- name: score-model
method: POST
- type: http
namespace: servicenow
baseUri: "https://duke-energy.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channels
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Processes invoices at Duke Energy via OCR, SAP matching, approval, and Oracle recording.
naftiko: "0.5"
info:
label: "Vendor Invoice Processing Pipeline"
description: "Processes invoices at Duke Energy 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 Duke Energy."
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.duke-energy.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.duke-energy.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.duke-energy.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.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.oracle_token"
resources:
- name: payments
path: "/payments"
operations:
- name: create-payment
method: POST
Reviews vendors at Duke Energy.
naftiko: "0.5"
info:
label: "Quarterly Vendor Review Pipeline"
description: "Reviews vendors at Duke Energy."
tags:
- procurement
- vendor-management
- review
capability:
exposes:
- type: mcp
namespace: vendor-review
port: 8080
tools:
- name: review-vendor
description: "Review vendors at Duke Energy."
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.duke-energy.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.duke-energy.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.duke-energy.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
Checks the latest Veritas InfoScale backup job status for a volume group.
naftiko: "0.5"
info:
label: "Veritas InfoScale Backup Status"
description: "Checks the latest Veritas InfoScale backup job status for a volume group."
tags:
- infrastructure
- backup
- veritas-infoscale
capability:
exposes:
- type: mcp
namespace: backup-status
port: 8080
tools:
- name: get-backup-status
description: "Fetch Veritas InfoScale backup status for a volume group."
inputParameters:
- name: volume_group
in: body
type: string
description: "The volume group name."
call: "veritas.get-backup-status"
with:
volume_group: "{{volume_group}}"
consumes:
- type: http
namespace: veritas
baseUri: "https://veritas.duke-energy.com/api/v1"
authentication:
type: bearer
token: "$secrets.veritas_token"
resources:
- name: backups
path: "/volume-groups/{{volume_group}}/backups/latest"
inputParameters:
- name: volume_group
in: path
operations:
- name: get-backup-status
method: GET
Retrieves employee profile data from Workday by worker ID including department, manager, and location.
naftiko: "0.5"
info:
label: "Workday Employee Lookup"
description: "Retrieves employee profile data from Workday by worker ID including department, manager, and location."
tags:
- hr
- workday
capability:
exposes:
- type: mcp
namespace: hr-directory
port: 8080
tools:
- name: get-employee
description: "Look up a Workday employee by worker ID."
inputParameters:
- name: worker_id
in: body
type: string
description: "The Workday worker ID."
call: "workday.get-worker"
with:
worker_id: "{{worker_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: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
Retrieves employee profile from Workday for Duke Energy.
naftiko: "0.5"
info:
label: "Workday Employee Profile Lookup"
description: "Retrieves employee profile from Workday for Duke Energy."
tags:
- hr
- workday
- employee-directory
capability:
exposes:
- type: mcp
namespace: workday-profile
port: 8080
tools:
- name: get-employee-profile
description: "Look up Duke Energy 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.duke-energy.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
Posts a journal entry to Workday Financials for utility cost allocation.
naftiko: "0.5"
info:
label: "Workday Financials Journal Entry"
description: "Posts a journal entry to Workday Financials for utility cost allocation."
tags:
- finance
- workday
capability:
exposes:
- type: mcp
namespace: financials
port: 8080
tools:
- name: post-journal-entry
description: "Post a journal entry to Workday Financials."
inputParameters:
- name: account
in: body
type: string
description: "GL account."
- name: amount
in: body
type: number
description: "Entry amount."
- name: cost_center
in: body
type: string
description: "Cost center."
call: "workday.post-journal"
with:
account: "{{account}}"
amount: "{{amount}}"
cost_center: "{{cost_center}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: journals
path: "/journal-entries"
operations:
- name: post-journal
method: POST