Consolidated Edison Capabilities

Naftiko 0.5 capability definitions for Consolidated Edison - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Reviews access at Con Edison via Okta, IAM, and Jira.

naftiko: "0.5"
info:
  label: "Access Review Pipeline"
  description: "Reviews access at Con Edison 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 Con Edison."
          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://coned.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.coned.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://coned.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 Con Edison via consumer identification, notices, and tracking.

naftiko: "0.5"
info:
  label: "API Deprecation Pipeline"
  description: "Manages API deprecation at Con Edison 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 Con Edison."
          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.coned.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.coned.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.coned.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://coned.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 metadata for an AutoCAD design drawing from the document management system, returning drawing number, revision, status, and last modified date.

naftiko: "0.5"
info:
  label: "AutoCAD Design Drawing Lookup"
  description: "Retrieves metadata for an AutoCAD design drawing from the document management system, returning drawing number, revision, status, and last modified date."
  tags:
    - engineering
    - autocad
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: engineering-docs
      port: 8080
      tools:
        - name: get-design-drawing
          description: "Look up an AutoCAD design drawing. Returns drawing number, revision, status, and last modified."
          inputParameters:
            - name: drawing_number
              in: body
              type: string
              description: "The drawing number."
          call: "doc-mgmt.get-drawing"
          with:
            drawing_number: "{{drawing_number}}"
          outputParameters:
            - name: revision
              type: string
              mapping: "$.drawing.revision"
            - name: status
              type: string
              mapping: "$.drawing.status"
            - name: last_modified
              type: string
              mapping: "$.drawing.lastModified"
            - name: designer
              type: string
              mapping: "$.drawing.designer"
  consumes:
    - type: http
      namespace: doc-mgmt
      baseUri: "https://api.internal.coned.com/documents/v1"
      authentication:
        type: bearer
        token: "$secrets.doc_mgmt_token"
      resources:
        - name: drawings
          path: "/drawings/{{drawing_number}}"
          inputParameters:
            - name: drawing_number
              in: path
          operations:
            - name: get-drawing
              method: GET

Triggers an Azure Data Factory pipeline for grid data ETL and returns the run ID and status.

naftiko: "0.5"
info:
  label: "Azure Data Factory ETL Pipeline Trigger"
  description: "Triggers an Azure Data Factory pipeline for grid data ETL and returns the run ID and status."
  tags:
    - data-integration
    - azure-data-factory
    - etl
capability:
  exposes:
    - type: mcp
      namespace: data-integration
      port: 8080
      tools:
        - name: trigger-adf-pipeline
          description: "Trigger an Azure Data Factory pipeline. Returns run ID and status."
          inputParameters:
            - name: factory_name
              in: body
              type: string
              description: "The ADF factory name."
            - name: pipeline_name
              in: body
              type: string
              description: "The pipeline name."
          call: "adf.create-pipeline-run"
          with:
            factory_name: "{{factory_name}}"
            pipeline_name: "{{pipeline_name}}"
          outputParameters:
            - name: run_id
              type: string
              mapping: "$.runId"
  consumes:
    - type: http
      namespace: adf
      baseUri: "https://management.azure.com/subscriptions/{{subscription_id}}/resourceGroups/{{rg}}/providers/Microsoft.DataFactory/factories"
      authentication:
        type: bearer
        token: "$secrets.azure_token"
      resources:
        - name: pipelines
          path: "/{{factory_name}}/pipelines/{{pipeline_name}}/createRun"
          inputParameters:
            - name: factory_name
              in: path
            - name: pipeline_name
              in: path
          operations:
            - name: create-pipeline-run
              method: POST

Checks build at Con Edison.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Check"
  description: "Checks build at Con Edison."
  tags:
    - devops
    - azure-devops
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: azdo-build
      port: 8080
      tools:
        - name: check-build
          description: "Check build at Con Edison."
          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/coned.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 real-time telemetry data from an Azure IoT Hub-connected grid sensor, returning temperature, humidity, vibration, and battery level.

naftiko: "0.5"
info:
  label: "Azure IoT Device Telemetry"
  description: "Retrieves real-time telemetry data from an Azure IoT Hub-connected grid sensor, returning temperature, humidity, vibration, and battery level."
  tags:
    - iot
    - microsoft-azure
    - grid-monitoring
    - sensors
capability:
  exposes:
    - type: mcp
      namespace: iot-telemetry
      port: 8080
      tools:
        - name: get-sensor-telemetry
          description: "Look up IoT sensor telemetry from Azure IoT Hub. Returns temperature, humidity, vibration, and battery."
          inputParameters:
            - name: device_id
              in: body
              type: string
              description: "The IoT Hub device ID."
          call: "azure-iot.get-twin"
          with:
            device_id: "{{device_id}}"
          outputParameters:
            - name: temperature
              type: number
              mapping: "$.properties.reported.temperature"
            - name: humidity
              type: number
              mapping: "$.properties.reported.humidity"
            - name: vibration
              type: number
              mapping: "$.properties.reported.vibration"
            - name: battery_pct
              type: number
              mapping: "$.properties.reported.batteryLevel"
  consumes:
    - type: http
      namespace: azure-iot
      baseUri: "https://coned-iothub.azure-devices.net"
      authentication:
        type: bearer
        token: "$secrets.azure_iot_token"
      resources:
        - name: twins
          path: "/twins/{{device_id}}"
          inputParameters:
            - name: device_id
              in: path
          operations:
            - name: get-twin
              method: GET

Analyzes budget variance at Con Edison via Oracle, Workday, and Slack.

naftiko: "0.5"
info:
  label: "Budget Variance Pipeline"
  description: "Analyzes budget variance at Con Edison 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 Con Edison."
          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.coned.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.coned.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.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: var
          path: "/compute"
          operations:
            - name: variance
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the location data for a reported underground cable fault.

naftiko: "0.5"
info:
  label: "Cable Fault Location Lookup"
  description: "Retrieves the location data for a reported underground cable fault."
  tags:
    - underground
    - fault-detection
    - grid-operations
capability:
  exposes:
    - type: mcp
      namespace: cable-fault
      port: 8080
      tools:
        - name: get-fault-location
          description: "Look up cable fault location by fault ticket ID."
          inputParameters:
            - name: fault_ticket_id
              in: body
              type: string
              description: "The fault ticket identifier."
          call: "fault-system.get-fault"
          with:
            ticket_id: "{{fault_ticket_id}}"
          outputParameters:
            - name: latitude
              type: number
              mapping: "$.fault.location.lat"
            - name: longitude
              type: number
              mapping: "$.fault.location.lng"
            - name: depth_ft
              type: number
              mapping: "$.fault.depth_ft"
  consumes:
    - type: http
      namespace: fault-system
      baseUri: "https://fault-detection.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.fault_system_token"
      resources:
        - name: faults
          path: "/faults/{{ticket_id}}"
          inputParameters:
            - name: ticket_id
              in: path
          operations:
            - name: get-fault
              method: GET

Plans capacity at Con Edison by collecting utilization and forecasting.

naftiko: "0.5"
info:
  label: "Capacity Planning Pipeline"
  description: "Plans capacity at Con Edison 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 Con Edison."
          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.coned.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.coned.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://coned.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

Pulls project budget data from Oracle E-Business Suite, compares against actuals from SAP, and generates a variance report uploaded to SharePoint for the finance team.

naftiko: "0.5"
info:
  label: "Capital Project Budget Pipeline"
  description: "Pulls project budget data from Oracle E-Business Suite, compares against actuals from SAP, and generates a variance report uploaded to SharePoint for the finance team."
  tags:
    - capital-projects
    - oracle-e-business-suite
    - sap
    - sharepoint
    - finance
capability:
  exposes:
    - type: mcp
      namespace: capital-finance
      port: 8080
      tools:
        - name: generate-budget-variance
          description: "Given a project ID, pull budget and actuals, generate variance report, and upload to SharePoint."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The capital project identifier."
            - name: period
              in: body
              type: string
              description: "The reporting period."
          steps:
            - name: get-budget
              type: call
              call: "oracle-ebs.get-project-budget"
              with:
                project_id: "{{project_id}}"
                period: "{{period}}"
            - name: get-actuals
              type: call
              call: "sap.get-project-actuals"
              with:
                project_id: "{{project_id}}"
                period: "{{period}}"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "capital_projects"
                file_path: "BudgetReports/{{project_id}}/{{period}}_variance.xlsx"
                content: "Budget: ${{get-budget.total_budget}}. Actuals: ${{get-actuals.total_spent}}. Variance: ${{get-budget.total_budget}} - ${{get-actuals.total_spent}}."
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://oracle-ebs.internal.coned.com/webservices/rest/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: budgets
          path: "/projects/{{project_id}}/budget"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project-budget
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://coned-s4.sap.com/sap/opu/odata/sap/API_PROJECT_COST_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: actuals
          path: "/ProjectCosts('{{project_id}}')"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project-actuals
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: upload-file
              method: PUT

Monitors cert expiry at Con Edison.

naftiko: "0.5"
info:
  label: "Certificate Expiry Pipeline"
  description: "Monitors cert expiry at Con Edison."
  tags:
    - security
    - certificates
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: cert-monitor
      port: 8080
      tools:
        - name: check-certs
          description: "Monitor certs at Con Edison."
          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.coned.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://coned.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 Con Edison through ServiceNow and CAB approval.

naftiko: "0.5"
info:
  label: "Change Management Pipeline"
  description: "Routes changes at Con Edison 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 Con Edison."
          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://coned.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.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Retrieves the running configuration of a Cisco network switch and stores it in the configuration management database for audit compliance.

naftiko: "0.5"
info:
  label: "Cisco Network Switch Configuration Backup"
  description: "Retrieves the running configuration of a Cisco network switch and stores it in the configuration management database for audit compliance."
  tags:
    - network
    - cisco
    - configuration-management
capability:
  exposes:
    - type: mcp
      namespace: network-config
      port: 8080
      tools:
        - name: backup-switch-config
          description: "Retrieve Cisco switch running config and store in the configuration management system."
          inputParameters:
            - name: switch_hostname
              in: body
              type: string
              description: "The Cisco switch hostname."
          steps:
            - name: get-config
              type: call
              call: "cisco-mgmt.get-running-config"
              with:
                hostname: "{{switch_hostname}}"
            - name: store-config
              type: call
              call: "config-mgmt.store-backup"
              with:
                device_name: "{{switch_hostname}}"
                config: "{{get-config.running_config}}"
                timestamp: "{{get-config.timestamp}}"
  consumes:
    - type: http
      namespace: cisco-mgmt
      baseUri: "https://cisco-dnac.internal.coned.com/dna/intent/api/v1"
      authentication:
        type: bearer
        token: "$secrets.cisco_token"
      resources:
        - name: devices
          path: "/network-device/config"
          operations:
            - name: get-running-config
              method: GET
    - type: http
      namespace: config-mgmt
      baseUri: "https://api.internal.coned.com/config-mgmt/v1"
      authentication:
        type: bearer
        token: "$secrets.config_mgmt_token"
      resources:
        - name: backups
          path: "/backups"
          operations:
            - name: store-backup
              method: POST

Optimizes cloud costs at Con Edison via Azure, FinOps, Jira, and Power BI.

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Pipeline"
  description: "Optimizes cloud costs at Con Edison 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 Con Edison."
          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.coned.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://coned.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Searches Confluence at Con Edison.

naftiko: "0.5"
info:
  label: "Confluence Article Search"
  description: "Searches Confluence at Con Edison."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: confluence-search
      port: 8080
      tools:
        - name: search-articles
          description: "Search Confluence at Con Edison."
          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://coned.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 Confluence for engineering documentation, returning article title, URL, and last updated date.

naftiko: "0.5"
info:
  label: "Confluence Engineering Docs Search"
  description: "Searches Confluence for engineering documentation, returning article title, URL, and last updated date."
  tags:
    - knowledge-management
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: engineering-kb
      port: 8080
      tools:
        - name: search-engineering-docs
          description: "Search Confluence for engineering documentation. Returns title, URL, and last updated."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The search query."
          call: "confluence.search"
          with:
            cql: "text~\"{{query}}\" and space=ENGINEERING"
          outputParameters:
            - name: title
              type: string
              mapping: "$.results[0].title"
            - name: url
              type: string
              mapping: "$.results[0]._links.webui"
            - name: last_updated
              type: string
              mapping: "$.results[0].version.when"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://conedison.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/content/search"
          operations:
            - name: search
              method: GET

