Duke Energy Capabilities

Naftiko 0.5 capability definitions for Duke Energy - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

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