Consolidated Edison Capabilities
Naftiko 0.5 capability definitions for Consolidated Edison - 100 capabilities showing integration workflows and service orchestrations.
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