Tracks contract renewals at Con Edison via contracts system, email, Jira, and Salesforce.

naftiko: "0.5"
info:
  label: "Contract Renewal Pipeline"
  description: "Tracks contract renewals at Con Edison 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 Con Edison."
          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.coned.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.coned.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://coned.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://coned.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

Pulls contractor work order completion data from SAP, evaluates safety and quality metrics, and updates the contractor scorecard in the vendor management system.

naftiko: "0.5"
info:
  label: "Contractor Performance Review Pipeline"
  description: "Pulls contractor work order completion data from SAP, evaluates safety and quality metrics, and updates the contractor scorecard in the vendor management system."
  tags:
    - contractor-management
    - sap
    - vendor-management
capability:
  exposes:
    - type: mcp
      namespace: contractor-mgmt
      port: 8080
      tools:
        - name: evaluate-contractor
          description: "Given a contractor ID, pull SAP work order data, evaluate performance, and update scorecard."
          inputParameters:
            - name: contractor_id
              in: body
              type: string
              description: "The contractor identifier."
            - name: review_period
              in: body
              type: string
              description: "The review period."
          steps:
            - name: get-work-orders
              type: call
              call: "sap.get-contractor-orders"
              with:
                contractor_id: "{{contractor_id}}"
                period: "{{review_period}}"
            - name: evaluate-metrics
              type: call
              call: "vendor-mgmt.evaluate-performance"
              with:
                contractor_id: "{{contractor_id}}"
                completed_orders: "{{get-work-orders.completed_count}}"
                on_time_pct: "{{get-work-orders.on_time_percentage}}"
                safety_incidents: "{{get-work-orders.safety_incidents}}"
            - name: update-scorecard
              type: call
              call: "vendor-mgmt.update-scorecard"
              with:
                contractor_id: "{{contractor_id}}"
                overall_score: "{{evaluate-metrics.overall_score}}"
                safety_score: "{{evaluate-metrics.safety_score}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://coned-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: contractor-orders
          path: "/MaintenanceOrder"
          operations:
            - name: get-contractor-orders
              method: GET
    - type: http
      namespace: vendor-mgmt
      baseUri: "https://api.internal.coned.com/vendors/v1"
      authentication:
        type: bearer
        token: "$secrets.vendor_mgmt_token"
      resources:
        - name: performance
          path: "/contractors/{{contractor_id}}/performance"
          inputParameters:
            - name: contractor_id
              in: path
          operations:
            - name: evaluate-performance
              method: POST
        - name: scorecards
          path: "/contractors/{{contractor_id}}/scorecard"
          inputParameters:
            - name: contractor_id
              in: path
          operations:
            - name: update-scorecard
              method: PATCH

When a customer contacts about their bill, retrieves account details from the billing system, pulls usage from the AMI system, and creates a case in Salesforce with full context.

naftiko: "0.5"
info:
  label: "Customer Billing Inquiry Pipeline"
  description: "When a customer contacts about their bill, retrieves account details from the billing system, pulls usage from the AMI system, and creates a case in Salesforce with full context."
  tags:
    - customer-service
    - billing
    - ami
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: billing-inquiry
      port: 8080
      tools:
        - name: process-billing-inquiry
          description: "Given a customer account, pull billing and usage data and create a Salesforce case."
          inputParameters:
            - name: account_number
              in: body
              type: string
              description: "The customer account number."
            - name: inquiry_type
              in: body
              type: string
              description: "The inquiry type (high-bill, payment, rate-change)."
          steps:
            - name: get-billing
              type: call
              call: "billing.get-account"
              with:
                account_number: "{{account_number}}"
            - name: get-usage
              type: call
              call: "ami.get-usage-summary"
              with:
                account_number: "{{account_number}}"
            - name: create-case
              type: call
              call: "salesforce.create-case"
              with:
                account_number: "{{account_number}}"
                subject: "{{inquiry_type}}: Account {{account_number}}"
                description: "Balance: ${{get-billing.balance}}. Last 30-day usage: {{get-usage.kwh_30day}} kWh. Avg daily: {{get-usage.avg_daily_kwh}} kWh."
  consumes:
    - type: http
      namespace: billing
      baseUri: "https://api.internal.coned.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.billing_token"
      resources:
        - name: accounts
          path: "/accounts/{{account_number}}"
          inputParameters:
            - name: account_number
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: ami
      baseUri: "https://api.internal.coned.com/ami/v1"
      authentication:
        type: bearer
        token: "$secrets.ami_token"
      resources:
        - name: usage
          path: "/accounts/{{account_number}}/usage-summary"
          inputParameters:
            - name: account_number
              in: path
          operations:
            - name: get-usage-summary
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://conedison.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST

Retrieves payment history for a customer account showing recent payments and balance due.

naftiko: "0.5"
info:
  label: "Customer Payment History"
  description: "Retrieves payment history for a customer account showing recent payments and balance due."
  tags:
    - billing
    - customer-service
    - payments
capability:
  exposes:
    - type: mcp
      namespace: payment-history
      port: 8080
      tools:
        - name: get-payment-history
          description: "Look up customer payment history by account."
          inputParameters:
            - name: account_number
              in: body
              type: string
              description: "The customer account number."
          call: "billing.get-payments"
          with:
            account_number: "{{account_number}}"
          outputParameters:
            - name: last_payment_date
              type: string
              mapping: "$.payments[0].date"
            - name: last_payment_amount
              type: number
              mapping: "$.payments[0].amount"
            - name: balance_due
              type: number
              mapping: "$.account.balance_due"
  consumes:
    - type: http
      namespace: billing
      baseUri: "https://billing.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.billing_api_token"
      resources:
        - name: payments
          path: "/accounts/{{account_number}}/payments"
          inputParameters:
            - name: account_number
              in: path
          operations:
            - name: get-payments
              method: GET

When a customer service request is received, creates a Salesforce case, checks the customer's account in the billing system, and notifies the service team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer Service Ticket Pipeline"
  description: "When a customer service request is received, creates a Salesforce case, checks the customer's account in the billing system, and notifies the service team via Microsoft Teams."
  tags:
    - customer-service
    - salesforce
    - billing
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: customer-service
      port: 8080
      tools:
        - name: process-service-request
          description: "Given customer details and request type, create a Salesforce case, check billing status, and notify the team."
          inputParameters:
            - name: customer_account
              in: body
              type: string
              description: "The customer account number."
            - name: request_type
              in: body
              type: string
              description: "The service request type (e.g., billing-inquiry, outage-report, new-service)."
            - name: description
              in: body
              type: string
              description: "Description of the customer's issue."
          steps:
            - name: get-billing-status
              type: call
              call: "billing.get-account"
              with:
                account_number: "{{customer_account}}"
            - name: create-case
              type: call
              call: "salesforce.create-case"
              with:
                account_number: "{{customer_account}}"
                subject: "{{request_type}}: Account {{customer_account}}"
                description: "{{description}}. Account balance: ${{get-billing-status.balance}}. Payment status: {{get-billing-status.payment_status}}."
                type: "{{request_type}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "customer-service"
                text: "New {{request_type}} case: {{create-case.CaseNumber}} for account {{customer_account}}. Balance: ${{get-billing-status.balance}}."
  consumes:
    - type: http
      namespace: billing
      baseUri: "https://api.internal.coned.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.billing_token"
      resources:
        - name: accounts
          path: "/accounts/{{account_number}}"
          inputParameters:
            - name: account_number
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://conedison.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Monitors data pipelines at Con Edison via Databricks, Snowflake, Slack, and ServiceNow.

naftiko: "0.5"
info:
  label: "Data Pipeline Monitor Pipeline"
  description: "Monitors data pipelines at Con Edison 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 Con Edison."
          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://coned.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://coned.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://coned.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

Retrieves the status of a grid analytics ML model in Databricks MLflow, returning model version, stage, and last transition date.

naftiko: "0.5"
info:
  label: "Databricks Grid Analytics Model Status"
  description: "Retrieves the status of a grid analytics ML model in Databricks MLflow, returning model version, stage, and last transition date."
  tags:
    - machine-learning
    - databricks
    - grid-analytics
capability:
  exposes:
    - type: mcp
      namespace: ml-ops
      port: 8080
      tools:
        - name: get-grid-model-status
          description: "Look up a grid analytics ML model in Databricks. Returns version, stage, and last transition."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "The registered model name."
          call: "databricks.get-model-version"
          with:
            model_name: "{{model_name}}"
          outputParameters:
            - name: version
              type: string
              mapping: "$.model_version.version"
            - name: stage
              type: string
              mapping: "$.model_version.current_stage"
            - name: last_transition
              type: string
              mapping: "$.model_version.last_updated_timestamp"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://coned.cloud.databricks.com/api/2.0/mlflow"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: model-versions
          path: "/registered-models/get-latest-versions"
          operations:
            - name: get-model-version
              method: POST

Checks Datadog monitor at Con Edison.

naftiko: "0.5"
info:
  label: "Datadog Monitor Check"
  description: "Checks Datadog monitor at Con Edison."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: dd-monitor
      port: 8080
      tools:
        - name: check-monitor
          description: "Check monitor at Con Edison."
          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

When a demand response event is triggered during peak load, notifies large commercial customers via the notification system, adjusts smart thermostat setpoints via the IoT platform, and logs the event in ServiceNow.

naftiko: "0.5"
info:
  label: "Demand Response Event Pipeline"
  description: "When a demand response event is triggered during peak load, notifies large commercial customers via the notification system, adjusts smart thermostat setpoints via the IoT platform, and logs the event in ServiceNow."
  tags:
    - demand-response
    - energy-management
    - iot
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: demand-response
      port: 8080
      tools:
        - name: trigger-demand-response
          description: "Given a zone and curtailment target, execute a demand response event across customer notifications, IoT controls, and event logging."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "The grid zone identifier."
            - name: curtailment_mw
              in: body
              type: number
              description: "The target curtailment in megawatts."
            - name: duration_hours
              in: body
              type: number
              description: "The expected event duration in hours."
          steps:
            - name: notify-customers
              type: call
              call: "notification-service.send-dr-notification"
              with:
                zone_id: "{{zone_id}}"
                curtailment_mw: "{{curtailment_mw}}"
                duration_hours: "{{duration_hours}}"
            - name: adjust-thermostats
              type: call
              call: "iot-platform.set-thermostat-offset"
              with:
                zone_id: "{{zone_id}}"
                offset_degrees: 2
            - name: log-event
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Demand Response Event: Zone {{zone_id}}"
                category: "demand_response"
                description: "DR event triggered. Zone: {{zone_id}}. Target curtailment: {{curtailment_mw}} MW. Duration: {{duration_hours}} hours. {{notify-customers.notified_count}} customers notified."
  consumes:
    - type: http
      namespace: notification-service
      baseUri: "https://api.internal.coned.com/notifications/v1"
      authentication:
        type: bearer
        token: "$secrets.notification_token"
      resources:
        - name: demand-response
          path: "/demand-response/notify"
          operations:
            - name: send-dr-notification
              method: POST
    - type: http
      namespace: iot-platform
      baseUri: "https://api.internal.coned.com/iot/v1"
      authentication:
        type: bearer
        token: "$secrets.iot_token"
      resources:
        - name: thermostats
          path: "/thermostats/zone/{{zone_id}}/offset"
          inputParameters:
            - name: zone_id
              in: path
          operations:
            - name: set-thermostat-offset
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://conedison.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Retrieves load data for a distribution feeder from SCADA, returning load MW, power factor, and phase balance percentage.

naftiko: "0.5"
info:
  label: "Distribution Feeder Load Balance"
  description: "Retrieves load data for a distribution feeder from SCADA, returning load MW, power factor, and phase balance percentage."
  tags:
    - distribution
    - feeder
    - scada
    - load-management
capability:
  exposes:
    - type: mcp
      namespace: distribution-ops
      port: 8080
      tools:
        - name: get-feeder-load
          description: "Look up distribution feeder load. Returns MW, power factor, and phase balance."
          inputParameters:
            - name: feeder_id
              in: body
              type: string
              description: "The distribution feeder ID."
          call: "scada.get-feeder-data"
          with:
            feeder_id: "{{feeder_id}}"
          outputParameters:
            - name: load_mw
              type: number
              mapping: "$.feeder.loadMW"
            - name: power_factor
              type: number
              mapping: "$.feeder.powerFactor"
            - name: phase_balance_pct
              type: number
              mapping: "$.feeder.phaseBalance"
  consumes:
    - type: http
      namespace: scada
      baseUri: "https://scada.internal.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.scada_token"
      resources:
        - name: feeders
          path: "/feeders/{{feeder_id}}"
          inputParameters:
            - name: feeder_id
              in: path
          operations:
            - name: get-feeder-data
              method: GET

Tests disaster recovery at Con Edison via failover, health checks, and reporting.

naftiko: "0.5"
info:
  label: "DR Test Pipeline"
  description: "Tests disaster recovery at Con Edison 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 Con Edison."
          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.coned.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.coned.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://coned.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 Con Edison via Terraform, Slack, and Jira.

naftiko: "0.5"
info:
  label: "Drift Detection Pipeline"
  description: "Detects infrastructure drift at Con Edison 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 Con Edison."
          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://coned.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 infrastructure host metrics from Dynatrace, returning CPU usage, memory usage, and disk utilization.

naftiko: "0.5"
info:
  label: "Dynatrace Infrastructure Monitoring"
  description: "Retrieves infrastructure host metrics from Dynatrace, returning CPU usage, memory usage, and disk utilization."
  tags:
    - monitoring
    - dynatrace
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-host-metrics
          description: "Look up infrastructure host metrics in Dynatrace. Returns CPU, memory, and disk."
          inputParameters:
            - name: host_id
              in: body
              type: string
              description: "The Dynatrace host entity ID."
          call: "dynatrace.get-host-metrics"
          with:
            host_id: "{{host_id}}"
          outputParameters:
            - name: cpu_usage_pct
              type: number
              mapping: "$.result[0].data[0].values.avg"
            - name: memory_usage_pct
              type: number
              mapping: "$.result[1].data[0].values.avg"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://coned.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: metrics
          path: "/metrics/query"
          operations:
            - name: get-host-metrics
              method: POST

When a new EV charging station is commissioned, registers it in the asset management system, creates a Salesforce account for the site, and updates the public charger map via the API.

naftiko: "0.5"
info:
  label: "Electric Vehicle Charging Station Pipeline"
  description: "When a new EV charging station is commissioned, registers it in the asset management system, creates a Salesforce account for the site, and updates the public charger map via the API."
  tags:
    - electric-vehicles
    - asset-management
    - salesforce
    - ev-charging
capability:
  exposes:
    - type: mcp
      namespace: ev-charging
      port: 8080
      tools:
        - name: commission-ev-station
          description: "Given station details, register the asset, create a Salesforce account, and update the public charger map."
          inputParameters:
            - name: station_id
              in: body
              type: string
              description: "The charging station identifier."
            - name: location_name
              in: body
              type: string
              description: "The station location name."
            - name: latitude
              in: body
              type: number
              description: "The station latitude."
            - name: longitude
              in: body
              type: number
              description: "The station longitude."
            - name: charger_count
              in: body
              type: number
              description: "Number of charging ports."
          steps:
            - name: register-asset
              type: call
              call: "asset-mgmt.register-station"
              with:
                station_id: "{{station_id}}"
                location_name: "{{location_name}}"
                latitude: "{{latitude}}"
                longitude: "{{longitude}}"
                charger_count: "{{charger_count}}"
            - name: create-sf-account
              type: call
              call: "salesforce.create-account"
              with:
                name: "EV Station: {{location_name}}"
                type: "EV_Charging"
                billing_city: "{{location_name}}"
            - name: update-map
              type: call
              call: "ev-map.update-station"
              with:
                station_id: "{{station_id}}"
                latitude: "{{latitude}}"
                longitude: "{{longitude}}"
                status: "active"
                charger_count: "{{charger_count}}"
  consumes:
    - type: http
      namespace: asset-mgmt
      baseUri: "https://api.internal.coned.com/assets/v1"
      authentication:
        type: bearer
        token: "$secrets.asset_mgmt_token"
      resources:
        - name: stations
          path: "/ev-stations"
          operations:
            - name: register-station
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://conedison.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account"
          operations:
            - name: create-account
              method: POST
    - type: http
      namespace: ev-map
      baseUri: "https://api.internal.coned.com/ev-charging/v1"
      authentication:
        type: bearer
        token: "$secrets.ev_map_token"
      resources:
        - name: stations
          path: "/stations"
          operations:
            - name: update-station
              method: PUT

When a gas leak is reported, creates a critical ServiceNow incident, dispatches an emergency gas crew, notifies the emergency operations center via Microsoft Teams, and sends a public safety alert.

naftiko: "0.5"
info:
  label: "Emergency Gas Leak Response Pipeline"
  description: "When a gas leak is reported, creates a critical ServiceNow incident, dispatches an emergency gas crew, notifies the emergency operations center via Microsoft Teams, and sends a public safety alert."
  tags:
    - emergency-response
    - gas-operations
    - servicenow
    - microsoft-teams
    - safety
capability:
  exposes:
    - type: mcp
      namespace: gas-emergency
      port: 8080
      tools:
        - name: respond-to-gas-leak
          description: "Given a leak location and severity, create an incident, dispatch emergency crew, and send alerts."
          inputParameters:
            - name: location_address
              in: body
              type: string
              description: "The address of the reported gas leak."
            - name: severity
              in: body
              type: string
              description: "Leak severity (critical, major, minor)."
            - name: caller_phone
              in: body
              type: string
              description: "The caller's phone number for follow-up."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Gas leak report: {{location_address}}"
                category: "gas_emergency"
                priority: "{{severity}}"
                description: "Gas leak reported at {{location_address}}. Severity: {{severity}}. Caller: {{caller_phone}}."
            - name: dispatch-crew
              type: call
              call: "workforce-mgmt.dispatch-emergency-crew"
              with:
                location: "{{location_address}}"
                emergency_type: "gas_leak"
                priority: "{{severity}}"
            - name: alert-eoc
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "emergency-ops"
                text: "GAS LEAK ALERT: {{severity}} at {{location_address}}. Incident: {{create-incident.number}}. Emergency crew dispatched: {{dispatch-crew.crew_id}}. ETA: {{dispatch-crew.eta}}."
            - name: send-safety-alert
              type: call
              call: "notification-service.send-safety-alert"
              with:
                location: "{{location_address}}"
                type: "gas_leak"
                message: "Gas leak reported near {{location_address}}. Please avoid the area. Emergency crews en route."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://conedison.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: workforce-mgmt
      baseUri: "https://api.internal.coned.com/workforce/v1"
      authentication:
        type: bearer
        token: "$secrets.workforce_token"
      resources:
        - name: emergency
          path: "/crews/emergency-dispatch"
          operations:
            - name: dispatch-emergency-crew
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: notification-service
      baseUri: "https://api.internal.coned.com/notifications/v1"
      authentication:
        type: bearer
        token: "$secrets.notification_token"
      resources:
        - name: safety
          path: "/safety-alerts"
          operations:
            - name: send-safety-alert
              method: POST

Offboards employees at Con Edison via Okta, Slack, ServiceNow, and storage.

naftiko: "0.5"
info:
  label: "Employee Offboarding Pipeline"
  description: "Offboards employees at Con Edison 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 Con Edison."
          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://coned.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://coned.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.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.storage_token"
      resources:
        - name: archives
          path: "/archive"
          operations:
            - name: archive
              method: POST

On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID, orchestrate onboarding across ServiceNow, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee start date in YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "The department the new hire is joining."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_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-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr_onboarding_site"
                folder_path: "OnboardingDocs/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to Con Edison, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}. Documents: {{provision-folder.url}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://conedison.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: 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

Retrieves energy usage summary for a customer account over a specified billing period.

naftiko: "0.5"
info:
  label: "Energy Usage Report Retrieval"
  description: "Retrieves energy usage summary for a customer account over a specified billing period."
  tags:
    - billing
    - energy-usage
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: energy-usage
      port: 8080
      tools:
        - name: get-usage-report
          description: "Retrieve energy usage for a billing period."
          inputParameters:
            - name: account_number
              in: body
              type: string
              description: "The customer account number."
            - name: period
              in: body
              type: string
              description: "The billing period in YYYY-MM format."
          call: "billing.get-usage"
          with:
            account_number: "{{account_number}}"
            period: "{{period}}"
          outputParameters:
            - name: total_kwh
              type: number
              mapping: "$.usage.total_kwh"
            - name: cost
              type: number
              mapping: "$.usage.total_cost"
  consumes:
    - type: http
      namespace: billing
      baseUri: "https://billing.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.billing_api_token"
      resources:
        - name: accounts
          path: "/accounts/{{account_number}}/usage"
          inputParameters:
            - name: account_number
              in: path
          operations:
            - name: get-usage
              method: GET

Audits expenses at Con Edison via Concur, compliance checks, and email.

naftiko: "0.5"
info:
  label: "Expense Audit Pipeline"
  description: "Audits expenses at Con Edison 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 Con Edison."
          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.coned.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.coned.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.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Analyzes feedback at Con Edison via surveys, AI sentiment, and Power BI.

naftiko: "0.5"
info:
  label: "Customer Feedback Pipeline"
  description: "Analyzes feedback at Con Edison 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 Con Edison."
          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.coned.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

Retrieves the current status of a distribution feeder switch including open/closed state and load.

naftiko: "0.5"
info:
  label: "Feeder Switch Status Lookup"
  description: "Retrieves the current status of a distribution feeder switch including open/closed state and load."
  tags:
    - grid-operations
    - distribution
    - switching
capability:
  exposes:
    - type: mcp
      namespace: feeder-switch
      port: 8080
      tools:
        - name: get-switch-status
          description: "Look up feeder switch status by switch ID."
          inputParameters:
            - name: switch_id
              in: body
              type: string
              description: "The feeder switch identifier."
          call: "scada.get-switch-status"
          with:
            switch_id: "{{switch_id}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.switch.state"
            - name: load_amps
              type: number
              mapping: "$.switch.load_amps"
  consumes:
    - type: http
      namespace: scada
      baseUri: "https://scada.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.scada_token"
      resources:
        - name: switches
          path: "/switches/{{switch_id}}/status"
          inputParameters:
            - name: switch_id
              in: path
          operations:
            - name: get-switch-status
              method: GET

Retrieves current gas pressure readings for a specified pipeline segment.

naftiko: "0.5"
info:
  label: "Gas Pressure Reading Lookup"
  description: "Retrieves current gas pressure readings for a specified pipeline segment."
  tags:
    - gas-operations
    - monitoring
    - safety
capability:
  exposes:
    - type: mcp
      namespace: gas-pressure
      port: 8080
      tools:
        - name: get-pressure-reading
          description: "Look up gas pipeline pressure by segment ID."
          inputParameters:
            - name: segment_id
              in: body
              type: string
              description: "The pipeline segment identifier."
          call: "gas-scada.get-pressure"
          with:
            segment_id: "{{segment_id}}"
          outputParameters:
            - name: pressure_psi
              type: number
              mapping: "$.reading.pressure_psi"
            - name: flow_rate
              type: number
              mapping: "$.reading.flow_rate"
  consumes:
    - type: http
      namespace: gas-scada
      baseUri: "https://gas-scada.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.gas_scada_token"
      resources:
        - name: segments
          path: "/segments/{{segment_id}}/pressure"
          inputParameters:
            - name: segment_id
              in: path
          operations:
            - name: get-pressure
              method: GET

Retrieves the geographic location and attributes of a grid asset from the GIS system, returning coordinates, asset type, installation date, and condition rating.

naftiko: "0.5"
info:
  label: "GIS Asset Location Lookup"
  description: "Retrieves the geographic location and attributes of a grid asset from the GIS system, returning coordinates, asset type, installation date, and condition rating."
  tags:
    - gis
    - asset-management
    - grid-infrastructure
capability:
  exposes:
    - type: mcp
      namespace: gis-assets
      port: 8080
      tools:
        - name: get-asset-location
          description: "Look up a grid asset in the GIS system. Returns coordinates, asset type, installation date, and condition."
          inputParameters:
            - name: asset_id
              in: body
              type: string
              description: "The GIS asset identifier."
          call: "gis.get-asset"
          with:
            asset_id: "{{asset_id}}"
          outputParameters:
            - name: latitude
              type: number
              mapping: "$.geometry.coordinates[1]"
            - name: longitude
              type: number
              mapping: "$.geometry.coordinates[0]"
            - name: asset_type
              type: string
              mapping: "$.properties.assetType"
            - name: installation_date
              type: string
              mapping: "$.properties.installDate"
            - name: condition_rating
              type: string
              mapping: "$.properties.conditionRating"
  consumes:
    - type: http
      namespace: gis
      baseUri: "https://gis.internal.coned.com/arcgis/rest/services"
      authentication:
        type: bearer
        token: "$secrets.gis_token"
      resources:
        - name: assets
          path: "/GridAssets/FeatureServer/0/query"
          operations:
            - name: get-asset
              method: GET

Retrieves the latest GitHub Actions workflow run status, returning conclusion, duration, and commit SHA.

naftiko: "0.5"
info:
  label: "GitHub Actions CI Build Status"
  description: "Retrieves the latest GitHub Actions workflow run status, returning conclusion, duration, and commit SHA."
  tags:
    - ci-cd
    - github-actions
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: ci-cd
      port: 8080
      tools:
        - name: get-build-status
          description: "Look up the latest GitHub Actions workflow run. Returns conclusion, duration, and commit SHA."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The repository in owner/repo format."
            - name: workflow_id
              in: body
              type: string
              description: "The workflow file name or ID."
          call: "github.get-workflow-run"
          with:
            repo: "{{repo}}"
            workflow_id: "{{workflow_id}}"
          outputParameters:
            - name: conclusion
              type: string
              mapping: "$.workflow_runs[0].conclusion"
            - name: duration_seconds
              type: number
              mapping: "$.workflow_runs[0].run_duration"
            - name: head_sha
              type: string
              mapping: "$.workflow_runs[0].head_sha"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/repos/{{repo}}/actions/workflows/{{workflow_id}}/runs"
          inputParameters:
            - name: repo
              in: path
            - name: workflow_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET

Checks GitHub repo at Con Edison.

naftiko: "0.5"
info:
  label: "GitHub Repo Check"
  description: "Checks GitHub repo at Con Edison."
  tags:
    - devops
    - github
    - version-control
capability:
  exposes:
    - type: mcp
      namespace: gh-repo
      port: 8080
      tools:
        - name: get-branch
          description: "Check branch at Con Edison."
          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

Retrieves a Grafana alert rule for grid monitoring, returning rule name, state, and evaluation interval.

naftiko: "0.5"
info:
  label: "Grafana Grid Alert Rule Lookup"
  description: "Retrieves a Grafana alert rule for grid monitoring, returning rule name, state, and evaluation interval."
  tags:
    - monitoring
    - grafana
    - alerting
capability:
  exposes:
    - type: mcp
      namespace: grid-alerting
      port: 8080
      tools:
        - name: get-grid-alert
          description: "Look up a Grafana grid alert rule. Returns name, state, and interval."
          inputParameters:
            - name: rule_uid
              in: body
              type: string
              description: "The Grafana alert rule UID."
          call: "grafana.get-alert-rule"
          with:
            rule_uid: "{{rule_uid}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: state
              type: string
              mapping: "$.state"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.internal.coned.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: alert-rules
          path: "/v1/provisioning/alert-rules/{{rule_uid}}"
          inputParameters:
            - name: rule_uid
              in: path
          operations:
            - name: get-alert-rule
              method: GET

Pulls historical load data from the data warehouse, runs the forecasting model in Databricks, stores the forecast in the grid planning system, and notifies the planning team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Grid Load Forecasting Pipeline"
  description: "Pulls historical load data from the data warehouse, runs the forecasting model in Databricks, stores the forecast in the grid planning system, and notifies the planning team via Microsoft Teams."
  tags:
    - grid-planning
    - forecasting
    - databricks
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: grid-forecasting
      port: 8080
      tools:
        - name: generate-load-forecast
          description: "Given a zone and forecast horizon, run the load forecasting pipeline and notify the planning team."
          inputParameters:
            - name: zone_id
              in: body
              type: string
              description: "The grid zone identifier."
            - name: forecast_days
              in: body
              type: number
              description: "Number of days to forecast ahead."
          steps:
            - name: get-historical-data
              type: call
              call: "data-warehouse.get-load-history"
              with:
                zone_id: "{{zone_id}}"
                lookback_days: 365
            - name: run-forecast
              type: call
              call: "databricks.run-job"
              with:
                job_id: "load_forecast_model"
                parameters:
                  zone_id: "{{zone_id}}"
                  forecast_days: "{{forecast_days}}"
            - name: store-forecast
              type: call
              call: "grid-planning.save-forecast"
              with:
                zone_id: "{{zone_id}}"
                forecast_data: "{{run-forecast.output}}"
            - name: notify-planning
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "grid-planning"
                text: "Load forecast generated for zone {{zone_id}}: {{forecast_days}}-day horizon. Peak demand: {{run-forecast.peak_mw}} MW. Report: {{store-forecast.report_url}}."
  consumes:
    - type: http
      namespace: data-warehouse
      baseUri: "https://api.internal.coned.com/datawarehouse/v1"
      authentication:
        type: bearer
        token: "$secrets.dw_token"
      resources:
        - name: load-history
          path: "/load/history"
          operations:
            - name: get-load-history
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://coned.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: grid-planning
      baseUri: "https://api.internal.coned.com/gridplanning/v1"
      authentication:
        type: bearer
        token: "$secrets.grid_planning_token"
      resources:
        - name: forecasts
          path: "/forecasts"
          operations:
            - name: save-forecast
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Escalates IT incidents at Con Edison via ServiceNow, PagerDuty, and Slack.

naftiko: "0.5"
info:
  label: "IT Incident Escalation Pipeline"
  description: "Escalates IT incidents at Con Edison 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 Con Edison."
          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://coned.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 a Jira issue by key, returning summary, status, assignee, and priority.

naftiko: "0.5"
info:
  label: "Jira Engineering Task Lookup"
  description: "Retrieves a Jira issue by key, returning summary, status, assignee, and priority."
  tags:
    - project-management
    - jira
    - engineering
capability:
  exposes:
    - type: mcp
      namespace: engineering-pm
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Look up a Jira issue by key. Returns summary, status, assignee, and priority."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g., GRID-1234)."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
            - name: priority
              type: string
              mapping: "$.fields.priority.name"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://conedison.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Retrieves sprint progress at Con Edison.

naftiko: "0.5"
info:
  label: "Jira Sprint Progress Lookup"
  description: "Retrieves sprint progress at Con Edison."
  tags:
    - project-management
    - jira
    - agile
capability:
  exposes:
    - type: mcp
      namespace: jira-sprint
      port: 8080
      tools:
        - name: get-sprint
          description: "Look up sprint at Con Edison."
          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://coned.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 Con Edison by finding stale articles and notifying owners.

naftiko: "0.5"
info:
  label: "Knowledge Base Maintenance Pipeline"
  description: "Maintains KB at Con Edison 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 Con Edison."
          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://coned.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.coned.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 Con Edison from Snowflake, Oracle, Power BI, and email.

naftiko: "0.5"
info:
  label: "Weekly KPI Digest Pipeline"
  description: "Generates KPI digest at Con Edison 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 Con Edison."
          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://coned.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.coned.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.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks license compliance at Con Edison via scanning, entitlements, and procurement.

naftiko: "0.5"
info:
  label: "License Compliance Pipeline"
  description: "Checks license compliance at Con Edison 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 Con Edison."
          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.coned.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.coned.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.coned.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://coned.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

Checks the status of a smart meter reading for a customer account.

naftiko: "0.5"
info:
  label: "Meter Reading Status Check"
  description: "Checks the status of a smart meter reading for a customer account."
  tags:
    - metering
    - smart-grid
    - customer-service
capability:
  exposes:
    - type: mcp
      namespace: meter-status
      port: 8080
      tools:
        - name: check-meter-reading
          description: "Check smart meter reading status by account number."
          inputParameters:
            - name: account_number
              in: body
              type: string
              description: "The customer account number."
          call: "meter-system.get-reading-status"
          with:
            account_number: "{{account_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.reading.status"
            - name: last_read
              type: string
              mapping: "$.reading.last_read_date"
  consumes:
    - type: http
      namespace: meter-system
      baseUri: "https://ami.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.meter_system_token"
      resources:
        - name: readings
          path: "/accounts/{{account_number}}/readings"
          inputParameters:
            - name: account_number
              in: path
          operations:
            - name: get-reading-status
              method: GET

Generates monthly security reports at Con Edison from Splunk and Qualys.

naftiko: "0.5"
info:
  label: "Monthly Security Report Pipeline"
  description: "Generates monthly security reports at Con Edison 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 Con Edison."
          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.coned.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.coned.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.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Onboards employees at Con Edison with Okta, ServiceNow, Slack, and calendar.

naftiko: "0.5"
info:
  label: "New Employee IT Onboarding Pipeline"
  description: "Onboards employees at Con Edison 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 Con Edison."
          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://coned.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://coned.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 Con Edison.

naftiko: "0.5"
info:
  label: "New Relic APM Check"
  description: "Checks New Relic APM at Con Edison."
  tags:
    - monitoring
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: nr-apm
      port: 8080
      tools:
        - name: check-apm
          description: "Check APM at Con Edison."
          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

Processes new electrical service connections by creating the work order in SAP, scheduling the engineering survey, and notifying the customer via email.

naftiko: "0.5"
info:
  label: "New Service Connection Pipeline"
  description: "Processes new electrical service connections by creating the work order in SAP, scheduling the engineering survey, and notifying the customer via email."
  tags:
    - customer-service
    - work-orders
    - sap
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: new-service
      port: 8080
      tools:
        - name: process-new-connection
          description: "Process a new electrical service connection request."
          inputParameters:
            - name: request_id
              in: body
              type: string
              description: "The service connection request ID."
            - name: customer_email
              in: body
              type: string
              description: "The customer email address."
          steps:
            - name: create-work-order
              type: call
              call: "sap.create-work-order"
              with:
                request_id: "{{request_id}}"
                type: "new_service"
            - name: schedule-survey
              type: call
              call: "scheduling.create-appointment"
              with:
                work_order: "{{create-work-order.order_id}}"
                type: "engineering_survey"
            - name: notify-customer
              type: call
              call: "email.send"
              with:
                to: "{{customer_email}}"
                subject: "Service Connection Request {{request_id}} - Survey Scheduled"
                body: "Your survey is scheduled for {{schedule-survey.date}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: work-orders
          path: "/work-orders"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: scheduling
      baseUri: "https://scheduling.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.scheduling_token"
      resources:
        - name: appointments
          path: "/appointments"
          operations:
            - name: create-appointment
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Checks Okta user at Con Edison.

naftiko: "0.5"
info:
  label: "Okta User Check"
  description: "Checks Okta user at Con Edison."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: okta-user
      port: 8080
      tools:
        - name: check-user
          description: "Check user at Con Edison."
          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://coned.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 an accounts payable invoice from Oracle E-Business Suite, returning invoice number, vendor, amount, payment status, and due date.

naftiko: "0.5"
info:
  label: "Oracle E-Business Suite Invoice Lookup"
  description: "Retrieves an accounts payable invoice from Oracle E-Business Suite, returning invoice number, vendor, amount, payment status, and due date."
  tags:
    - finance
    - oracle-e-business-suite
    - accounts-payable
capability:
  exposes:
    - type: mcp
      namespace: finance-ap
      port: 8080
      tools:
        - name: get-oracle-invoice
          description: "Look up an Oracle EBS invoice. Returns number, vendor, amount, payment status, and due date."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The Oracle EBS invoice ID."
          call: "oracle-ebs.get-invoice"
          with:
            invoice_id: "{{invoice_id}}"
          outputParameters:
            - name: invoice_number
              type: string
              mapping: "$.invoice.invoiceNumber"
            - name: vendor
              type: string
              mapping: "$.invoice.vendorName"
            - name: amount
              type: number
              mapping: "$.invoice.invoiceAmount"
            - name: payment_status
              type: string
              mapping: "$.invoice.paymentStatus"
            - name: due_date
              type: string
              mapping: "$.invoice.dueDate"
  consumes:
    - type: http
      namespace: oracle-ebs
      baseUri: "https://oracle-ebs.internal.coned.com/webservices/rest/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_ebs_user"
        password: "$secrets.oracle_ebs_password"
      resources:
        - name: invoices
          path: "/ap/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET

Retrieves a financial planning report from Oracle Hyperion, returning budget vs actual variance, department totals, and reporting period.

naftiko: "0.5"
info:
  label: "Oracle Hyperion Financial Report"
  description: "Retrieves a financial planning report from Oracle Hyperion, returning budget vs actual variance, department totals, and reporting period."
  tags:
    - finance
    - oracle-hyperion
    - financial-planning
capability:
  exposes:
    - type: mcp
      namespace: financial-planning
      port: 8080
      tools:
        - name: get-financial-report
          description: "Look up an Oracle Hyperion financial report. Returns budget vs actual, department totals, and period."
          inputParameters:
            - name: report_name
              in: body
              type: string
              description: "The Hyperion report name."
            - name: period
              in: body
              type: string
              description: "The reporting period (e.g., 2026-Q1)."
          call: "hyperion.get-report"
          with:
            report_name: "{{report_name}}"
            period: "{{period}}"
          outputParameters:
            - name: budget_total
              type: number
              mapping: "$.report.budgetTotal"
            - name: actual_total
              type: number
              mapping: "$.report.actualTotal"
            - name: variance_pct
              type: number
              mapping: "$.report.variancePercentage"
  consumes:
    - type: http
      namespace: hyperion
      baseUri: "https://hyperion.internal.coned.com/HyperionPlanning/rest/v3"
      authentication:
        type: basic
        username: "$secrets.hyperion_user"
        password: "$secrets.hyperion_password"
      resources:
        - name: reports
          path: "/applications/{{app_name}}/reports/{{report_name}}"
          inputParameters:
            - name: report_name
              in: path
          operations:
            - name: get-report
              method: GET

When a power outage is reported, creates a ServiceNow incident, dispatches a field crew via the workforce management system, and posts an alert to Microsoft Teams for the operations center.

naftiko: "0.5"
info:
  label: "Outage Incident Response Pipeline"
  description: "When a power outage is reported, creates a ServiceNow incident, dispatches a field crew via the workforce management system, and posts an alert to Microsoft Teams for the operations center."
  tags:
    - outage-management
    - servicenow
    - workforce-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: outage-ops
      port: 8080
      tools:
        - name: process-outage-report
          description: "Given outage location and severity, create a ServiceNow incident, dispatch a crew, and alert operations."
          inputParameters:
            - name: location_id
              in: body
              type: string
              description: "The grid location identifier for the outage."
            - name: severity
              in: body
              type: string
              description: "The outage severity (critical, major, minor)."
            - name: affected_customers
              in: body
              type: number
              description: "Estimated number of affected customers."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Power outage: Location {{location_id}}"
                category: "outage_management"
                priority: "{{severity}}"
                description: "Power outage at grid location {{location_id}}. Estimated {{affected_customers}} customers affected."
            - name: dispatch-crew
              type: call
              call: "workforce-mgmt.dispatch-crew"
              with:
                location_id: "{{location_id}}"
                priority: "{{severity}}"
                incident_number: "{{create-incident.number}}"
            - name: alert-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "outage-center"
                text: "OUTAGE ALERT: {{severity}} at {{location_id}}. ~{{affected_customers}} customers affected. Incident: {{create-incident.number}}. Crew dispatched: {{dispatch-crew.crew_id}}. ETA: {{dispatch-crew.eta}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://conedison.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: workforce-mgmt
      baseUri: "https://api.internal.coned.com/workforce/v1"
      authentication:
        type: bearer
        token: "$secrets.workforce_token"
      resources:
        - name: dispatch
          path: "/crews/dispatch"
          operations:
            - name: dispatch-crew
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the estimated time to restoration for an active outage, returning affected area, customer count, crew status, and ETR.

naftiko: "0.5"
info:
  label: "Outage Restoration ETR Lookup"
  description: "Retrieves the estimated time to restoration for an active outage, returning affected area, customer count, crew status, and ETR."
  tags:
    - outage-management
    - restoration
    - customer-communication
capability:
  exposes:
    - type: mcp
      namespace: outage-info
      port: 8080
      tools:
        - name: get-outage-etr
          description: "Look up outage ETR details. Returns affected area, customer count, crew status, and ETR."
          inputParameters:
            - name: outage_id
              in: body
              type: string
              description: "The outage event identifier."
          call: "oms.get-outage"
          with:
            outage_id: "{{outage_id}}"
          outputParameters:
            - name: affected_area
              type: string
              mapping: "$.outage.affectedArea"
            - name: customers_affected
              type: number
              mapping: "$.outage.customersAffected"
            - name: crew_status
              type: string
              mapping: "$.outage.crewStatus"
            - name: etr
              type: string
              mapping: "$.outage.estimatedRestoration"
  consumes:
    - type: http
      namespace: oms
      baseUri: "https://api.internal.coned.com/oms/v1"
      authentication:
        type: bearer
        token: "$secrets.oms_token"
      resources:
        - name: outages
          path: "/outages/{{outage_id}}"
          inputParameters:
            - name: outage_id
              in: path
          operations:
            - name: get-outage
              method: GET

Checks on-call at Con Edison.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Check"
  description: "Checks on-call at Con Edison."
  tags:
    - incident-management
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: pd-oncall
      port: 8080
      tools:
        - name: get-oncall
          description: "Check on-call at Con Edison."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "Schedule ID."
          call: "pagerduty.get-oncall"
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user
              type: string
              mapping: "$.oncalls[0].user.summary"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          operations:
            - name: get-oncall
              method: GET

Retrieves an OT network firewall rule from Palo Alto Networks, returning rule action, source zones, destination zones, and applications.

naftiko: "0.5"
info:
  label: "Palo Alto Firewall OT Rule Lookup"
  description: "Retrieves an OT network firewall rule from Palo Alto Networks, returning rule action, source zones, destination zones, and applications."
  tags:
    - security
    - firewall
    - palo-alto-networks
    - ot-security
capability:
  exposes:
    - type: mcp
      namespace: ot-security
      port: 8080
      tools:
        - name: get-ot-firewall-rule
          description: "Look up a Palo Alto OT firewall rule. Returns action, source zones, destination zones, and applications."
          inputParameters:
            - name: rule_name
              in: body
              type: string
              description: "The firewall rule name."
          call: "paloalto.get-rule"
          with:
            rule_name: "{{rule_name}}"
          outputParameters:
            - name: action
              type: string
              mapping: "$.result.entry.action"
            - name: source_zones
              type: string
              mapping: "$.result.entry.from.member"
            - name: destination_zones
              type: string
              mapping: "$.result.entry.to.member"
  consumes:
    - type: http
      namespace: paloalto
      baseUri: "https://panorama.internal.coned.com/restapi/v10.2"
      authentication:
        type: apiKey
        key: "$secrets.paloalto_api_key"
      resources:
        - name: security-rules
          path: "/Policies/SecurityRules"
          operations:
            - name: get-rule
              method: GET

When a construction permit is needed, creates the permit request in the permitting system, attaches engineering drawings from SharePoint, and notifies the permitting team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Permit Application Pipeline"
  description: "When a construction permit is needed, creates the permit request in the permitting system, attaches engineering drawings from SharePoint, and notifies the permitting team via Microsoft Teams."
  tags:
    - construction
    - permitting
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: construction-permits
      port: 8080
      tools:
        - name: submit-permit-application
          description: "Given project details, create a permit application, attach drawings, and notify the permitting team."
          inputParameters:
            - name: project_id
              in: body
              type: string
              description: "The construction project ID."
            - name: permit_type
              in: body
              type: string
              description: "The permit type (street-opening, excavation, overhead)."
            - name: location
              in: body
              type: string
              description: "The work location address."
          steps:
            - name: create-permit
              type: call
              call: "permit-system.create-application"
              with:
                project_id: "{{project_id}}"
                permit_type: "{{permit_type}}"
                location: "{{location}}"
            - name: get-drawings
              type: call
              call: "sharepoint.get-project-drawings"
              with:
                site_id: "engineering"
                project_id: "{{project_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "permitting"
                text: "New permit application: {{permit_type}} for project {{project_id}} at {{location}}. Permit #: {{create-permit.permit_number}}. Drawings: {{get-drawings.url}}."
  consumes:
    - type: http
      namespace: permit-system
      baseUri: "https://api.internal.coned.com/permits/v1"
      authentication:
        type: bearer
        token: "$secrets.permit_token"
      resources:
        - name: applications
          path: "/applications"
          operations:
            - name: create-application
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: project-drawings
          path: "/engineering/drive/root:/Projects/{{project_id}}"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: get-project-drawings
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the inspection status and condition rating for a utility pole.

naftiko: "0.5"
info:
  label: "Pole Inspection Status"
  description: "Retrieves the inspection status and condition rating for a utility pole."
  tags:
    - infrastructure
    - inspection
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: pole-inspection
      port: 8080
      tools:
        - name: get-pole-status
          description: "Look up utility pole inspection status."
          inputParameters:
            - name: pole_id
              in: body
              type: string
              description: "The utility pole identifier."
          call: "asset-mgmt.get-pole-inspection"
          with:
            pole_id: "{{pole_id}}"
          outputParameters:
            - name: condition_rating
              type: string
              mapping: "$.pole.condition_rating"
            - name: last_inspection
              type: string
              mapping: "$.pole.last_inspection_date"
  consumes:
    - type: http
      namespace: asset-mgmt
      baseUri: "https://asset-management.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.asset_mgmt_token"
      resources:
        - name: poles
          path: "/poles/{{pole_id}}/inspection"
          inputParameters:
            - name: pole_id
              in: path
          operations:
            - name: get-pole-inspection
              method: GET

Triggers a Power BI dataset refresh for the grid performance dashboard and returns the refresh status.

naftiko: "0.5"
info:
  label: "Power BI Grid Performance Dashboard"
  description: "Triggers a Power BI dataset refresh for the grid performance dashboard and returns the refresh status."
  tags:
    - analytics
    - power-bi
    - grid-performance
capability:
  exposes:
    - type: mcp
      namespace: grid-analytics
      port: 8080
      tools:
        - name: refresh-grid-dashboard
          description: "Trigger a Power BI dataset refresh for grid analytics. Returns refresh status."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "The Power BI workspace ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.refresh-dataset"
          with:
            workspace_id: "{{workspace_id}}"
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: refresh_id
              type: string
              mapping: "$.id"
            - name: status
              type: string
              mapping: "$.status"
  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/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Checks Power BI refresh at Con Edison.

naftiko: "0.5"
info:
  label: "Power BI Refresh Check"
  description: "Checks Power BI refresh at Con Edison."
  tags:
    - analytics
    - power-bi
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: pbi-refresh
      port: 8080
      tools:
        - name: check-refresh
          description: "Check refresh at Con Edison."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "Dataset ID."
          call: "power-bi.get-refresh"
          with:
            dataset_id: "{{dataset_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.value[0].status"
  consumes:
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh
              method: GET

When an equipment maintenance window approaches, creates a SAP work order, schedules the crew in the workforce system, and notifies the operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Preventive Maintenance Scheduling Pipeline"
  description: "When an equipment maintenance window approaches, creates a SAP work order, schedules the crew in the workforce system, and notifies the operations team via Microsoft Teams."
  tags:
    - maintenance
    - sap
    - workforce-management
    - microsoft-teams
    - scheduling
capability:
  exposes:
    - type: mcp
      namespace: maintenance-scheduling
      port: 8080
      tools:
        - name: schedule-preventive-maintenance
          description: "Given equipment ID and maintenance type, create a work order, schedule the crew, and notify operations."
          inputParameters:
            - name: equipment_id
              in: body
              type: string
              description: "The SAP equipment identifier."
            - name: maintenance_type
              in: body
              type: string
              description: "The maintenance activity type (e.g., inspection, overhaul, testing)."
            - name: planned_date
              in: body
              type: string
              description: "The planned maintenance date in YYYY-MM-DD format."
          steps:
            - name: create-work-order
              type: call
              call: "sap.create-maintenance-order"
              with:
                equipment: "{{equipment_id}}"
                order_type: "PM01"
                activity_type: "{{maintenance_type}}"
                planned_start: "{{planned_date}}"
            - name: schedule-crew
              type: call
              call: "workforce-mgmt.schedule-assignment"
              with:
                work_order: "{{create-work-order.order_number}}"
                equipment_id: "{{equipment_id}}"
                date: "{{planned_date}}"
                skill_required: "{{maintenance_type}}"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "maintenance-ops"
                text: "PM scheduled: {{maintenance_type}} on equipment {{equipment_id}} for {{planned_date}}. WO: {{create-work-order.order_number}}. Crew: {{schedule-crew.crew_id}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://coned-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-maintenance-order
              method: POST
    - type: http
      namespace: workforce-mgmt
      baseUri: "https://api.internal.coned.com/workforce/v1"
      authentication:
        type: bearer
        token: "$secrets.workforce_token"
      resources:
        - name: assignments
          path: "/assignments"
          operations:
            - name: schedule-assignment
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Generates compliance reports at Con Edison from Snowflake, Power BI, and email.

naftiko: "0.5"
info:
  label: "Quarterly Compliance Report Pipeline"
  description: "Generates compliance reports at Con Edison 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 Con Edison."
          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://coned.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.coned.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.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST

Extracts compliance data from SAP BW, generates a regulatory filing report, uploads to SharePoint, and notifies the compliance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Regulatory Compliance Report Pipeline"
  description: "Extracts compliance data from SAP BW, generates a regulatory filing report, uploads to SharePoint, and notifies the compliance team via Microsoft Teams."
  tags:
    - compliance
    - regulatory-reporting
    - sap-bw
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory-compliance
      port: 8080
      tools:
        - name: generate-compliance-report
          description: "Given a reporting period and report type, extract SAP BW data, generate the report, upload, and notify compliance."
          inputParameters:
            - name: report_period
              in: body
              type: string
              description: "The reporting period in YYYY-MM format."
            - name: report_type
              in: body
              type: string
              description: "The regulatory report type (e.g., NYPSC, FERC, EPA)."
          steps:
            - name: extract-data
              type: call
              call: "sapbw.run-query"
              with:
                query_name: "REG_{{report_type}}"
                period: "{{report_period}}"
            - name: generate-report
              type: call
              call: "reporting-engine.transform"
              with:
                data: "{{extract-data.results}}"
                template: "{{report_type}}"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "regulatory_reports"
                file_path: "{{report_type}}/{{report_period}}.xlsx"
                content: "{{generate-report.file_content}}"
            - name: notify-compliance
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "regulatory-compliance"
                text: "{{report_type}} report for {{report_period}} generated. File: {{upload-report.url}}."
  consumes:
    - type: http
      namespace: sapbw
      baseUri: "https://coned-bw.sap.com/sap/bw/ina"
      authentication:
        type: basic
        username: "$secrets.sapbw_user"
        password: "$secrets.sapbw_password"
      resources:
        - name: queries
          path: "/GetResponse"
          operations:
            - name: run-query
              method: POST
    - type: http
      namespace: reporting-engine
      baseUri: "https://api.internal.coned.com/reporting/v1"
      authentication:
        type: bearer
        token: "$secrets.reporting_token"
      resources:
        - name: transform
          path: "/transform"
          operations:
            - name: transform
              method: POST
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              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: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves current relay protection settings for a substation breaker.

naftiko: "0.5"
info:
  label: "Relay Protection Settings Lookup"
  description: "Retrieves current relay protection settings for a substation breaker."
  tags:
    - substation
    - protection
    - grid-operations
capability:
  exposes:
    - type: mcp
      namespace: relay-settings
      port: 8080
      tools:
        - name: get-relay-settings
          description: "Look up relay protection settings by breaker ID."
          inputParameters:
            - name: breaker_id
              in: body
              type: string
              description: "The substation breaker identifier."
          call: "scada.get-relay-settings"
          with:
            breaker_id: "{{breaker_id}}"
          outputParameters:
            - name: pickup_current
              type: number
              mapping: "$.relay.pickup_current"
            - name: time_dial
              type: number
              mapping: "$.relay.time_dial"
  consumes:
    - type: http
      namespace: scada
      baseUri: "https://scada.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.scada_token"
      resources:
        - name: relays
          path: "/breakers/{{breaker_id}}/relay-settings"
          inputParameters:
            - name: breaker_id
              in: path
          operations:
            - name: get-relay-settings
              method: GET

Pulls solar and wind generation data from the SCADA system, generates a renewable energy report in Power BI, and emails the summary to the sustainability team via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Renewable Energy Generation Report Pipeline"
  description: "Pulls solar and wind generation data from the SCADA system, generates a renewable energy report in Power BI, and emails the summary to the sustainability team via Microsoft Outlook."
  tags:
    - renewable-energy
    - scada
    - power-bi
    - microsoft-outlook
    - sustainability
capability:
  exposes:
    - type: mcp
      namespace: renewable-reporting
      port: 8080
      tools:
        - name: generate-renewable-report
          description: "Given a date range, pull renewable generation data, refresh the Power BI report, and email to the sustainability team."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-solar-data
              type: call
              call: "scada.get-generation"
              with:
                source_type: "solar"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: get-wind-data
              type: call
              call: "scada.get-generation"
              with:
                source_type: "wind"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                workspace_id: "sustainability"
                dataset_id: "renewable_generation"
            - name: send-email
              type: call
              call: "outlook.send-email"
              with:
                to: "sustainability@coned.com"
                subject: "Renewable Energy Report: {{start_date}} to {{end_date}}"
                body: "Solar generation: {{get-solar-data.total_mwh}} MWh. Wind generation: {{get-wind-data.total_mwh}} MWh. Dashboard refreshed."
  consumes:
    - type: http
      namespace: scada
      baseUri: "https://scada.internal.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.scada_token"
      resources:
        - name: generation
          path: "/generation"
          operations:
            - name: get-generation
              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/{{workspace_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: workspace_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{from}}/sendMail"
          operations:
            - name: send-email
              method: POST

When a workplace safety incident occurs, creates an incident record in ServiceNow, notifies the safety officer via Microsoft Teams, and triggers an OSHA reporting assessment.

naftiko: "0.5"
info:
  label: "Safety Incident Report Pipeline"
  description: "When a workplace safety incident occurs, creates an incident record in ServiceNow, notifies the safety officer via Microsoft Teams, and triggers an OSHA reporting assessment."
  tags:
    - safety
    - incident-reporting
    - servicenow
    - microsoft-teams
    - osha
capability:
  exposes:
    - type: mcp
      namespace: safety-reporting
      port: 8080
      tools:
        - name: report-safety-incident
          description: "Given incident details, create a ServiceNow record, notify safety officer, and assess OSHA reporting."
          inputParameters:
            - name: location
              in: body
              type: string
              description: "The incident location."
            - name: incident_type
              in: body
              type: string
              description: "The incident type (injury, near-miss, property-damage)."
            - name: description
              in: body
              type: string
              description: "Description of the incident."
            - name: severity
              in: body
              type: string
              description: "Incident severity (critical, serious, minor)."
          steps:
            - name: create-record
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Safety incident: {{incident_type}} at {{location}}"
                category: "safety_incident"
                priority: "{{severity}}"
                description: "{{description}}"
            - name: assess-osha
              type: call
              call: "safety-system.assess-osha-reportability"
              with:
                incident_type: "{{incident_type}}"
                severity: "{{severity}}"
            - name: notify-safety
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "safety-ops"
                text: "SAFETY INCIDENT: {{incident_type}} ({{severity}}) at {{location}}. ServiceNow: {{create-record.number}}. OSHA reportable: {{assess-osha.reportable}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://conedison.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: safety-system
      baseUri: "https://api.internal.coned.com/safety/v1"
      authentication:
        type: bearer
        token: "$secrets.safety_token"
      resources:
        - name: osha
          path: "/osha/assess"
          operations:
            - name: assess-osha-reportability
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves a Salesforce customer account, returning account name, service address, account status, and last interaction date.

naftiko: "0.5"
info:
  label: "Salesforce Customer Account Lookup"
  description: "Retrieves a Salesforce customer account, returning account name, service address, account status, and last interaction date."
  tags:
    - crm
    - salesforce
    - customer-management
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-customer-account
          description: "Look up a Salesforce customer account. Returns name, address, status, and last interaction."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: service_address
              type: string
              mapping: "$.BillingAddress"
            - name: status
              type: string
              mapping: "$.Status__c"
            - name: last_interaction
              type: string
              mapping: "$.LastActivityDate"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://conedison.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

When a travel expense report is submitted in SAP Concur, validates against policy, routes for manager approval in Workday, and notifies the submitter via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Expense Pipeline"
  description: "When a travel expense report is submitted in SAP Concur, validates against policy, routes for manager approval in Workday, and notifies the submitter via Microsoft Outlook."
  tags:
    - expense-management
    - sap-concur
    - workday
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: expense-management
      port: 8080
      tools:
        - name: process-travel-expense
          description: "Given a Concur report ID and submitter, validate policy, route approval, and notify."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: submitter_employee_id
              in: body
              type: string
              description: "The Workday employee ID of the submitter."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{report_id}}"
            - name: get-submitter
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{submitter_employee_id}}"
            - name: get-manager
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{get-submitter.manager_id}}"
            - name: notify-submitter
              type: call
              call: "outlook.send-email"
              with:
                to: "{{get-submitter.work_email}}"
                subject: "Expense report {{report_id}} submitted"
                body: "Your expense report totalling ${{get-report.total_amount}} has been routed to {{get-manager.full_name}} for approval."
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us2.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: 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: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/users/{{to}}/sendMail"
          inputParameters:
            - name: to
              in: path
          operations:
            - name: send-email
              method: POST

Checks SAP PO at Con Edison.

naftiko: "0.5"
info:
  label: "SAP PO Check"
  description: "Checks SAP PO at Con Edison."
  tags:
    - procurement
    - sap
    - purchase-orders
capability:
  exposes:
    - type: mcp
      namespace: sap-po
      port: 8080
      tools:
        - name: get-po
          description: "Check PO at Con Edison."
          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.coned.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 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 status, vendor, total value, and delivery date."
  tags:
    - procurement
    - erp
    - sap
    - purchase-order
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP purchase order. Returns status, vendor, total value, and delivery date."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
          call: "sap.get-po"
          with:
            po_number: "{{po_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OverallStatus"
            - name: vendor
              type: string
              mapping: "$.d.Supplier.CompanyName"
            - name: total_value
              type: string
              mapping: "$.d.TotalAmount"
            - name: delivery_date
              type: string
              mapping: "$.d.DeliveryDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://coned-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

Looks up a SAP Plant Maintenance work order by number and returns order status, equipment, planned dates, and assigned technician.

naftiko: "0.5"
info:
  label: "SAP Work Order Status"
  description: "Looks up a SAP Plant Maintenance work order by number and returns order status, equipment, planned dates, and assigned technician."
  tags:
    - maintenance
    - erp
    - sap
    - work-order
capability:
  exposes:
    - type: mcp
      namespace: plant-maintenance
      port: 8080
      tools:
        - name: get-work-order
          description: "Look up a SAP Plant Maintenance work order. Returns status, equipment, dates, and assigned technician."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP work order number."
          call: "sap.get-work-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OrderStatus"
            - name: equipment
              type: string
              mapping: "$.d.Equipment"
            - name: planned_start
              type: string
              mapping: "$.d.PlannedStartDate"
            - name: planned_end
              type: string
              mapping: "$.d.PlannedEndDate"
            - name: technician
              type: string
              mapping: "$.d.PersonResponsible"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://coned-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
      resources:
        - name: work-orders
          path: "/MaintenanceOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-work-order
              method: GET

Retrieves real-time SCADA meter readings for a given substation, returning voltage, current, power factor, and load percentage.

naftiko: "0.5"
info:
  label: "SCADA Meter Reading Retrieval"
  description: "Retrieves real-time SCADA meter readings for a given substation, returning voltage, current, power factor, and load percentage."
  tags:
    - scada
    - metering
    - grid-operations
capability:
  exposes:
    - type: mcp
      namespace: grid-monitoring
      port: 8080
      tools:
        - name: get-meter-reading
          description: "Look up real-time SCADA meter data for a substation. Returns voltage, current, power factor, and load percentage."
          inputParameters:
            - name: substation_id
              in: body
              type: string
              description: "The substation identifier."
            - name: meter_point
              in: body
              type: string
              description: "The metering point ID within the substation."
          call: "scada.get-reading"
          with:
            substation_id: "{{substation_id}}"
            meter_point: "{{meter_point}}"
          outputParameters:
            - name: voltage_kv
              type: number
              mapping: "$.reading.voltage"
            - name: current_a
              type: number
              mapping: "$.reading.current"
            - name: power_factor
              type: number
              mapping: "$.reading.powerFactor"
            - name: load_pct
              type: number
              mapping: "$.reading.loadPercentage"
  consumes:
    - type: http
      namespace: scada
      baseUri: "https://scada.internal.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.scada_token"
      resources:
        - name: readings
          path: "/substations/{{substation_id}}/meters/{{meter_point}}"
          inputParameters:
            - name: substation_id
              in: path
            - name: meter_point
              in: path
          operations:
            - name: get-reading
              method: GET

Remediates vulnerabilities at Con Edison via scanning, Jira, and Slack.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "Remediates vulnerabilities at Con Edison 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 Con Edison."
          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.coned.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://coned.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

Retrieves a ServiceNow change request status, returning state, approval status, planned start, and risk assessment.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Status"
  description: "Retrieves a ServiceNow change request status, returning state, approval status, planned start, and risk assessment."
  tags:
    - change-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: get-change-request
          description: "Look up a ServiceNow change request. Returns state, approval, planned start, and risk."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number."
          call: "servicenow.get-change"
          with:
            change_number: "{{change_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: approval
              type: string
              mapping: "$.result.approval"
            - name: planned_start
              type: string
              mapping: "$.result.start_date"
            - name: risk
              type: string
              mapping: "$.result.risk"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://conedison.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: get-change
              method: GET

Checks IT incident in ServiceNow for Con Edison.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Detail Check"
  description: "Checks IT incident in ServiceNow for Con Edison."
  tags:
    - it-service
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: snow-incident
      port: 8080
      tools:
        - name: check-incident
          description: "Check incident at Con Edison."
          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://coned.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET

Retrieves SharePoint metadata at Con Edison.

naftiko: "0.5"
info:
  label: "SharePoint File Metadata"
  description: "Retrieves SharePoint metadata at Con Edison."
  tags:
    - document-management
    - sharepoint
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: sp-docs
      port: 8080
      tools:
        - name: get-file
          description: "Look up file at Con Edison."
          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 Con Edison via Datadog and Slack.

naftiko: "0.5"
info:
  label: "SLA Monitoring Pipeline"
  description: "Monitors SLAs at Con Edison 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 Con Edison."
          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://coned.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

Retrieves smart meter interval data from the AMI system, runs analytics in Databricks, and stores aggregated consumption data for billing.

naftiko: "0.5"
info:
  label: "Smart Meter Data Pipeline"
  description: "Retrieves smart meter interval data from the AMI system, runs analytics in Databricks, and stores aggregated consumption data for billing."
  tags:
    - ami
    - smart-meter
    - databricks
    - billing
capability:
  exposes:
    - type: mcp
      namespace: meter-data
      port: 8080
      tools:
        - name: process-meter-data
          description: "Given a meter ID and date range, pull interval data, run analytics, and update billing consumption."
          inputParameters:
            - name: meter_id
              in: body
              type: string
              description: "The smart meter identifier."
            - name: start_date
              in: body
              type: string
              description: "Start date in YYYY-MM-DD format."
            - name: end_date
              in: body
              type: string
              description: "End date in YYYY-MM-DD format."
          steps:
            - name: get-interval-data
              type: call
              call: "ami.get-meter-data"
              with:
                meter_id: "{{meter_id}}"
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: run-analytics
              type: call
              call: "databricks.run-job"
              with:
                job_id: "meter_analytics"
                parameters:
                  meter_id: "{{meter_id}}"
                  data: "{{get-interval-data.intervals}}"
            - name: update-billing
              type: call
              call: "billing.update-consumption"
              with:
                meter_id: "{{meter_id}}"
                total_kwh: "{{run-analytics.total_consumption}}"
                peak_demand_kw: "{{run-analytics.peak_demand}}"
  consumes:
    - type: http
      namespace: ami
      baseUri: "https://api.internal.coned.com/ami/v1"
      authentication:
        type: bearer
        token: "$secrets.ami_token"
      resources:
        - name: meters
          path: "/meters/{{meter_id}}/intervals"
          inputParameters:
            - name: meter_id
              in: path
          operations:
            - name: get-meter-data
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://coned.cloud.databricks.com/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: billing
      baseUri: "https://api.internal.coned.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.billing_token"
      resources:
        - name: consumption
          path: "/accounts/consumption"
          operations:
            - name: update-consumption
              method: POST

Executes a SQL query against the Snowflake grid data warehouse and returns the result set and execution time.

naftiko: "0.5"
info:
  label: "Snowflake Grid Data Query"
  description: "Executes a SQL query against the Snowflake grid data warehouse and returns the result set and execution time."
  tags:
    - data-warehouse
    - snowflake
    - grid-analytics
capability:
  exposes:
    - type: mcp
      namespace: grid-warehouse
      port: 8080
      tools:
        - name: run-grid-query
          description: "Execute a SQL query on the Snowflake grid warehouse. Returns row count and execution time."
          inputParameters:
            - name: sql
              in: body
              type: string
              description: "The SQL query."
          call: "snowflake.execute-query"
          with:
            statement: "{{sql}}"
          outputParameters:
            - name: rows_returned
              type: number
              mapping: "$.resultSetMetaData.numRows"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://coned.us-east-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Retrieves the status of a network device from SolarWinds, returning node name, IP address, status, response time, and CPU load.

naftiko: "0.5"
info:
  label: "SolarWinds Network Device Status"
  description: "Retrieves the status of a network device from SolarWinds, returning node name, IP address, status, response time, and CPU load."
  tags:
    - network-monitoring
    - solarwinds
capability:
  exposes:
    - type: mcp
      namespace: network-ops
      port: 8080
      tools:
        - name: get-network-device
          description: "Look up a network device in SolarWinds. Returns node name, IP, status, response time, and CPU load."
          inputParameters:
            - name: node_id
              in: body
              type: string
              description: "The SolarWinds node ID."
          call: "solarwinds.get-node"
          with:
            node_id: "{{node_id}}"
          outputParameters:
            - name: node_name
              type: string
              mapping: "$.Caption"
            - name: ip_address
              type: string
              mapping: "$.IPAddress"
            - name: status
              type: string
              mapping: "$.StatusDescription"
            - name: response_time_ms
              type: number
              mapping: "$.ResponseTime"
            - name: cpu_load
              type: number
              mapping: "$.CPULoad"
  consumes:
    - type: http
      namespace: solarwinds
      baseUri: "https://solarwinds.internal.coned.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

Runs a security or operational event search in Splunk for grid infrastructure, returning event count, top sources, and severity breakdown.

naftiko: "0.5"
info:
  label: "Splunk Grid Event Search"
  description: "Runs a security or operational event search in Splunk for grid infrastructure, returning event count, top sources, and severity breakdown."
  tags:
    - monitoring
    - splunk
    - grid-security
capability:
  exposes:
    - type: mcp
      namespace: grid-security
      port: 8080
      tools:
        - name: search-grid-events
          description: "Search Splunk for grid infrastructure events. Returns event count and top sources."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The SPL search query."
            - name: time_range
              in: body
              type: string
              description: "The time range (e.g., -24h, -7d)."
          call: "splunk.run-search"
          with:
            search: "{{search_query}}"
            earliest_time: "{{time_range}}"
          outputParameters:
            - name: event_count
              type: number
              mapping: "$.results.total"
            - name: top_sources
              type: string
              mapping: "$.results.top_sources"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.internal.coned.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs/export"
          operations:
            - name: run-search
              method: POST

Searches Splunk at Con Edison.

naftiko: "0.5"
info:
  label: "Splunk Log Search"
  description: "Searches Splunk at Con Edison."
  tags:
    - security
    - splunk
    - logging
capability:
  exposes:
    - type: mcp
      namespace: splunk-search
      port: 8080
      tools:
        - name: search-logs
          description: "Search logs at Con Edison."
          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.coned.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search
          path: "/search/jobs"
          operations:
            - name: search
              method: POST

Retrieves steam system pressure and temperature readings from SCADA for a distribution network segment, returning pressure PSI, temperature, and flow rate.

naftiko: "0.5"
info:
  label: "Steam System Pressure Monitoring"
  description: "Retrieves steam system pressure and temperature readings from SCADA for a distribution network segment, returning pressure PSI, temperature, and flow rate."
  tags:
    - steam
    - scada
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: steam-monitoring
      port: 8080
      tools:
        - name: get-steam-readings
          description: "Look up steam system readings. Returns pressure PSI, temperature, and flow rate."
          inputParameters:
            - name: segment_id
              in: body
              type: string
              description: "The steam distribution segment ID."
          call: "scada.get-steam-data"
          with:
            segment_id: "{{segment_id}}"
          outputParameters:
            - name: pressure_psi
              type: number
              mapping: "$.steam.pressure"
            - name: temperature_f
              type: number
              mapping: "$.steam.temperature"
            - name: flow_rate
              type: number
              mapping: "$.steam.flowRate"
  consumes:
    - type: http
      namespace: scada
      baseUri: "https://scada.internal.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.scada_token"
      resources:
        - name: steam
          path: "/steam/segments/{{segment_id}}"
          inputParameters:
            - name: segment_id
              in: path
          operations:
            - name: get-steam-data
              method: GET

When a severe weather alert is issued, retrieves the forecast impact from the weather service, pre-positions crews via the workforce system, activates the emergency operations center, and notifies leadership via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Storm Preparedness Pipeline"
  description: "When a severe weather alert is issued, retrieves the forecast impact from the weather service, pre-positions crews via the workforce system, activates the emergency operations center, and notifies leadership via Microsoft Teams."
  tags:
    - storm-management
    - emergency-preparedness
    - workforce-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: storm-ops
      port: 8080
      tools:
        - name: activate-storm-preparedness
          description: "Given a weather alert ID and affected zones, pre-position crews, activate EOC, and notify leadership."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The weather service alert identifier."
            - name: affected_zones
              in: body
              type: string
              description: "Comma-separated list of affected grid zones."
            - name: expected_severity
              in: body
              type: string
              description: "Expected storm severity (tropical-storm, nor-easter, ice-storm, thunderstorm)."
          steps:
            - name: get-forecast
              type: call
              call: "weather-service.get-impact-forecast"
              with:
                alert_id: "{{alert_id}}"
                zones: "{{affected_zones}}"
            - name: pre-position-crews
              type: call
              call: "workforce-mgmt.pre-position"
              with:
                zones: "{{affected_zones}}"
                crew_count: "{{get-forecast.recommended_crews}}"
                severity: "{{expected_severity}}"
            - name: activate-eoc
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Storm preparedness: {{expected_severity}} - Alert {{alert_id}}"
                category: "storm_management"
                priority: "critical"
                description: "Zones: {{affected_zones}}. Estimated outages: {{get-forecast.estimated_outages}}. Crews pre-positioned: {{pre-position-crews.total_crews}}."
            - name: notify-leadership
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "storm-command"
                text: "STORM PREP ACTIVATED: {{expected_severity}}. Zones: {{affected_zones}}. Est. outages: {{get-forecast.estimated_outages}}. {{pre-position-crews.total_crews}} crews pre-positioned. EOC incident: {{activate-eoc.number}}."
  consumes:
    - type: http
      namespace: weather-service
      baseUri: "https://api.internal.coned.com/weather/v1"
      authentication:
        type: bearer
        token: "$secrets.weather_token"
      resources:
        - name: forecasts
          path: "/impact-forecast"
          operations:
            - name: get-impact-forecast
              method: POST
    - type: http
      namespace: workforce-mgmt
      baseUri: "https://api.internal.coned.com/workforce/v1"
      authentication:
        type: bearer
        token: "$secrets.workforce_token"
      resources:
        - name: pre-position
          path: "/crews/pre-position"
          operations:
            - name: pre-position
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://conedison.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves real-time transformer load data for a substation, returning load percentage, oil temperature, and winding temperature.

naftiko: "0.5"
info:
  label: "Substation Transformer Load Monitoring"
  description: "Retrieves real-time transformer load data for a substation, returning load percentage, oil temperature, and winding temperature."
  tags:
    - transformer
    - monitoring
    - grid-operations
capability:
  exposes:
    - type: mcp
      namespace: transformer-monitoring
      port: 8080
      tools:
        - name: get-transformer-load
          description: "Look up transformer load data. Returns load percentage, oil temp, and winding temp."
          inputParameters:
            - name: transformer_id
              in: body
              type: string
              description: "The transformer asset ID."
          call: "scada.get-transformer-data"
          with:
            transformer_id: "{{transformer_id}}"
          outputParameters:
            - name: load_pct
              type: number
              mapping: "$.transformer.loadPercentage"
            - name: oil_temp_c
              type: number
              mapping: "$.transformer.oilTemperature"
            - name: winding_temp_c
              type: number
              mapping: "$.transformer.windingTemperature"
  consumes:
    - type: http
      namespace: scada
      baseUri: "https://scada.internal.coned.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.scada_token"
      resources:
        - name: transformers
          path: "/transformers/{{transformer_id}}"
          inputParameters:
            - name: transformer_id
              in: path
          operations:
            - name: get-transformer-data
              method: GET

Retrieves metadata for a Tableau grid operations workbook, returning view count, last refresh time, and data source status.

naftiko: "0.5"
info:
  label: "Tableau Grid Operations Dashboard"
  description: "Retrieves metadata for a Tableau grid operations workbook, returning view count, last refresh time, and data source status."
  tags:
    - analytics
    - tableau
    - grid-operations
capability:
  exposes:
    - type: mcp
      namespace: ops-analytics
      port: 8080
      tools:
        - name: get-grid-dashboard-info
          description: "Look up Tableau grid operations workbook metadata. Returns view count, last refresh, and data source status."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "The Tableau workbook ID."
          call: "tableau.get-workbook"
          with:
            workbook_id: "{{workbook_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.workbook.name"
            - name: view_count
              type: number
              mapping: "$.workbook.viewCount"
            - name: last_refresh
              type: string
              mapping: "$.workbook.updatedAt"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.internal.coned.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/{{site_id}}/workbooks/{{workbook_id}}"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: get-workbook
              method: GET

Retrieves Teams activity at Con Edison.

naftiko: "0.5"
info:
  label: "Teams Channel Activity"
  description: "Retrieves Teams activity at Con Edison."
  tags:
    - communications
    - microsoft-teams
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: teams-activity
      port: 8080
      tools:
        - name: get-activity
          description: "Check Teams activity at Con Edison."
          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

Checks Terraform workspace at Con Edison.

naftiko: "0.5"
info:
  label: "Terraform Workspace Check"
  description: "Checks Terraform workspace at Con Edison."
  tags:
    - infrastructure
    - terraform
    - iac
capability:
  exposes:
    - type: mcp
      namespace: tf-ws
      port: 8080
      tools:
        - name: check-ws
          description: "Check workspace at Con Edison."
          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

Retrieves dissolved gas analysis results for a transformer from the lab system, returning hydrogen, methane, acetylene levels, and condition assessment.

naftiko: "0.5"
info:
  label: "Transformer Oil Analysis Lookup"
  description: "Retrieves dissolved gas analysis results for a transformer from the lab system, returning hydrogen, methane, acetylene levels, and condition assessment."
  tags:
    - equipment-monitoring
    - transformer
    - lab-analysis
capability:
  exposes:
    - type: mcp
      namespace: equipment-analysis
      port: 8080
      tools:
        - name: get-dga-results
          description: "Look up transformer dissolved gas analysis. Returns hydrogen, methane, acetylene, and condition."
          inputParameters:
            - name: transformer_id
              in: body
              type: string
              description: "The transformer asset identifier."
          call: "lab-system.get-dga"
          with:
            asset_id: "{{transformer_id}}"
          outputParameters:
            - name: hydrogen_ppm
              type: number
              mapping: "$.analysis.hydrogen"
            - name: methane_ppm
              type: number
              mapping: "$.analysis.methane"
            - name: acetylene_ppm
              type: number
              mapping: "$.analysis.acetylene"
            - name: condition
              type: string
              mapping: "$.analysis.conditionAssessment"
  consumes:
    - type: http
      namespace: lab-system
      baseUri: "https://api.internal.coned.com/lab/v1"
      authentication:
        type: bearer
        token: "$secrets.lab_token"
      resources:
        - name: dga
          path: "/analyses/dga/{{asset_id}}"
          inputParameters:
            - name: asset_id
              in: path
          operations:
            - name: get-dga
              method: GET

When a vegetation management inspection is scheduled, creates a SAP work order, assigns a contractor crew, updates the GIS inspection layer, and notifies the vegetation management team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Vegetation Management Inspection Pipeline"
  description: "When a vegetation management inspection is scheduled, creates a SAP work order, assigns a contractor crew, updates the GIS inspection layer, and notifies the vegetation management team via Microsoft Teams."
  tags:
    - vegetation-management
    - sap
    - gis
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: vegetation-mgmt
      port: 8080
      tools:
        - name: schedule-vegetation-inspection
          description: "Given a circuit and segment, create a work order, assign contractors, update GIS, and notify the team."
          inputParameters:
            - name: circuit_id
              in: body
              type: string
              description: "The electrical circuit identifier."
            - name: segment_id
              in: body
              type: string
              description: "The circuit segment for inspection."
            - name: inspection_date
              in: body
              type: string
              description: "The planned inspection date."
          steps:
            - name: create-wo
              type: call
              call: "sap.create-maintenance-order"
              with:
                equipment: "{{circuit_id}}"
                order_type: "VM01"
                activity_type: "vegetation_inspection"
                planned_start: "{{inspection_date}}"
            - name: assign-contractor
              type: call
              call: "workforce-mgmt.assign-contractor"
              with:
                work_order: "{{create-wo.order_number}}"
                circuit_id: "{{circuit_id}}"
                segment_id: "{{segment_id}}"
                skill_type: "vegetation"
            - name: update-gis
              type: call
              call: "gis.update-inspection-status"
              with:
                circuit_id: "{{circuit_id}}"
                segment_id: "{{segment_id}}"
                status: "scheduled"
                date: "{{inspection_date}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "veg-management"
                text: "Vegetation inspection scheduled: Circuit {{circuit_id}} segment {{segment_id}} on {{inspection_date}}. WO: {{create-wo.order_number}}. Contractor: {{assign-contractor.contractor_name}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://coned-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: orders
          path: "/MaintenanceOrder"
          operations:
            - name: create-maintenance-order
              method: POST
    - type: http
      namespace: workforce-mgmt
      baseUri: "https://api.internal.coned.com/workforce/v1"
      authentication:
        type: bearer
        token: "$secrets.workforce_token"
      resources:
        - name: contractors
          path: "/contractors/assign"
          operations:
            - name: assign-contractor
              method: POST
    - type: http
      namespace: gis
      baseUri: "https://gis.internal.coned.com/arcgis/rest/services"
      authentication:
        type: bearer
        token: "$secrets.gis_token"
      resources:
        - name: inspections
          path: "/VegetationInspections/FeatureServer/0/updateFeatures"
          operations:
            - name: update-inspection-status
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes invoices at Con Edison via OCR, SAP matching, approval, and Oracle recording.

naftiko: "0.5"
info:
  label: "Vendor Invoice Processing Pipeline"
  description: "Processes invoices at Con Edison 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 Con Edison."
          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.coned.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.coned.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.coned.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.coned.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: payments
          path: "/payments"
          operations:
            - name: create-payment
              method: POST

Retrieves current weather data from field weather stations for grid operations planning.

naftiko: "0.5"
info:
  label: "Weather Station Data Retrieval"
  description: "Retrieves current weather data from field weather stations for grid operations planning."
  tags:
    - weather
    - operations
    - grid-management
capability:
  exposes:
    - type: mcp
      namespace: weather-data
      port: 8080
      tools:
        - name: get-weather-station
          description: "Retrieve current weather data from a field station."
          inputParameters:
            - name: station_id
              in: body
              type: string
              description: "The weather station identifier."
          call: "weather.get-current"
          with:
            station_id: "{{station_id}}"
          outputParameters:
            - name: temperature
              type: number
              mapping: "$.data.temperature"
            - name: wind_speed
              type: number
              mapping: "$.data.wind_speed"
            - name: humidity
              type: number
              mapping: "$.data.humidity"
  consumes:
    - type: http
      namespace: weather
      baseUri: "https://weather-api.coned.com/v1"
      authentication:
        type: bearer
        token: "$secrets.weather_api_token"
      resources:
        - name: stations
          path: "/stations/{{station_id}}/current"
          inputParameters:
            - name: station_id
              in: path
          operations:
            - name: get-current
              method: GET

Retrieves an employee's compensation details from Workday, returning base pay, overtime eligibility, and total compensation.

naftiko: "0.5"
info:
  label: "Workday Compensation Lookup"
  description: "Retrieves an employee's compensation details from Workday, returning base pay, overtime eligibility, and total compensation."
  tags:
    - hr
    - compensation
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: get-compensation
          description: "Look up employee compensation in Workday. Returns base pay, overtime, and total."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: "workday.get-compensation"
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: base_pay
              type: number
              mapping: "$.compensationPlans[0].amount"
            - name: total_compensation
              type: number
              mapping: "$.totalBasePayAnnualized"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/workers/{{worker_id}}/compensation"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-compensation
              method: GET

Retrieves employee profile from Workday for Con Edison.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves employee profile from Workday for Con Edison."
  tags:
    - hr
    - workday
    - employee-directory
capability:
  exposes:
    - type: mcp
      namespace: workday-profile
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up Con Edison 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.coned.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

Retrieves an employee's safety training compliance status from Workday, returning completed courses, overdue trainings, and compliance percentage.

naftiko: "0.5"
info:
  label: "Workday Safety Training Compliance Lookup"
  description: "Retrieves an employee's safety training compliance status from Workday, returning completed courses, overdue trainings, and compliance percentage."
  tags:
    - safety
    - training
    - workday
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: safety-training
      port: 8080
      tools:
        - name: get-training-compliance
          description: "Look up an employee's safety training compliance in Workday. Returns completed, overdue, and compliance percentage."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          call: "workday.get-learning-status"
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: completed_courses
              type: number
              mapping: "$.learning.completedCount"
            - name: overdue_courses
              type: number
              mapping: "$.learning.overdueCount"
            - name: compliance_pct
              type: number
              mapping: "$.learning.compliancePercentage"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: learning
          path: "/workers/{{worker_id}}/learning"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-learning-status
              method: GET