CSX Corporation Capabilities

Naftiko 0.5 capability definitions for CSX Corporation - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Reviews access at CSX via Okta, IAM, and Jira.

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

naftiko: "0.5"
info:
  label: "API Deprecation Pipeline"
  description: "Manages API deprecation at CSX 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 CSX."
          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.csx.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.csx.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.csx.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://csx.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Checks build at CSX.

naftiko: "0.5"
info:
  label: "Azure DevOps Build Check"
  description: "Checks build at CSX."
  tags:
    - devops
    - azure-devops
    - ci-cd
capability:
  exposes:
    - type: mcp
      namespace: azdo-build
      port: 8080
      tools:
        - name: check-build
          description: "Check build at CSX."
          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/csx.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

Verifies backups at CSX.

naftiko: "0.5"
info:
  label: "Backup Verification Pipeline"
  description: "Verifies backups at CSX."
  tags:
    - database
    - backup
    - operations
capability:
  exposes:
    - type: mcp
      namespace: backup-verify
      port: 8080
      tools:
        - name: verify-backups
          description: "Verify backups at CSX."
          inputParameters:
            - name: db
              in: body
              type: string
              description: "Database."
            - name: date
              in: body
              type: string
              description: "Backup date."
          steps:
            - name: status
              type: call
              call: "backup.get-status"
              with:
                db: "{{db}}"
                date: "{{date}}"
            - name: verify
              type: call
              call: "backup.verify"
              with:
                id: "{{status.backup_id}}"
            - name: log
              type: call
              call: "snowflake.query"
              with:
                query: "INSERT INTO backup_log VALUES ('{{db}}','{{date}}','{{verify.status}}')"
            - name: alert
              type: call
              call: "slack.post-message"
              with:
                channel: "#dba"
                text: "Backup {{db}}: {{verify.status}}"
  consumes:
    - type: http
      namespace: backup
      baseUri: "https://backup.csx.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.backup_token"
      resources:
        - name: backups
          path: "/databases/{{db}}/status"
          inputParameters:
            - name: db
              in: path
          operations:
            - name: get-status
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://csx.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

When a bridge inspection is completed, uploads the report to SharePoint, updates the bridge condition rating in the asset management system, and creates a follow-up task in ServiceNow if remediation is needed.

naftiko: "0.5"
info:
  label: "Bridge Inspection Report Pipeline"
  description: "When a bridge inspection is completed, uploads the report to SharePoint, updates the bridge condition rating in the asset management system, and creates a follow-up task in ServiceNow if remediation is needed."
  tags:
    - bridge-engineering
    - inspection
    - sharepoint
    - servicenow
    - asset-management
capability:
  exposes:
    - type: mcp
      namespace: bridge-engineering
      port: 8080
      tools:
        - name: process-bridge-inspection
          description: "Given inspection results, upload report, update asset condition, and create remediation tasks."
          inputParameters:
            - name: bridge_id
              in: body
              type: string
              description: "The bridge identifier."
            - name: condition_rating
              in: body
              type: number
              description: "The NBI condition rating (0-9)."
            - name: inspector_name
              in: body
              type: string
              description: "The inspector's name."
            - name: report_content
              in: body
              type: string
              description: "The inspection report content."
          steps:
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "bridge_engineering"
                file_path: "Inspections/{{bridge_id}}/latest_report.pdf"
                content: "{{report_content}}"
            - name: update-condition
              type: call
              call: "asset-mgmt.update-bridge-condition"
              with:
                bridge_id: "{{bridge_id}}"
                condition_rating: "{{condition_rating}}"
                inspector: "{{inspector_name}}"
            - name: create-remediation
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Bridge remediation review: {{bridge_id}} rated {{condition_rating}}"
                category: "bridge_maintenance"
                description: "Bridge {{bridge_id}} inspected by {{inspector_name}}. Condition: {{condition_rating}}/9. Report: {{upload-report.url}}."
  consumes:
    - 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: asset-mgmt
      baseUri: "https://api.internal.csx.com/assets/v1"
      authentication:
        type: bearer
        token: "$secrets.asset_token"
      resources:
        - name: bridges
          path: "/bridges/{{bridge_id}}/condition"
          inputParameters:
            - name: bridge_id
              in: path
          operations:
            - name: update-bridge-condition
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://csx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Analyzes budget variance at CSX via Oracle, Workday, and Slack.

naftiko: "0.5"
info:
  label: "Budget Variance Pipeline"
  description: "Analyzes budget variance at CSX 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 CSX."
          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.csx.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.csx.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.csx.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

Coordinates bulk commodity loading by checking railcar availability, scheduling loading windows, and notifying the customer.

naftiko: "0.5"
info:
  label: "Bulk Commodity Loading Pipeline"
  description: "Coordinates bulk commodity loading by checking railcar availability, scheduling loading windows, and notifying the customer."
  tags: [bulk-commodity, loading, scheduling, customer-notification]
capability:
  exposes:
    - type: mcp
      namespace: bulk-ops
      port: 8080
      tools:
        - name: schedule-bulk-loading
          description: "Check car availability, schedule loading, and notify customer."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The customer ID."
            - name: commodity_code
              in: body
              type: string
              description: "STCC commodity code."
            - name: car_count
              in: body
              type: number
              description: "Number of railcars needed."
            - name: loading_date
              in: body
              type: string
              description: "Requested loading date."
          steps:
            - name: check-cars
              type: call
              call: "car-mgmt.check-availability"
              with: { commodity: "{{commodity_code}}", count: "{{car_count}}", location: "{{customer_id}}" }
            - name: schedule-loading
              type: call
              call: "dispatch.schedule-placement"
              with: { customer_id: "{{customer_id}}", car_count: "{{car_count}}", date: "{{loading_date}}" }
            - name: notify-customer
              type: call
              call: "email-service.send-loading-notice"
              with: { customer_id: "{{customer_id}}", cars_assigned: "{{check-cars.assigned_count}}", placement_date: "{{schedule-loading.placement_date}}" }
  consumes:
    - type: http
      namespace: car-mgmt
      baseUri: "https://api.internal.csx.com/car-management/v1"
      authentication: { type: bearer, token: "$secrets.car_mgmt_token" }
      resources:
        - name: availability
          path: "/availability"
          operations: [{ name: check-availability, method: GET }]
    - type: http
      namespace: dispatch
      baseUri: "https://api.internal.csx.com/dispatch/v1"
      authentication: { type: bearer, token: "$secrets.dispatch_token" }
      resources:
        - name: placements
          path: "/placements"
          operations: [{ name: schedule-placement, method: POST }]
    - type: http
      namespace: email-service
      baseUri: "https://api.internal.csx.com/email/v1"
      authentication: { type: bearer, token: "$secrets.email_token" }
      resources:
        - name: loading-notices
          path: "/loading-notices"
          operations: [{ name: send-loading-notice, method: POST }]

Plans capacity at CSX by collecting utilization and forecasting.

naftiko: "0.5"
info:
  label: "Capacity Planning Pipeline"
  description: "Plans capacity at CSX 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 CSX."
          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.csx.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.csx.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://csx.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Monitors cert expiry at CSX.

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

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

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

naftiko: "0.5"
info:
  label: "Cloud Cost Optimization Pipeline"
  description: "Optimizes cloud costs at CSX 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 CSX."
          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.csx.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://csx.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 CSX.

naftiko: "0.5"
info:
  label: "Confluence Article Search"
  description: "Searches Confluence at CSX."
  tags:
    - knowledge-management
    - confluence
    - documentation
capability:
  exposes:
    - type: mcp
      namespace: confluence-search
      port: 8080
      tools:
        - name: search-articles
          description: "Search Confluence at CSX."
          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://csx.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          operations:
            - name: search
              method: GET

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

naftiko: "0.5"
info:
  label: "Contract Renewal Pipeline"
  description: "Tracks contract renewals at CSX 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 CSX."
          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.csx.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.csx.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://csx.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://csx.com.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opps
          path: "/sobjects/Opportunity"
          operations:
            - name: update
              method: PATCH

Reallocates costs at CSX.

naftiko: "0.5"
info:
  label: "Cost Reallocation Pipeline"
  description: "Reallocates costs at CSX."
  tags:
    - finance
    - cost-allocation
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: cost-realloc
      port: 8080
      tools:
        - name: reallocate
          description: "Reallocate costs at CSX."
          inputParameters:
            - name: source
              in: body
              type: string
              description: "Source CC."
            - name: target
              in: body
              type: string
              description: "Target CC."
            - name: amount
              in: body
              type: number
              description: "Amount."
          steps:
            - name: current
              type: call
              call: "oracle.get-alloc"
              with:
                cc: "{{source}}"
            - name: compute
              type: call
              call: "analytics.realloc"
              with:
                source: "{{source}}"
                target: "{{target}}"
                amount: "{{amount}}"
            - name: post
              type: call
              call: "oracle.post-journal"
              with:
                entries: "{{compute.entries}}"
            - name: notify
              type: call
              call: "slack.post-message"
              with:
                channel: "#finance"
                text: "Reallocated ${{amount}} from {{source}} to {{target}}"
  consumes:
    - type: http
      namespace: oracle
      baseUri: "https://oracle.csx.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.oracle_token"
      resources:
        - name: allocations
          path: "/cost-centers/{{cc}}/allocations"
          inputParameters:
            - name: cc
              in: path
          operations:
            - name: get-alloc
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.csx.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: realloc
          path: "/compute"
          operations:
            - name: realloc
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors crew hours of service, identifies crews approaching limits, and coordinates relief crew assignments.

naftiko: "0.5"
info:
  label: "Crew Hours of Service Compliance Pipeline"
  description: "Monitors crew hours of service, identifies crews approaching limits, and coordinates relief crew assignments."
  tags: [crew-management, hours-of-service, compliance, safety]
capability:
  exposes:
    - type: mcp
      namespace: hos-compliance
      port: 8080
      tools:
        - name: check-hos-compliance
          description: "Check HOS for active crews on a subdivision, identify at-risk crews, and assign relief."
          inputParameters:
            - name: subdivision
              in: body
              type: string
              description: "The subdivision to check."
          steps:
            - name: get-active-crews
              type: call
              call: "crew-mgmt.get-active-crews"
              with: { subdivision: "{{subdivision}}" }
            - name: identify-at-risk
              type: call
              call: "crew-mgmt.check-hos-limits"
              with: { crews: "{{get-active-crews.crew_list}}" }
            - name: assign-relief
              type: call
              call: "crew-mgmt.assign-relief-crews"
              with: { at_risk_crews: "{{identify-at-risk.at_risk_list}}", subdivision: "{{subdivision}}" }
  consumes:
    - type: http
      namespace: crew-mgmt
      baseUri: "https://api.internal.csx.com/crew/v1"
      authentication: { type: bearer, token: "$secrets.crew_token" }
      resources:
        - name: active
          path: "/subdivisions/{{subdivision}}/active-crews"
          inputParameters: [{ name: subdivision, in: path }]
          operations: [{ name: get-active-crews, method: GET }]
        - name: hos
          path: "/hos/check"
          operations: [{ name: check-hos-limits, method: POST }]
        - name: relief
          path: "/relief-assignments"
          operations: [{ name: assign-relief-crews, method: POST }]

Retrieves the crew assignment for a given train, returning engineer name, conductor name, on-duty time, and hours of service remaining.

naftiko: "0.5"
info:
  label: "Crew Scheduling Lookup"
  description: "Retrieves the crew assignment for a given train, returning engineer name, conductor name, on-duty time, and hours of service remaining."
  tags:
    - crew-management
    - scheduling
    - hours-of-service
capability:
  exposes:
    - type: mcp
      namespace: crew-scheduling
      port: 8080
      tools:
        - name: get-crew-assignment
          description: "Look up crew assignment for a train. Returns engineer, conductor, on-duty time, and HOS remaining."
          inputParameters:
            - name: train_symbol
              in: body
              type: string
              description: "The train symbol."
          call: "crew-mgmt.get-assignment"
          with:
            train_symbol: "{{train_symbol}}"
          outputParameters:
            - name: engineer
              type: string
              mapping: "$.assignment.engineer.name"
            - name: conductor
              type: string
              mapping: "$.assignment.conductor.name"
            - name: on_duty_time
              type: string
              mapping: "$.assignment.onDutyTime"
            - name: hos_remaining_hours
              type: number
              mapping: "$.assignment.hosRemainingHours"
  consumes:
    - type: http
      namespace: crew-mgmt
      baseUri: "https://api.internal.csx.com/crew/v1"
      authentication:
        type: bearer
        token: "$secrets.crew_token"
      resources:
        - name: assignments
          path: "/trains/{{train_symbol}}/crew"
          inputParameters:
            - name: train_symbol
              in: path
          operations:
            - name: get-assignment
              method: GET

When a railcar exceeds free time at a customer facility, calculates demurrage charges, creates an invoice in SAP, and notifies the customer service team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer Demurrage Billing Pipeline"
  description: "When a railcar exceeds free time at a customer facility, calculates demurrage charges, creates an invoice in SAP, and notifies the customer service team via Microsoft Teams."
  tags:
    - demurrage
    - billing
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: demurrage-billing
      port: 8080
      tools:
        - name: calculate-demurrage
          description: "Given a railcar and release date, calculate demurrage, create SAP invoice, and notify customer service."
          inputParameters:
            - name: reporting_mark
              in: body
              type: string
              description: "The railcar reporting mark."
            - name: waybill_number
              in: body
              type: string
              description: "The waybill number."
            - name: actual_release_date
              in: body
              type: string
              description: "The actual release date."
          steps:
            - name: get-waybill
              type: call
              call: "sap.get-waybill"
              with:
                waybill_number: "{{waybill_number}}"
            - name: calculate-charges
              type: call
              call: "billing.calculate-demurrage"
              with:
                reporting_mark: "{{reporting_mark}}"
                free_time_end: "{{get-waybill.free_time_end}}"
                release_date: "{{actual_release_date}}"
                tariff_id: "{{get-waybill.tariff_id}}"
            - name: create-invoice
              type: call
              call: "sap.create-invoice"
              with:
                customer_id: "{{get-waybill.customer_id}}"
                amount: "{{calculate-charges.total}}"
                description: "Demurrage: {{reporting_mark}} on WB {{waybill_number}}"
            - name: notify-cs
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "customer-service"
                text: "Demurrage invoice: {{create-invoice.invoice_number}} for ${{calculate-charges.total}}. Car: {{reporting_mark}}. Days held: {{calculate-charges.chargeable_days}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://csx-s4.sap.com/sap/opu/odata/sap/API_FREIGHT_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: waybills
          path: "/A_FreightOrder('{{waybill_number}}')"
          inputParameters:
            - name: waybill_number
              in: path
          operations:
            - name: get-waybill
              method: GET
    - type: http
      namespace: billing
      baseUri: "https://api.internal.csx.com/billing/v1"
      authentication:
        type: bearer
        token: "$secrets.billing_token"
      resources:
        - name: demurrage
          path: "/demurrage/calculate"
          operations:
            - name: calculate-demurrage
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://csx-s4.sap.com/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/A_BillingDocument"
          operations:
            - name: create-invoice
              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 freight rate quote for a customer lane, returning base rate, fuel surcharge, and total per-car charge.

naftiko: "0.5"
info:
  label: "Customer Rate Quote Lookup"
  description: "Retrieves a freight rate quote for a customer lane, returning base rate, fuel surcharge, and total per-car charge."
  tags: [pricing, commercial, freight-rates]
capability:
  exposes:
    - type: mcp
      namespace: commercial-pricing
      port: 8080
      tools:
        - name: get-freight-rate
          description: "Look up freight rate for a lane. Returns base rate, fuel surcharge, and total."
          inputParameters:
            - name: origin_station
              in: body
              type: string
              description: "Origin station code."
            - name: destination_station
              in: body
              type: string
              description: "Destination station code."
            - name: commodity_code
              in: body
              type: string
              description: "STCC commodity code."
          call: "pricing.get-rate"
          with: { origin: "{{origin_station}}", destination: "{{destination_station}}", commodity: "{{commodity_code}}" }
          outputParameters:
            - name: base_rate
              type: number
              mapping: "$.rate.baseRate"
            - name: fuel_surcharge
              type: number
              mapping: "$.rate.fuelSurcharge"
            - name: total_per_car
              type: number
              mapping: "$.rate.totalPerCar"
  consumes:
    - type: http
      namespace: pricing
      baseUri: "https://api.internal.csx.com/pricing/v1"
      authentication: { type: bearer, token: "$secrets.pricing_token" }
      resources:
        - name: rates
          path: "/rates/quote"
          operations: [{ name: get-rate, method: GET }]

Retrieves estimated time of arrival for a customer shipment, returning current location, ETA, and transit status.

naftiko: "0.5"
info:
  label: "Customer Shipment ETA Lookup"
  description: "Retrieves estimated time of arrival for a customer shipment, returning current location, ETA, and transit status."
  tags: [customer-service, tracking, eta]
capability:
  exposes:
    - type: mcp
      namespace: customer-tracking
      port: 8080
      tools:
        - name: get-shipment-eta
          description: "Look up shipment ETA. Returns location, ETA, and transit status."
          inputParameters:
            - name: waybill_number
              in: body
              type: string
              description: "The waybill number."
          call: "tracking.get-shipment-eta"
          with: { waybill: "{{waybill_number}}" }
          outputParameters:
            - name: current_location
              type: string
              mapping: "$.shipment.currentLocation"
            - name: eta
              type: string
              mapping: "$.shipment.estimatedArrival"
            - name: transit_status
              type: string
              mapping: "$.shipment.transitStatus"
  consumes:
    - type: http
      namespace: tracking
      baseUri: "https://api.internal.csx.com/tracking/v1"
      authentication: { type: bearer, token: "$secrets.tracking_token" }
      resources:
        - name: shipments
          path: "/shipments/{{waybill}}/eta"
          inputParameters: [{ name: waybill, in: path }]
          operations: [{ name: get-shipment-eta, method: GET }]

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

naftiko: "0.5"
info:
  label: "Data Pipeline Monitor Pipeline"
  description: "Monitors data pipelines at CSX 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 CSX."
          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://csx.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://csx.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://csx.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Checks Datadog monitor at CSX.

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

Retrieves the dispatch communication log for a train, returning messages, timestamps, and dispatcher ID.

naftiko: "0.5"
info:
  label: "Dispatch Communication Log"
  description: "Retrieves the dispatch communication log for a train, returning messages, timestamps, and dispatcher ID."
  tags: [dispatch, communication, train-operations]
capability:
  exposes:
    - type: mcp
      namespace: dispatch-comms
      port: 8080
      tools:
        - name: get-dispatch-log
          description: "Look up dispatch comm log for a train. Returns messages, timestamps, and dispatcher."
          inputParameters:
            - name: train_symbol
              in: body
              type: string
              description: "The train symbol."
          call: "dispatch.get-comm-log"
          with: { train_symbol: "{{train_symbol}}" }
          outputParameters:
            - name: message_count
              type: number
              mapping: "$.log.messageCount"
            - name: latest_message
              type: string
              mapping: "$.log.messages[0].text"
            - name: dispatcher
              type: string
              mapping: "$.log.messages[0].dispatcher"
  consumes:
    - type: http
      namespace: dispatch
      baseUri: "https://api.internal.csx.com/dispatch/v1"
      authentication: { type: bearer, token: "$secrets.dispatch_token" }
      resources:
        - name: comm-logs
          path: "/trains/{{train_symbol}}/comm-log"
          inputParameters: [{ name: train_symbol, in: path }]
          operations: [{ name: get-comm-log, method: GET }]

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

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

naftiko: "0.5"
info:
  label: "Drift Detection Pipeline"
  description: "Detects infrastructure drift at CSX 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 CSX."
          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://csx.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Receives an EDI 417 waybill, validates commodity and routing, creates the shipment in the dispatch system, and sends EDI 404 acknowledgement.

naftiko: "0.5"
info:
  label: "EDI Waybill Processing Pipeline"
  description: "Receives an EDI 417 waybill, validates commodity and routing, creates the shipment in the dispatch system, and sends EDI 404 acknowledgement."
  tags: [edi, waybill, dispatch, electronic-data-interchange]
capability:
  exposes:
    - type: mcp
      namespace: edi-processing
      port: 8080
      tools:
        - name: process-edi-waybill
          description: "Parse EDI waybill, validate, create shipment, and send acknowledgement."
          inputParameters:
            - name: message_id
              in: body
              type: string
              description: "The EDI message ID."
          steps:
            - name: parse-message
              type: call
              call: "edi-gateway.parse-417"
              with: { message_id: "{{message_id}}" }
            - name: create-shipment
              type: call
              call: "dispatch.create-shipment"
              with: { origin: "{{parse-message.origin}}", destination: "{{parse-message.destination}}", commodity: "{{parse-message.commodity}}" }
            - name: send-ack
              type: call
              call: "edi-gateway.send-404"
              with: { partner_id: "{{parse-message.sender_id}}", waybill: "{{create-shipment.waybill_number}}" }
  consumes:
    - type: http
      namespace: edi-gateway
      baseUri: "https://api.internal.csx.com/edi/v1"
      authentication: { type: bearer, token: "$secrets.edi_token" }
      resources:
        - name: messages
          path: "/messages/{{message_id}}"
          inputParameters: [{ name: message_id, in: path }]
          operations: [{ name: parse-417, method: GET }]
        - name: outbound
          path: "/messages/send"
          operations: [{ name: send-404, method: POST }]
    - type: http
      namespace: dispatch
      baseUri: "https://api.internal.csx.com/dispatch/v1"
      authentication: { type: bearer, token: "$secrets.dispatch_token" }
      resources:
        - name: shipments
          path: "/shipments"
          operations: [{ name: create-shipment, method: POST }]

Checks ES index at CSX.

naftiko: "0.5"
info:
  label: "ES Index Health"
  description: "Checks ES index at CSX."
  tags:
    - search
    - elasticsearch
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: es-health
      port: 8080
      tools:
        - name: check-index
          description: "Check ES index at CSX."
          inputParameters:
            - name: index
              in: body
              type: string
              description: "Index name."
          call: "es.get-health"
          with:
            index: "{{index}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: docs
              type: number
              mapping: "$.docs.count"
  consumes:
    - type: http
      namespace: es
      baseUri: "https://es.csx.com:9200"
      authentication:
        type: bearer
        token: "$secrets.es_token"
      resources:
        - name: indices
          path: "/{{index}}/_stats"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: get-health
              method: GET

Pulls locomotive fuel consumption data, calculates CO2 emissions per EPA guidelines, and submits the report to the environmental compliance system.

naftiko: "0.5"
info:
  label: "Emissions Reporting Pipeline"
  description: "Pulls locomotive fuel consumption data, calculates CO2 emissions per EPA guidelines, and submits the report to the environmental compliance system."
  tags:
    - emissions
    - sustainability
    - epa
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: emissions-reporting
      port: 8080
      tools:
        - name: generate-emissions-report
          description: "Given a reporting period, calculate fleet emissions and submit the compliance report."
          inputParameters:
            - name: reporting_year
              in: body
              type: string
              description: "The reporting year."
            - name: region
              in: body
              type: string
              description: "The operating region."
          steps:
            - name: get-fuel-data
              type: call
              call: "fuel-mgmt.get-fleet-consumption"
              with:
                year: "{{reporting_year}}"
                region: "{{region}}"
            - name: calculate-emissions
              type: call
              call: "emissions-engine.calculate"
              with:
                diesel_gallons: "{{get-fuel-data.total_diesel_gallons}}"
                biodiesel_gallons: "{{get-fuel-data.biodiesel_gallons}}"
                ton_miles: "{{get-fuel-data.total_ton_miles}}"
            - name: submit-report
              type: call
              call: "compliance.submit-epa-report"
              with:
                year: "{{reporting_year}}"
                region: "{{region}}"
                co2_tons: "{{calculate-emissions.co2_total}}"
                intensity: "{{calculate-emissions.co2_per_ton_mile}}"
  consumes:
    - type: http
      namespace: fuel-mgmt
      baseUri: "https://api.internal.csx.com/fuel/v1"
      authentication:
        type: bearer
        token: "$secrets.fuel_token"
      resources:
        - name: fleet
          path: "/fleet/consumption"
          operations:
            - name: get-fleet-consumption
              method: GET
    - type: http
      namespace: emissions-engine
      baseUri: "https://api.internal.csx.com/emissions/v1"
      authentication:
        type: bearer
        token: "$secrets.emissions_token"
      resources:
        - name: calculations
          path: "/calculate"
          operations:
            - name: calculate
              method: POST
    - type: http
      namespace: compliance
      baseUri: "https://api.internal.csx.com/compliance/v1"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: epa-reports
          path: "/epa-reports"
          operations:
            - name: submit-epa-report
              method: POST

Offboards employees at CSX via Okta, Slack, ServiceNow, and storage.

naftiko: "0.5"
info:
  label: "Employee Offboarding Pipeline"
  description: "Offboards employees at CSX 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 CSX."
          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://csx.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://csx.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.csx.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."
            - name: start_date
              in: body
              type: string
              description: "The employee start date."
            - name: department
              in: body
              type: string
              description: "The department."
          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"
                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 CSX, {{get-employee.first_name}}! IT ticket: {{open-ticket.number}}. Docs: {{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://csx.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

Audits expenses at CSX via Concur, compliance checks, and email.

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

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

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

Compiles FRA safety reporting data, generates the monthly report, uploads to SharePoint, and notifies the safety team.

naftiko: "0.5"
info:
  label: "FRA Safety Report Pipeline"
  description: "Compiles FRA safety reporting data, generates the monthly report, uploads to SharePoint, and notifies the safety team."
  tags: [fra-reporting, safety, sharepoint, microsoft-teams]
capability:
  exposes:
    - type: mcp
      namespace: fra-safety
      port: 8080
      tools:
        - name: generate-fra-safety-report
          description: "Compile FRA data, generate report, upload, and notify safety team."
          inputParameters:
            - name: report_month
              in: body
              type: string
              description: "The reporting month in YYYY-MM format."
          steps:
            - name: compile-data
              type: call
              call: "fra-reporting.compile-monthly"
              with: { month: "{{report_month}}" }
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with: { site_id: "safety_reports", file_path: "FRA/{{report_month}}_safety.xlsx", content: "{{compile-data.report_content}}" }
            - name: notify-safety
              type: call
              call: "msteams.send-message"
              with: { channel_id: "safety-ops", text: "FRA safety report for {{report_month}} generated. Incidents: {{compile-data.incident_count}}. Report: {{upload-report.url}}." }
  consumes:
    - type: http
      namespace: fra-reporting
      baseUri: "https://api.internal.csx.com/fra/v1"
      authentication: { type: bearer, token: "$secrets.fra_token" }
      resources:
        - name: monthly
          path: "/reports/monthly"
          operations: [{ name: compile-monthly, 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 maintenance history for a railcar from SAP, returning completed work orders, repair costs, and last shop date.

naftiko: "0.5"
info:
  label: "Freight Car Maintenance History"
  description: "Retrieves maintenance history for a railcar from SAP, returning completed work orders, repair costs, and last shop date."
  tags: [railcar, maintenance, sap]
capability:
  exposes:
    - type: mcp
      namespace: car-maintenance
      port: 8080
      tools:
        - name: get-car-maintenance-history
          description: "Look up railcar maintenance history. Returns completed WOs, costs, and last shop."
          inputParameters:
            - name: reporting_mark
              in: body
              type: string
              description: "The railcar reporting mark."
          call: "sap.get-car-maintenance"
          with: { reporting_mark: "{{reporting_mark}}" }
          outputParameters:
            - name: completed_orders
              type: number
              mapping: "$.maintenance.completedCount"
            - name: total_cost
              type: number
              mapping: "$.maintenance.totalCost"
            - name: last_shop_date
              type: string
              mapping: "$.maintenance.lastShopDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://csx-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER"
      authentication: { type: basic, username: "$secrets.sap_user", password: "$secrets.sap_password" }
      resources:
        - name: car-maintenance
          path: "/MaintenanceOrder"
          operations: [{ name: get-car-maintenance, method: GET }]

Retrieves locomotive fuel consumption data from the fuel management system, returning gallons consumed, miles traveled, and fuel efficiency in ton-miles per gallon.

naftiko: "0.5"
info:
  label: "Fuel Consumption Analytics"
  description: "Retrieves locomotive fuel consumption data from the fuel management system, returning gallons consumed, miles traveled, and fuel efficiency in ton-miles per gallon."
  tags:
    - fuel-management
    - analytics
    - locomotive
capability:
  exposes:
    - type: mcp
      namespace: fuel-analytics
      port: 8080
      tools:
        - name: get-fuel-consumption
          description: "Look up locomotive fuel consumption. Returns gallons, miles, and efficiency."
          inputParameters:
            - name: locomotive_id
              in: body
              type: string
              description: "The locomotive unit number."
            - name: period
              in: body
              type: string
              description: "The reporting period (e.g., last30days, last90days)."
          call: "fuel-mgmt.get-consumption"
          with:
            unit_id: "{{locomotive_id}}"
            period: "{{period}}"
          outputParameters:
            - name: gallons_consumed
              type: number
              mapping: "$.consumption.totalGallons"
            - name: miles_traveled
              type: number
              mapping: "$.consumption.totalMiles"
            - name: ton_miles_per_gallon
              type: number
              mapping: "$.consumption.efficiency"
  consumes:
    - type: http
      namespace: fuel-mgmt
      baseUri: "https://api.internal.csx.com/fuel/v1"
      authentication:
        type: bearer
        token: "$secrets.fuel_token"
      resources:
        - name: consumption
          path: "/locomotives/{{unit_id}}/consumption"
          inputParameters:
            - name: unit_id
              in: path
          operations:
            - name: get-consumption
              method: GET

Retrieves track asset information from the GIS system, returning milepost, track class, rail weight, and last maintenance date.

naftiko: "0.5"
info:
  label: "GIS Track Asset Lookup"
  description: "Retrieves track asset information from the GIS system, returning milepost, track class, rail weight, and last maintenance date."
  tags:
    - gis
    - track-assets
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: track-assets
      port: 8080
      tools:
        - name: get-track-asset
          description: "Look up track asset in GIS. Returns milepost, track class, rail weight, and last maintenance."
          inputParameters:
            - name: subdivision
              in: body
              type: string
              description: "The track subdivision."
            - name: milepost
              in: body
              type: string
              description: "The milepost."
          call: "gis.get-track-segment"
          with:
            subdivision: "{{subdivision}}"
            milepost: "{{milepost}}"
          outputParameters:
            - name: track_class
              type: string
              mapping: "$.properties.trackClass"
            - name: rail_weight
              type: number
              mapping: "$.properties.railWeight"
            - name: last_maintenance
              type: string
              mapping: "$.properties.lastMaintenanceDate"
            - name: max_speed
              type: number
              mapping: "$.properties.maxAuthorizedSpeed"
  consumes:
    - type: http
      namespace: gis
      baseUri: "https://gis.internal.csx.com/arcgis/rest/services"
      authentication:
        type: bearer
        token: "$secrets.gis_token"
      resources:
        - name: track
          path: "/TrackAssets/FeatureServer/0/query"
          operations:
            - name: get-track-segment
              method: GET

Checks GitHub repo at CSX.

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

When a grade crossing inspection is due, creates a SAP work order, schedules the inspection crew, updates the FRA reporting system, and notifies the signals team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Grade Crossing Safety Inspection Pipeline"
  description: "When a grade crossing inspection is due, creates a SAP work order, schedules the inspection crew, updates the FRA reporting system, and notifies the signals team via Microsoft Teams."
  tags:
    - grade-crossing
    - safety
    - sap
    - fra-reporting
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crossing-safety
      port: 8080
      tools:
        - name: schedule-crossing-inspection
          description: "Given a crossing ID, create work order, schedule crew, update FRA system, and notify signals team."
          inputParameters:
            - name: crossing_id
              in: body
              type: string
              description: "The DOT crossing inventory number."
            - name: inspection_type
              in: body
              type: string
              description: "The inspection type (routine, triggered, annual)."
            - 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: "XING_{{crossing_id}}"
                order_type: "SI01"
                activity_type: "{{inspection_type}}"
                planned_start: "{{inspection_date}}"
            - name: schedule-crew
              type: call
              call: "workforce.schedule-inspection"
              with:
                crossing_id: "{{crossing_id}}"
                work_order: "{{create-wo.order_number}}"
                date: "{{inspection_date}}"
            - name: update-fra
              type: call
              call: "fra-reporting.update-inspection-schedule"
              with:
                crossing_id: "{{crossing_id}}"
                inspection_type: "{{inspection_type}}"
                scheduled_date: "{{inspection_date}}"
            - name: notify-signals
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "signals-engineering"
                text: "Grade crossing inspection scheduled: DOT# {{crossing_id}}. Type: {{inspection_type}}. Date: {{inspection_date}}. WO: {{create-wo.order_number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://csx-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
      baseUri: "https://api.internal.csx.com/workforce/v1"
      authentication:
        type: bearer
        token: "$secrets.workforce_token"
      resources:
        - name: inspections
          path: "/inspections/schedule"
          operations:
            - name: schedule-inspection
              method: POST
    - type: http
      namespace: fra-reporting
      baseUri: "https://api.internal.csx.com/fra/v1"
      authentication:
        type: bearer
        token: "$secrets.fra_token"
      resources:
        - name: inspections
          path: "/crossing-inspections"
          operations:
            - name: update-inspection-schedule
              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

Checks Grafana dashboard at CSX.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Status"
  description: "Checks Grafana dashboard at CSX."
  tags:
    - monitoring
    - grafana
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: check-dash
          description: "Check dashboard at CSX."
          inputParameters:
            - name: uid
              in: body
              type: string
              description: "Dashboard UID."
          call: "grafana.get-dash"
          with:
            uid: "{{uid}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.dashboard.title"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.csx.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: dashboards
          path: "/dashboards/uid/{{uid}}"
          inputParameters:
            - name: uid
              in: path
          operations:
            - name: get-dash
              method: GET

Coordinates grain loading by checking elevator capacity, scheduling unit trains, and confirming with the agricultural shipper.

naftiko: "0.5"
info:
  label: "Grain Elevator Coordination Pipeline"
  description: "Coordinates grain loading by checking elevator capacity, scheduling unit trains, and confirming with the agricultural shipper."
  tags: [agriculture, grain, unit-trains, scheduling]
capability:
  exposes:
    - type: mcp
      namespace: grain-ops
      port: 8080
      tools:
        - name: coordinate-grain-loading
          description: "Check elevator capacity, schedule unit train, and confirm with shipper."
          inputParameters:
            - name: elevator_id
              in: body
              type: string
              description: "The grain elevator ID."
            - name: car_count
              in: body
              type: number
              description: "Number of hopper cars."
            - name: commodity
              in: body
              type: string
              description: "Grain type (corn, wheat, soybeans)."
          steps:
            - name: check-capacity
              type: call
              call: "elevator-mgmt.check-capacity"
              with: { elevator_id: "{{elevator_id}}", commodity: "{{commodity}}" }
            - name: schedule-train
              type: call
              call: "dispatch.schedule-unit-train"
              with: { elevator_id: "{{elevator_id}}", car_count: "{{car_count}}", commodity: "{{commodity}}" }
            - name: confirm-shipper
              type: call
              call: "email-service.send-loading-notice"
              with: { elevator_id: "{{elevator_id}}", train_date: "{{schedule-train.loading_date}}", car_count: "{{car_count}}" }
  consumes:
    - type: http
      namespace: elevator-mgmt
      baseUri: "https://api.internal.csx.com/elevators/v1"
      authentication: { type: bearer, token: "$secrets.elevator_token" }
      resources:
        - name: capacity
          path: "/elevators/{{elevator_id}}/capacity"
          inputParameters: [{ name: elevator_id, in: path }]
          operations: [{ name: check-capacity, method: GET }]
    - type: http
      namespace: dispatch
      baseUri: "https://api.internal.csx.com/dispatch/v1"
      authentication: { type: bearer, token: "$secrets.dispatch_token" }
      resources:
        - name: unit-trains
          path: "/unit-trains"
          operations: [{ name: schedule-unit-train, method: POST }]
    - type: http
      namespace: email-service
      baseUri: "https://api.internal.csx.com/email/v1"
      authentication: { type: bearer, token: "$secrets.email_token" }
      resources:
        - name: loading-notices
          path: "/loading-notices"
          operations: [{ name: send-loading-notice, method: POST }]

When a hazardous materials shipment is tendered, validates placard and routing compliance against DOT regulations, creates the shipping document, and files the required notifications.

naftiko: "0.5"
info:
  label: "Hazmat Shipment Compliance Pipeline"
  description: "When a hazardous materials shipment is tendered, validates placard and routing compliance against DOT regulations, creates the shipping document, and files the required notifications."
  tags:
    - hazmat
    - compliance
    - dot-regulations
    - safety
capability:
  exposes:
    - type: mcp
      namespace: hazmat-compliance
      port: 8080
      tools:
        - name: validate-hazmat-shipment
          description: "Given hazmat shipment details, validate DOT compliance, create shipping docs, and file notifications."
          inputParameters:
            - name: waybill_number
              in: body
              type: string
              description: "The waybill number."
            - name: un_number
              in: body
              type: string
              description: "The UN hazmat classification number."
            - name: quantity
              in: body
              type: number
              description: "The quantity being shipped."
          steps:
            - name: validate-compliance
              type: call
              call: "hazmat.validate-shipment"
              with:
                waybill: "{{waybill_number}}"
                un_number: "{{un_number}}"
                quantity: "{{quantity}}"
            - name: create-shipping-doc
              type: call
              call: "doc-service.create-hazmat-doc"
              with:
                waybill: "{{waybill_number}}"
                un_number: "{{un_number}}"
                placard: "{{validate-compliance.required_placard}}"
                route: "{{validate-compliance.approved_route}}"
            - name: file-notification
              type: call
              call: "hazmat.file-notification"
              with:
                waybill: "{{waybill_number}}"
                un_number: "{{un_number}}"
                route: "{{validate-compliance.approved_route}}"
  consumes:
    - type: http
      namespace: hazmat
      baseUri: "https://api.internal.csx.com/hazmat/v1"
      authentication:
        type: bearer
        token: "$secrets.hazmat_token"
      resources:
        - name: validation
          path: "/validate"
          operations:
            - name: validate-shipment
              method: POST
        - name: notifications
          path: "/notifications"
          operations:
            - name: file-notification
              method: POST
    - type: http
      namespace: doc-service
      baseUri: "https://api.internal.csx.com/documents/v1"
      authentication:
        type: bearer
        token: "$secrets.doc_token"
      resources:
        - name: hazmat-docs
          path: "/hazmat-documents"
          operations:
            - name: create-hazmat-doc
              method: POST

Retrieves intermodal ramp capacity metrics, returning daily lift count, capacity utilization, and gate turn time.

naftiko: "0.5"
info:
  label: "Intermodal Ramp Capacity"
  description: "Retrieves intermodal ramp capacity metrics, returning daily lift count, capacity utilization, and gate turn time."
  tags: [intermodal, ramp-operations, capacity]
capability:
  exposes:
    - type: mcp
      namespace: ramp-metrics
      port: 8080
      tools:
        - name: get-ramp-capacity
          description: "Look up intermodal ramp capacity. Returns lifts, utilization, and gate time."
          inputParameters:
            - name: ramp_code
              in: body
              type: string
              description: "The intermodal ramp code."
          call: "intermodal.get-ramp-metrics"
          with: { ramp: "{{ramp_code}}" }
          outputParameters:
            - name: daily_lifts
              type: number
              mapping: "$.ramp.dailyLifts"
            - name: utilization_pct
              type: number
              mapping: "$.ramp.utilizationPercentage"
            - name: gate_turn_minutes
              type: number
              mapping: "$.ramp.avgGateTurnMinutes"
  consumes:
    - type: http
      namespace: intermodal
      baseUri: "https://api.internal.csx.com/intermodal/v1"
      authentication: { type: bearer, token: "$secrets.intermodal_token" }
      resources:
        - name: ramps
          path: "/ramps/{{ramp}}/metrics"
          inputParameters: [{ name: ramp, in: path }]
          operations: [{ name: get-ramp-metrics, method: GET }]

When a new intermodal shipment booking is created, validates the route in the rail planning system, reserves capacity on the train schedule, creates a SAP sales order, and sends confirmation to the shipper.

naftiko: "0.5"
info:
  label: "Intermodal Shipment Booking Pipeline"
  description: "When a new intermodal shipment booking is created, validates the route in the rail planning system, reserves capacity on the train schedule, creates a SAP sales order, and sends confirmation to the shipper."
  tags:
    - intermodal
    - booking
    - sap
    - rail-planning
capability:
  exposes:
    - type: mcp
      namespace: intermodal-booking
      port: 8080
      tools:
        - name: process-intermodal-booking
          description: "Given shipment details, validate the route, reserve capacity, create SAP order, and confirm to shipper."
          inputParameters:
            - name: origin_ramp
              in: body
              type: string
              description: "The origin intermodal ramp code."
            - name: destination_ramp
              in: body
              type: string
              description: "The destination intermodal ramp code."
            - name: container_count
              in: body
              type: number
              description: "Number of containers to book."
            - name: container_type
              in: body
              type: string
              description: "Container type (53ft, 48ft, 40ft)."
            - name: customer_id
              in: body
              type: string
              description: "The customer account identifier."
          steps:
            - name: validate-route
              type: call
              call: "rail-planning.get-route"
              with:
                origin: "{{origin_ramp}}"
                destination: "{{destination_ramp}}"
            - name: reserve-capacity
              type: call
              call: "train-ops.reserve-slots"
              with:
                train_id: "{{validate-route.train_id}}"
                container_count: "{{container_count}}"
                container_type: "{{container_type}}"
            - name: create-order
              type: call
              call: "sap.create-sales-order"
              with:
                customer_id: "{{customer_id}}"
                route_id: "{{validate-route.route_id}}"
                container_count: "{{container_count}}"
            - name: send-confirmation
              type: call
              call: "email-service.send-booking-confirmation"
              with:
                customer_id: "{{customer_id}}"
                booking_number: "{{create-order.order_number}}"
                origin: "{{origin_ramp}}"
                destination: "{{destination_ramp}}"
                etd: "{{validate-route.departure_date}}"
                eta: "{{validate-route.arrival_date}}"
  consumes:
    - type: http
      namespace: rail-planning
      baseUri: "https://api.internal.csx.com/rail-planning/v1"
      authentication:
        type: bearer
        token: "$secrets.rail_planning_token"
      resources:
        - name: routes
          path: "/routes"
          operations:
            - name: get-route
              method: GET
    - type: http
      namespace: train-ops
      baseUri: "https://api.internal.csx.com/train-ops/v1"
      authentication:
        type: bearer
        token: "$secrets.train_ops_token"
      resources:
        - name: capacity
          path: "/capacity/reserve"
          operations:
            - name: reserve-slots
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://csx-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: sales-orders
          path: "/A_SalesOrder"
          operations:
            - name: create-sales-order
              method: POST
    - type: http
      namespace: email-service
      baseUri: "https://api.internal.csx.com/email/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: confirmations
          path: "/booking-confirmations"
          operations:
            - name: send-booking-confirmation
              method: POST

Escalates IT incidents at CSX via ServiceNow, PagerDuty, and Slack.

naftiko: "0.5"
info:
  label: "IT Incident Escalation Pipeline"
  description: "Escalates IT incidents at CSX 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 CSX."
          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://csx.com.service-now.com/api/now"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/table/incident/{{incident_id}}"
          inputParameters:
            - name: incident_id
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: channels
          path: "/conversations.create"
          operations:
            - name: create-channel
              method: POST

Retrieves sprint progress at CSX.

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

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

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

Checks K8s pod health at CSX.

naftiko: "0.5"
info:
  label: "K8s Pod Health"
  description: "Checks K8s pod health at CSX."
  tags:
    - containers
    - kubernetes
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: k8s-pod
      port: 8080
      tools:
        - name: check-pod
          description: "Check pod at CSX."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Namespace."
            - name: pod
              in: body
              type: string
              description: "Pod name."
          call: "k8s.get-pod"
          with:
            namespace: "{{namespace}}"
            pod: "{{pod}}"
          outputParameters:
            - name: phase
              type: string
              mapping: "$.status.phase"
  consumes:
    - type: http
      namespace: k8s
      baseUri: "https://k8s.csx.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: pods
          path: "/namespaces/{{namespace}}/pods/{{pod}}"
          inputParameters:
            - name: namespace
              in: path
            - name: pod
              in: path
          operations:
            - name: get-pod
              method: GET

Checks license compliance at CSX via scanning, entitlements, and procurement.

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

Optimizes locomotive distribution across terminals, assigns power to trains, and notifies dispatch.

naftiko: "0.5"
info:
  label: "Locomotive Distribution Pipeline"
  description: "Optimizes locomotive distribution across terminals, assigns power to trains, and notifies dispatch."
  tags: [locomotive, distribution, dispatch, microsoft-teams]
capability:
  exposes:
    - type: mcp
      namespace: locomotive-distribution
      port: 8080
      tools:
        - name: optimize-locomotive-distribution
          description: "Given a terminal, optimize locomotive assignments and notify dispatch."
          inputParameters:
            - name: terminal_code
              in: body
              type: string
              description: "The terminal code."
          steps:
            - name: get-available-power
              type: call
              call: "locomotive-mgmt.get-available"
              with: { terminal: "{{terminal_code}}" }
            - name: optimize-assignments
              type: call
              call: "locomotive-mgmt.optimize"
              with: { terminal: "{{terminal_code}}", available_units: "{{get-available-power.units}}" }
            - name: notify-dispatch
              type: call
              call: "msteams.send-message"
              with: { channel_id: "dispatch-ops", text: "Locomotive distribution: {{terminal_code}}. {{get-available-power.total_units}} units available. {{optimize-assignments.assigned_count}} assigned to departing trains." }
  consumes:
    - type: http
      namespace: locomotive-mgmt
      baseUri: "https://api.internal.csx.com/locomotives/v1"
      authentication: { type: bearer, token: "$secrets.locomotive_token" }
      resources:
        - name: available
          path: "/terminals/{{terminal}}/available"
          inputParameters: [{ name: terminal, in: path }]
          operations: [{ name: get-available, method: GET }]
        - name: optimize
          path: "/optimize"
          operations: [{ name: optimize, 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 }]

When locomotive emission testing is due, creates a SAP work order, schedules the test at a maintenance facility, and files results with the compliance system.

naftiko: "0.5"
info:
  label: "Locomotive Emission Testing Pipeline"
  description: "When locomotive emission testing is due, creates a SAP work order, schedules the test at a maintenance facility, and files results with the compliance system."
  tags: [emissions, locomotive, testing, sap, compliance]
capability:
  exposes:
    - type: mcp
      namespace: emission-testing
      port: 8080
      tools:
        - name: schedule-emission-test
          description: "Create SAP work order, schedule test, and file compliance results."
          inputParameters:
            - name: locomotive_id
              in: body
              type: string
              description: "The locomotive unit number."
            - name: test_date
              in: body
              type: string
              description: "The planned test date."
          steps:
            - name: create-wo
              type: call
              call: "sap.create-maintenance-order"
              with: { equipment: "{{locomotive_id}}", order_type: "EM01", planned_start: "{{test_date}}" }
            - name: schedule-facility
              type: call
              call: "facility-mgmt.schedule-test"
              with: { locomotive_id: "{{locomotive_id}}", test_type: "emission", date: "{{test_date}}" }
            - name: notify-compliance
              type: call
              call: "msteams.send-message"
              with: { channel_id: "environmental", text: "Emission test scheduled: Loco {{locomotive_id}} on {{test_date}}. WO: {{create-wo.order_number}}. Facility: {{schedule-facility.facility_name}}." }
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://csx-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: facility-mgmt
      baseUri: "https://api.internal.csx.com/facilities/v1"
      authentication: { type: bearer, token: "$secrets.facility_token" }
      resources:
        - name: tests
          path: "/emission-tests"
          operations: [{ name: schedule-test, 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 }]

Pulls locomotive telemetry from the IoT platform, analyzes engine health metrics, creates a maintenance work order in SAP if anomalies detected, and notifies the mechanical team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Locomotive Health Monitoring Pipeline"
  description: "Pulls locomotive telemetry from the IoT platform, analyzes engine health metrics, creates a maintenance work order in SAP if anomalies detected, and notifies the mechanical team via Microsoft Teams."
  tags:
    - locomotive
    - iot
    - predictive-maintenance
    - sap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: locomotive-health
      port: 8080
      tools:
        - name: check-locomotive-health
          description: "Given a locomotive ID, pull telemetry, analyze health, create a work order if needed, and notify the team."
          inputParameters:
            - name: locomotive_id
              in: body
              type: string
              description: "The locomotive unit number."
          steps:
            - name: get-telemetry
              type: call
              call: "iot.get-locomotive-telemetry"
              with:
                unit_id: "{{locomotive_id}}"
            - name: analyze-health
              type: call
              call: "analytics.evaluate-engine-health"
              with:
                unit_id: "{{locomotive_id}}"
                engine_temp: "{{get-telemetry.engine_temp}}"
                oil_pressure: "{{get-telemetry.oil_pressure}}"
                fuel_consumption: "{{get-telemetry.fuel_rate}}"
            - name: create-work-order
              type: call
              call: "sap.create-maintenance-order"
              with:
                equipment: "{{locomotive_id}}"
                order_type: "PM01"
                description: "Predicted maintenance: {{analyze-health.anomaly_type}}. Health score: {{analyze-health.health_score}}/100."
            - name: notify-mechanical
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "mechanical-ops"
                text: "Locomotive {{locomotive_id}} health alert: {{analyze-health.anomaly_type}}. Health score: {{analyze-health.health_score}}/100. WO: {{create-work-order.order_number}}."
  consumes:
    - type: http
      namespace: iot
      baseUri: "https://api.internal.csx.com/iot/v1"
      authentication:
        type: bearer
        token: "$secrets.iot_token"
      resources:
        - name: locomotives
          path: "/locomotives/{{unit_id}}/telemetry"
          inputParameters:
            - name: unit_id
              in: path
          operations:
            - name: get-locomotive-telemetry
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://api.internal.csx.com/analytics/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: health
          path: "/engine-health/evaluate"
          operations:
            - name: evaluate-engine-health
              method: POST
    - type: http
      namespace: sap
      baseUri: "https://csx-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: 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 monthly security reports at CSX from Splunk and Qualys.

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

Retrieves network velocity metrics, returning cars online, trip plan compliance, and average train speed.

naftiko: "0.5"
info:
  label: "Network Velocity Dashboard"
  description: "Retrieves network velocity metrics, returning cars online, trip plan compliance, and average train speed."
  tags: [network-operations, velocity, kpi]
capability:
  exposes:
    - type: mcp
      namespace: network-velocity
      port: 8080
      tools:
        - name: get-network-velocity
          description: "Look up network velocity KPIs. Returns cars online, trip plan compliance, and avg speed."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "The operating region."
          call: "ops-metrics.get-network-velocity"
          with: { region: "{{region}}" }
          outputParameters:
            - name: cars_online
              type: number
              mapping: "$.velocity.carsOnline"
            - name: trip_plan_compliance_pct
              type: number
              mapping: "$.velocity.tripPlanCompliance"
            - name: avg_train_speed_mph
              type: number
              mapping: "$.velocity.avgTrainSpeed"
  consumes:
    - type: http
      namespace: ops-metrics
      baseUri: "https://api.internal.csx.com/operations/v1"
      authentication: { type: bearer, token: "$secrets.ops_token" }
      resources:
        - name: velocity
          path: "/network/velocity"
          operations: [{ name: get-network-velocity, method: GET }]

Onboards employees at CSX with Okta, ServiceNow, Slack, and calendar.

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

naftiko: "0.5"
info:
  label: "New Relic APM Check"
  description: "Checks New Relic APM at CSX."
  tags:
    - monitoring
    - new-relic
    - apm
capability:
  exposes:
    - type: mcp
      namespace: nr-apm
      port: 8080
      tools:
        - name: check-apm
          description: "Check APM at CSX."
          inputParameters:
            - name: app_id
              in: body
              type: string
              description: "App ID."
          call: "newrelic.get-app"
          with:
            app_id: "{{app_id}}"
          outputParameters:
            - name: health
              type: string
              mapping: "$.application.health_status"
  consumes:
    - type: http
      namespace: newrelic
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: bearer
        token: "$secrets.new_relic_api_key"
      resources:
        - name: applications
          path: "/applications/{{app_id}}.json"
          inputParameters:
            - name: app_id
              in: path
          operations:
            - name: get-app
              method: GET

Checks Okta user at CSX.

naftiko: "0.5"
info:
  label: "Okta User Check"
  description: "Checks Okta user at CSX."
  tags:
    - identity
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: okta-user
      port: 8080
      tools:
        - name: check-user
          description: "Check user at CSX."
          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://csx.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

Checks on-call at CSX.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Check"
  description: "Checks on-call at CSX."
  tags:
    - incident-management
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: pd-oncall
      port: 8080
      tools:
        - name: get-oncall
          description: "Check on-call at CSX."
          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 the PTC system status for a locomotive, returning PTC mode, territory coverage, and last communication timestamp.

naftiko: "0.5"
info:
  label: "Positive Train Control Status"
  description: "Retrieves the PTC system status for a locomotive, returning PTC mode, territory coverage, and last communication timestamp."
  tags:
    - ptc
    - safety
    - locomotive
capability:
  exposes:
    - type: mcp
      namespace: ptc-monitoring
      port: 8080
      tools:
        - name: get-ptc-status
          description: "Look up PTC status for a locomotive. Returns PTC mode, coverage, and last communication."
          inputParameters:
            - name: locomotive_id
              in: body
              type: string
              description: "The locomotive unit number."
          call: "ptc.get-status"
          with:
            unit_id: "{{locomotive_id}}"
          outputParameters:
            - name: ptc_mode
              type: string
              mapping: "$.ptc.currentMode"
            - name: territory_coverage
              type: string
              mapping: "$.ptc.territoryCoverage"
            - name: last_comm
              type: string
              mapping: "$.ptc.lastCommunication"
  consumes:
    - type: http
      namespace: ptc
      baseUri: "https://api.internal.csx.com/ptc/v1"
      authentication:
        type: bearer
        token: "$secrets.ptc_token"
      resources:
        - name: status
          path: "/locomotives/{{unit_id}}/status"
          inputParameters:
            - name: unit_id
              in: path
          operations:
            - name: get-status
              method: GET

Creates postmortems at CSX.

naftiko: "0.5"
info:
  label: "Incident Postmortem Pipeline"
  description: "Creates postmortems at CSX."
  tags:
    - incident-management
    - postmortem
    - pagerduty
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: postmortem
      port: 8080
      tools:
        - name: create-postmortem
          description: "Create postmortem at CSX."
          inputParameters:
            - name: incident_id
              in: body
              type: string
              description: "Incident ID."
          steps:
            - name: timeline
              type: call
              call: "pagerduty.get-log"
              with:
                id: "{{incident_id}}"
            - name: metrics
              type: call
              call: "datadog.get-metrics"
              with:
                incident: "{{incident_id}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Postmortem: {{timeline.title}}"
                body: "Impact: {{metrics.impact}}"
            - name: review
              type: call
              call: "calendar.create-event"
              with:
                title: "Review: {{timeline.title}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents/{{id}}/log_entries"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-log
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://csx.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/sre/events"
          operations:
            - name: create-event
              method: POST

Triggers a Power BI dataset refresh for the railroad operations dashboard and returns the refresh status.

naftiko: "0.5"
info:
  label: "Power BI Operations Dashboard Refresh"
  description: "Triggers a Power BI dataset refresh for the railroad operations dashboard and returns the refresh status."
  tags:
    - analytics
    - power-bi
    - operations
capability:
  exposes:
    - type: mcp
      namespace: ops-analytics
      port: 8080
      tools:
        - name: refresh-ops-dashboard
          description: "Trigger a Power BI dataset refresh for operations 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 CSX.

naftiko: "0.5"
info:
  label: "Power BI Refresh Check"
  description: "Checks Power BI refresh at CSX."
  tags:
    - analytics
    - power-bi
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: pbi-refresh
      port: 8080
      tools:
        - name: check-refresh
          description: "Check refresh at CSX."
          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

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

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

Retrieves corridor capacity metrics, returning daily train count, capacity utilization, and bottleneck locations.

naftiko: "0.5"
info:
  label: "Rail Corridor Capacity Utilization"
  description: "Retrieves corridor capacity metrics, returning daily train count, capacity utilization, and bottleneck locations."
  tags: [capacity-planning, corridor, operations]
capability:
  exposes:
    - type: mcp
      namespace: corridor-capacity
      port: 8080
      tools:
        - name: get-corridor-utilization
          description: "Look up rail corridor capacity. Returns train count, utilization, and bottlenecks."
          inputParameters:
            - name: corridor_id
              in: body
              type: string
              description: "The rail corridor ID."
          call: "rail-planning.get-corridor-metrics"
          with: { corridor_id: "{{corridor_id}}" }
          outputParameters:
            - name: daily_trains
              type: number
              mapping: "$.corridor.dailyTrainCount"
            - name: utilization_pct
              type: number
              mapping: "$.corridor.utilizationPercentage"
            - name: bottleneck
              type: string
              mapping: "$.corridor.primaryBottleneck"
  consumes:
    - type: http
      namespace: rail-planning
      baseUri: "https://api.internal.csx.com/rail-planning/v1"
      authentication: { type: bearer, token: "$secrets.rail_planning_token" }
      resources:
        - name: corridors
          path: "/corridors/{{corridor_id}}/metrics"
          inputParameters: [{ name: corridor_id, in: path }]
          operations: [{ name: get-corridor-metrics, method: GET }]

Retrieves the inspection status of a railroad switch, returning last inspection date, condition, and next due date.

naftiko: "0.5"
info:
  label: "Rail Switch Inspection Status"
  description: "Retrieves the inspection status of a railroad switch, returning last inspection date, condition, and next due date."
  tags: [switches, track-maintenance, inspection]
capability:
  exposes:
    - type: mcp
      namespace: switch-maintenance
      port: 8080
      tools:
        - name: get-switch-inspection
          description: "Look up switch inspection status. Returns last inspection, condition, and next due."
          inputParameters:
            - name: switch_id
              in: body
              type: string
              description: "The switch identifier."
          call: "track-mgmt.get-switch-status"
          with: { switch_id: "{{switch_id}}" }
          outputParameters:
            - name: last_inspection
              type: string
              mapping: "$.switch.lastInspectionDate"
            - name: condition
              type: string
              mapping: "$.switch.condition"
            - name: next_due
              type: string
              mapping: "$.switch.nextInspectionDue"
  consumes:
    - type: http
      namespace: track-mgmt
      baseUri: "https://api.internal.csx.com/track/v1"
      authentication: { type: bearer, token: "$secrets.track_token" }
      resources:
        - name: switches
          path: "/switches/{{switch_id}}/inspection"
          inputParameters: [{ name: switch_id, in: path }]
          operations: [{ name: get-switch-status, method: GET }]

Retrieves bad-ordered railcars at a location, returning car count, defect types, and estimated repair time.

naftiko: "0.5"
info:
  label: "Railcar Bad Order Report"
  description: "Retrieves bad-ordered railcars at a location, returning car count, defect types, and estimated repair time."
  tags: [railcar, bad-order, maintenance]
capability:
  exposes:
    - type: mcp
      namespace: car-health
      port: 8080
      tools:
        - name: get-bad-order-cars
          description: "Look up bad-ordered cars at a location. Returns count, defects, and repair time."
          inputParameters:
            - name: location_code
              in: body
              type: string
              description: "The terminal or yard location code."
          call: "car-mgmt.get-bad-orders"
          with: { location: "{{location_code}}" }
          outputParameters:
            - name: car_count
              type: number
              mapping: "$.badOrders.totalCount"
            - name: top_defect
              type: string
              mapping: "$.badOrders.topDefectType"
            - name: avg_repair_hours
              type: number
              mapping: "$.badOrders.avgRepairHours"
  consumes:
    - type: http
      namespace: car-mgmt
      baseUri: "https://api.internal.csx.com/car-management/v1"
      authentication: { type: bearer, token: "$secrets.car_mgmt_token" }
      resources:
        - name: bad-orders
          path: "/locations/{{location}}/bad-orders"
          inputParameters: [{ name: location, in: path }]
          operations: [{ name: get-bad-orders, method: GET }]

Pulls railcar fleet data from the car management system, generates utilization analytics in the reporting platform, and sends the fleet report to management via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Railcar Fleet Utilization Report Pipeline"
  description: "Pulls railcar fleet data from the car management system, generates utilization analytics in the reporting platform, and sends the fleet report to management via Microsoft Outlook."
  tags:
    - fleet-management
    - railcar
    - analytics
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: fleet-analytics
      port: 8080
      tools:
        - name: generate-fleet-report
          description: "Given a date range, pull fleet data, generate utilization report, and email to management."
          inputParameters:
            - name: start_date
              in: body
              type: string
              description: "Start date."
            - name: end_date
              in: body
              type: string
              description: "End date."
          steps:
            - name: get-fleet-data
              type: call
              call: "car-mgmt.get-fleet-utilization"
              with:
                start: "{{start_date}}"
                end: "{{end_date}}"
            - name: generate-report
              type: call
              call: "reporting.generate-fleet-report"
              with:
                data: "{{get-fleet-data.utilization}}"
                period: "{{start_date}} to {{end_date}}"
            - name: send-report
              type: call
              call: "outlook.send-email"
              with:
                to: "fleet-management@csx.com"
                subject: "Fleet Utilization Report: {{start_date}} to {{end_date}}"
                body: "Cars in service: {{get-fleet-data.cars_in_service}}. Avg cycle time: {{get-fleet-data.avg_cycle_days}} days. Utilization: {{get-fleet-data.utilization_pct}}%. Report: {{generate-report.url}}."
  consumes:
    - type: http
      namespace: car-mgmt
      baseUri: "https://api.internal.csx.com/car-management/v1"
      authentication:
        type: bearer
        token: "$secrets.car_mgmt_token"
      resources:
        - name: utilization
          path: "/fleet/utilization"
          operations:
            - name: get-fleet-utilization
              method: GET
    - type: http
      namespace: reporting
      baseUri: "https://api.internal.csx.com/reporting/v1"
      authentication:
        type: bearer
        token: "$secrets.reporting_token"
      resources:
        - name: fleet-reports
          path: "/fleet-reports"
          operations:
            - name: generate-fleet-report
              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

Retrieves the latest mechanical inspection results for a railcar, returning inspection type, date, defects found, and pass/fail status.

naftiko: "0.5"
info:
  label: "Railcar Inspection Report"
  description: "Retrieves the latest mechanical inspection results for a railcar, returning inspection type, date, defects found, and pass/fail status."
  tags: [railcar, inspection, mechanical]
capability:
  exposes:
    - type: mcp
      namespace: car-inspection
      port: 8080
      tools:
        - name: get-car-inspection
          description: "Look up railcar inspection results. Returns type, date, defects, and status."
          inputParameters:
            - name: reporting_mark
              in: body
              type: string
              description: "The railcar reporting mark."
          call: "car-mgmt.get-inspection"
          with: { reporting_mark: "{{reporting_mark}}" }
          outputParameters:
            - name: inspection_type
              type: string
              mapping: "$.inspection.type"
            - name: date
              type: string
              mapping: "$.inspection.date"
            - name: defects_found
              type: number
              mapping: "$.inspection.defectCount"
            - name: status
              type: string
              mapping: "$.inspection.status"
  consumes:
    - type: http
      namespace: car-mgmt
      baseUri: "https://api.internal.csx.com/car-management/v1"
      authentication: { type: bearer, token: "$secrets.car_mgmt_token" }
      resources:
        - name: inspections
          path: "/railcars/{{reporting_mark}}/inspection"
          inputParameters: [{ name: reporting_mark, in: path }]
          operations: [{ name: get-inspection, method: GET }]

Retrieves the current location of a railcar by reporting mark, returning location, train symbol, status, and last event timestamp.

naftiko: "0.5"
info:
  label: "Railcar Location Tracking"
  description: "Retrieves the current location of a railcar by reporting mark, returning location, train symbol, status, and last event timestamp."
  tags:
    - railcar-tracking
    - visibility
    - logistics
capability:
  exposes:
    - type: mcp
      namespace: railcar-tracking
      port: 8080
      tools:
        - name: get-railcar-location
          description: "Track a railcar by reporting mark. Returns location, train, status, and last event time."
          inputParameters:
            - name: reporting_mark
              in: body
              type: string
              description: "The railcar reporting mark (e.g., CSXT 123456)."
          call: "tracking.get-railcar"
          with:
            reporting_mark: "{{reporting_mark}}"
          outputParameters:
            - name: location
              type: string
              mapping: "$.railcar.currentLocation"
            - name: train_symbol
              type: string
              mapping: "$.railcar.trainSymbol"
            - name: status
              type: string
              mapping: "$.railcar.status"
            - name: last_event
              type: string
              mapping: "$.railcar.lastEventTimestamp"
  consumes:
    - type: http
      namespace: tracking
      baseUri: "https://api.internal.csx.com/tracking/v1"
      authentication:
        type: bearer
        token: "$secrets.tracking_token"
      resources:
        - name: railcars
          path: "/railcars/{{reporting_mark}}"
          inputParameters:
            - name: reporting_mark
              in: path
          operations:
            - name: get-railcar
              method: GET

Checks Redis at CSX.

naftiko: "0.5"
info:
  label: "Redis Cache Status"
  description: "Checks Redis at CSX."
  tags:
    - caching
    - redis
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: redis
      port: 8080
      tools:
        - name: check-cache
          description: "Check Redis at CSX."
          inputParameters:
            - name: instance
              in: body
              type: string
              description: "Instance ID."
          call: "redis.get-info"
          with:
            instance: "{{instance}}"
          outputParameters:
            - name: memory
              type: string
              mapping: "$.used_memory_human"
  consumes:
    - type: http
      namespace: redis
      baseUri: "https://redis.csx.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.redis_token"
      resources:
        - name: instances
          path: "/instances/{{instance}}/info"
          inputParameters:
            - name: instance
              in: path
          operations:
            - name: get-info
              method: GET

Checks release readiness at CSX.

naftiko: "0.5"
info:
  label: "Release Readiness Pipeline"
  description: "Checks release readiness at CSX."
  tags:
    - release-management
    - devops
    - quality
capability:
  exposes:
    - type: mcp
      namespace: release-ready
      port: 8080
      tools:
        - name: check-release
          description: "Check release at CSX."
          inputParameters:
            - name: release_id
              in: body
              type: string
              description: "Release ID."
            - name: project
              in: body
              type: string
              description: "Project."
          steps:
            - name: tests
              type: call
              call: "azdo.get-tests"
              with:
                project: "{{project}}"
                release: "{{release_id}}"
            - name: quality
              type: call
              call: "sonarqube.get-gate"
              with:
                project: "{{project}}"
            - name: security
              type: call
              call: "security.get-scan"
              with:
                project: "{{project}}"
            - name: doc
              type: call
              call: "confluence.create-page"
              with:
                title: "Release - {{release_id}}"
                body: "Tests: {{tests.pass_rate}}% Quality: {{quality.status}}"
  consumes:
    - type: http
      namespace: azdo
      baseUri: "https://dev.azure.com/csx.com"
      authentication:
        type: bearer
        token: "$secrets.azdo_token"
      resources:
        - name: tests
          path: "/{{project}}/_apis/test/runs"
          inputParameters:
            - name: project
              in: path
          operations:
            - name: get-tests
              method: GET
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.csx.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality
          path: "/qualitygates/project_status"
          operations:
            - name: get-gate
              method: GET
    - type: http
      namespace: security
      baseUri: "https://security.csx.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.security_token"
      resources:
        - name: scans
          path: "/results"
          operations:
            - name: get-scan
              method: GET
    - type: http
      namespace: confluence
      baseUri: "https://csx.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves a travel expense report from SAP Concur, returning total amount, approval status, and payment status.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Expense Report"
  description: "Retrieves a travel expense report from SAP Concur, returning total amount, approval status, and payment status."
  tags: [expense-management, sap-concur, finance]
capability:
  exposes:
    - type: mcp
      namespace: expense-management
      port: 8080
      tools:
        - name: get-expense-report
          description: "Look up a SAP Concur expense report. Returns total, approval, and payment status."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The Concur report ID."
          call: "concur.get-report"
          with: { report_id: "{{report_id}}" }
          outputParameters:
            - name: total_amount
              type: number
              mapping: "$.Total"
            - name: approval_status
              type: string
              mapping: "$.ApprovalStatusName"
            - name: payment_status
              type: string
              mapping: "$.PaymentStatusName"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us2.api.concursolutions.com/api/v3.0"
      authentication: { type: bearer, token: "$secrets.concur_token" }
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters: [{ name: report_id, in: path }]
          operations: [{ name: get-report, method: GET }]

Looks up a SAP freight waybill by number and returns shipment status, commodity, weight, origin, destination, and estimated arrival.

naftiko: "0.5"
info:
  label: "SAP Freight Waybill Status"
  description: "Looks up a SAP freight waybill by number and returns shipment status, commodity, weight, origin, destination, and estimated arrival."
  tags:
    - freight
    - sap
    - waybill
capability:
  exposes:
    - type: mcp
      namespace: freight-ops
      port: 8080
      tools:
        - name: get-waybill
          description: "Look up a SAP freight waybill. Returns status, commodity, weight, origin, destination, and ETA."
          inputParameters:
            - name: waybill_number
              in: body
              type: string
              description: "The SAP waybill number."
          call: "sap.get-waybill"
          with:
            waybill_number: "{{waybill_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.ShipmentStatus"
            - name: commodity
              type: string
              mapping: "$.d.CommodityDescription"
            - name: weight_tons
              type: number
              mapping: "$.d.GrossWeight"
            - name: origin
              type: string
              mapping: "$.d.OriginStation"
            - name: destination
              type: string
              mapping: "$.d.DestinationStation"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://csx-s4.sap.com/sap/opu/odata/sap/API_FREIGHT_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: waybills
          path: "/A_FreightOrder('{{waybill_number}}')"
          inputParameters:
            - name: waybill_number
              in: path
          operations:
            - name: get-waybill
              method: GET

Checks SAP PO at CSX.

naftiko: "0.5"
info:
  label: "SAP PO Check"
  description: "Checks SAP PO at CSX."
  tags:
    - procurement
    - sap
    - purchase-orders
capability:
  exposes:
    - type: mcp
      namespace: sap-po
      port: 8080
      tools:
        - name: get-po
          description: "Check PO at CSX."
          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.csx.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 for railroad supplies, returning status, vendor, total value, and delivery date.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Looks up a SAP purchase order for railroad supplies, returning status, vendor, total value, and delivery date."
  tags:
    - procurement
    - 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, 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://csx-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

Remediates vulnerabilities at CSX via scanning, Jira, and Slack.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "Remediates vulnerabilities at CSX 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 CSX."
          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.csx.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://csx.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, returning state, approval status, planned start, and risk assessment.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Status"
  description: "Retrieves a ServiceNow change request, 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 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://csx.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 CSX.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Detail Check"
  description: "Checks IT incident in ServiceNow for CSX."
  tags:
    - it-service
    - servicenow
    - incident-management
capability:
  exposes:
    - type: mcp
      namespace: snow-incident
      port: 8080
      tools:
        - name: check-incident
          description: "Check incident at CSX."
          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://csx.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 an IT incident from ServiceNow, returning short description, priority, state, and assigned group.

naftiko: "0.5"
info:
  label: "ServiceNow IT Incident Lookup"
  description: "Retrieves an IT incident from ServiceNow, returning short description, priority, state, and assigned group."
  tags:
    - it-service
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-service
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident. Returns description, priority, state, and assigned group."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
          call: "servicenow.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: short_description
              type: string
              mapping: "$.result.short_description"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: state
              type: string
              mapping: "$.result.state"
            - name: assigned_group
              type: string
              mapping: "$.result.assignment_group.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://csx.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: get-incident
              method: GET

Retrieves SharePoint metadata at CSX.

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

Retrieves the status of a railroad signal system from the signal monitoring platform, returning signal aspect, battery voltage, and communication status.

naftiko: "0.5"
info:
  label: "Signal System Status Lookup"
  description: "Retrieves the status of a railroad signal system from the signal monitoring platform, returning signal aspect, battery voltage, and communication status."
  tags:
    - signals
    - safety
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: signal-monitoring
      port: 8080
      tools:
        - name: get-signal-status
          description: "Look up signal system status. Returns aspect, battery voltage, and communication status."
          inputParameters:
            - name: signal_id
              in: body
              type: string
              description: "The signal identifier."
          call: "signal-monitor.get-status"
          with:
            signal_id: "{{signal_id}}"
          outputParameters:
            - name: aspect
              type: string
              mapping: "$.signal.currentAspect"
            - name: battery_voltage
              type: number
              mapping: "$.signal.batteryVoltage"
            - name: comm_status
              type: string
              mapping: "$.signal.communicationStatus"
  consumes:
    - type: http
      namespace: signal-monitor
      baseUri: "https://api.internal.csx.com/signals/v1"
      authentication:
        type: bearer
        token: "$secrets.signal_token"
      resources:
        - name: signals
          path: "/signals/{{signal_id}}"
          inputParameters:
            - name: signal_id
              in: path
          operations:
            - name: get-status
              method: GET

Monitors SLAs at CSX via Datadog and Slack.

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

Searches Splunk at CSX.

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

Retrieves Teams activity at CSX.

naftiko: "0.5"
info:
  label: "Teams Channel Activity"
  description: "Retrieves Teams activity at CSX."
  tags:
    - communications
    - microsoft-teams
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: teams-activity
      port: 8080
      tools:
        - name: get-activity
          description: "Check Teams activity at CSX."
          inputParameters:
            - name: team_id
              in: body
              type: string
              description: "Team ID."
            - name: channel_id
              in: body
              type: string
              description: "Channel ID."
          call: "teams.get-messages"
          with:
            team_id: "{{team_id}}"
            channel_id: "{{channel_id}}"
          outputParameters:
            - name: count
              type: number
              mapping: "$.value.length"
  consumes:
    - type: http
      namespace: teams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: messages
          path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: get-messages
              method: GET

Retrieves average railcar dwell time at a terminal, returning average hours, car count, and longest dwell.

naftiko: "0.5"
info:
  label: "Terminal Dwell Time Report"
  description: "Retrieves average railcar dwell time at a terminal, returning average hours, car count, and longest dwell."
  tags: [terminal, dwell-time, operations-metrics]
capability:
  exposes:
    - type: mcp
      namespace: terminal-metrics
      port: 8080
      tools:
        - name: get-dwell-time
          description: "Look up terminal dwell metrics. Returns avg hours, car count, and longest dwell."
          inputParameters:
            - name: terminal_code
              in: body
              type: string
              description: "The terminal code."
          call: "ops-metrics.get-dwell"
          with: { terminal: "{{terminal_code}}" }
          outputParameters:
            - name: avg_dwell_hours
              type: number
              mapping: "$.dwell.averageHours"
            - name: car_count
              type: number
              mapping: "$.dwell.carCount"
            - name: longest_dwell_hours
              type: number
              mapping: "$.dwell.longestDwellHours"
  consumes:
    - type: http
      namespace: ops-metrics
      baseUri: "https://api.internal.csx.com/operations/v1"
      authentication: { type: bearer, token: "$secrets.ops_token" }
      resources:
        - name: dwell
          path: "/terminals/{{terminal}}/dwell"
          inputParameters: [{ name: terminal, in: path }]
          operations: [{ name: get-dwell, method: GET }]

Checks Terraform workspace at CSX.

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

Identifies track segments needing tie replacement, generates work orders in SAP, and schedules maintenance windows with dispatch.

naftiko: "0.5"
info:
  label: "Tie Replacement Planning Pipeline"
  description: "Identifies track segments needing tie replacement, generates work orders in SAP, and schedules maintenance windows with dispatch."
  tags: [track-maintenance, ties, sap, dispatch]
capability:
  exposes:
    - type: mcp
      namespace: tie-replacement
      port: 8080
      tools:
        - name: plan-tie-replacement
          description: "Identify segments, create SAP work orders, and schedule windows."
          inputParameters:
            - name: subdivision
              in: body
              type: string
              description: "The subdivision."
            - name: planned_year
              in: body
              type: string
              description: "The planned replacement year."
          steps:
            - name: get-deficient-segments
              type: call
              call: "track-mgmt.get-tie-deficient"
              with: { subdivision: "{{subdivision}}" }
            - name: create-work-orders
              type: call
              call: "sap.create-maintenance-order"
              with: { equipment: "TRACK_{{subdivision}}", order_type: "TR01", description: "Tie replacement: {{get-deficient-segments.segment_count}} segments" }
            - name: schedule-windows
              type: call
              call: "dispatch.request-maintenance-window"
              with: { subdivision: "{{subdivision}}", work_order: "{{create-work-orders.order_number}}", segments: "{{get-deficient-segments.segments}}" }
  consumes:
    - type: http
      namespace: track-mgmt
      baseUri: "https://api.internal.csx.com/track/v1"
      authentication: { type: bearer, token: "$secrets.track_token" }
      resources:
        - name: ties
          path: "/subdivisions/{{subdivision}}/tie-deficient"
          inputParameters: [{ name: subdivision, in: path }]
          operations: [{ name: get-tie-deficient, method: GET }]
    - type: http
      namespace: sap
      baseUri: "https://csx-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: dispatch
      baseUri: "https://api.internal.csx.com/dispatch/v1"
      authentication: { type: bearer, token: "$secrets.dispatch_token" }
      resources:
        - name: windows
          path: "/maintenance-windows"
          operations: [{ name: request-maintenance-window, method: POST }]

When a track geometry car identifies a defect, creates a maintenance work order in SAP, dispatches a track maintenance crew, updates the GIS track condition layer, and notifies the engineering team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Track Defect Inspection Pipeline"
  description: "When a track geometry car identifies a defect, creates a maintenance work order in SAP, dispatches a track maintenance crew, updates the GIS track condition layer, and notifies the engineering team via Microsoft Teams."
  tags:
    - track-maintenance
    - inspection
    - sap
    - gis
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: track-maintenance
      port: 8080
      tools:
        - name: process-track-defect
          description: "Given a defect location and type, create a work order, dispatch crew, update GIS, and notify engineering."
          inputParameters:
            - name: milepost
              in: body
              type: string
              description: "The track milepost where defect was found."
            - name: subdivision
              in: body
              type: string
              description: "The track subdivision."
            - name: defect_type
              in: body
              type: string
              description: "The defect type (e.g., gauge-wide, rail-defect, crossties, ballast)."
            - name: severity
              in: body
              type: string
              description: "Defect severity (critical, priority, routine)."
          steps:
            - name: create-wo
              type: call
              call: "sap.create-maintenance-order"
              with:
                equipment: "TRACK_{{subdivision}}_MP{{milepost}}"
                order_type: "TM01"
                activity_type: "{{defect_type}}"
                priority: "{{severity}}"
            - name: dispatch-crew
              type: call
              call: "workforce.dispatch-track-crew"
              with:
                subdivision: "{{subdivision}}"
                milepost: "{{milepost}}"
                defect_type: "{{defect_type}}"
                work_order: "{{create-wo.order_number}}"
            - name: update-gis
              type: call
              call: "gis.update-track-condition"
              with:
                subdivision: "{{subdivision}}"
                milepost: "{{milepost}}"
                condition: "{{defect_type}}"
                severity: "{{severity}}"
            - name: notify-engineering
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "track-engineering"
                text: "Track defect: {{defect_type}} ({{severity}}) at MP {{milepost}} on {{subdivision}} Sub. WO: {{create-wo.order_number}}. Crew: {{dispatch-crew.crew_id}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://csx-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
      baseUri: "https://api.internal.csx.com/workforce/v1"
      authentication:
        type: bearer
        token: "$secrets.workforce_token"
      resources:
        - name: dispatch
          path: "/track-crews/dispatch"
          operations:
            - name: dispatch-track-crew
              method: POST
    - type: http
      namespace: gis
      baseUri: "https://gis.internal.csx.com/arcgis/rest/services"
      authentication:
        type: bearer
        token: "$secrets.gis_token"
      resources:
        - name: track-conditions
          path: "/TrackConditions/FeatureServer/0/updateFeatures"
          operations:
            - name: update-track-condition
              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

When a train is being built, pulls the planned consist from the dispatch system, validates weight and length against route restrictions, and sends the consist report to the crew management system.

naftiko: "0.5"
info:
  label: "Train Consist Management Pipeline"
  description: "When a train is being built, pulls the planned consist from the dispatch system, validates weight and length against route restrictions, and sends the consist report to the crew management system."
  tags:
    - train-operations
    - dispatch
    - consist
    - crew-management
capability:
  exposes:
    - type: mcp
      namespace: train-consist
      port: 8080
      tools:
        - name: validate-train-consist
          description: "Given a train symbol, validate the consist against route restrictions and forward to crew management."
          inputParameters:
            - name: train_symbol
              in: body
              type: string
              description: "The train symbol (e.g., Q123)."
            - name: origin_yard
              in: body
              type: string
              description: "The origin classification yard."
          steps:
            - name: get-consist
              type: call
              call: "dispatch.get-consist"
              with:
                train_symbol: "{{train_symbol}}"
                yard: "{{origin_yard}}"
            - name: validate-restrictions
              type: call
              call: "rail-planning.validate-consist"
              with:
                train_symbol: "{{train_symbol}}"
                total_weight_tons: "{{get-consist.total_weight}}"
                total_length_feet: "{{get-consist.total_length}}"
                car_count: "{{get-consist.car_count}}"
            - name: send-to-crew
              type: call
              call: "crew-mgmt.assign-consist"
              with:
                train_symbol: "{{train_symbol}}"
                consist_id: "{{get-consist.consist_id}}"
                departure_time: "{{get-consist.scheduled_departure}}"
  consumes:
    - type: http
      namespace: dispatch
      baseUri: "https://api.internal.csx.com/dispatch/v1"
      authentication:
        type: bearer
        token: "$secrets.dispatch_token"
      resources:
        - name: consists
          path: "/trains/{{train_symbol}}/consist"
          inputParameters:
            - name: train_symbol
              in: path
          operations:
            - name: get-consist
              method: GET
    - type: http
      namespace: rail-planning
      baseUri: "https://api.internal.csx.com/rail-planning/v1"
      authentication:
        type: bearer
        token: "$secrets.rail_planning_token"
      resources:
        - name: validation
          path: "/consist/validate"
          operations:
            - name: validate-consist
              method: POST
    - type: http
      namespace: crew-mgmt
      baseUri: "https://api.internal.csx.com/crew/v1"
      authentication:
        type: bearer
        token: "$secrets.crew_token"
      resources:
        - name: assignments
          path: "/assignments"
          operations:
            - name: assign-consist
              method: POST

When a train is delayed beyond threshold, pulls the delay reason from dispatch, updates customer ETAs in the tracking system, and notifies affected customers via the notification service.

naftiko: "0.5"
info:
  label: "Train Delay Notification Pipeline"
  description: "When a train is delayed beyond threshold, pulls the delay reason from dispatch, updates customer ETAs in the tracking system, and notifies affected customers via the notification service."
  tags:
    - train-operations
    - delay-management
    - customer-notification
capability:
  exposes:
    - type: mcp
      namespace: delay-management
      port: 8080
      tools:
        - name: process-train-delay
          description: "Given a train and delay details, update customer ETAs and send delay notifications."
          inputParameters:
            - name: train_symbol
              in: body
              type: string
              description: "The delayed train symbol."
            - name: delay_minutes
              in: body
              type: number
              description: "The delay in minutes."
            - name: delay_reason
              in: body
              type: string
              description: "The delay reason code."
          steps:
            - name: get-affected-shipments
              type: call
              call: "dispatch.get-train-shipments"
              with:
                train_symbol: "{{train_symbol}}"
            - name: update-etas
              type: call
              call: "tracking.update-etas"
              with:
                train_symbol: "{{train_symbol}}"
                delay_minutes: "{{delay_minutes}}"
                shipments: "{{get-affected-shipments.waybills}}"
            - name: notify-customers
              type: call
              call: "notification-service.send-delay-alerts"
              with:
                train_symbol: "{{train_symbol}}"
                delay_minutes: "{{delay_minutes}}"
                reason: "{{delay_reason}}"
                affected_shipments: "{{get-affected-shipments.waybills}}"
  consumes:
    - type: http
      namespace: dispatch
      baseUri: "https://api.internal.csx.com/dispatch/v1"
      authentication:
        type: bearer
        token: "$secrets.dispatch_token"
      resources:
        - name: shipments
          path: "/trains/{{train_symbol}}/shipments"
          inputParameters:
            - name: train_symbol
              in: path
          operations:
            - name: get-train-shipments
              method: GET
    - type: http
      namespace: tracking
      baseUri: "https://api.internal.csx.com/tracking/v1"
      authentication:
        type: bearer
        token: "$secrets.tracking_token"
      resources:
        - name: etas
          path: "/etas/bulk-update"
          operations:
            - name: update-etas
              method: POST
    - type: http
      namespace: notification-service
      baseUri: "https://api.internal.csx.com/notifications/v1"
      authentication:
        type: bearer
        token: "$secrets.notification_token"
      resources:
        - name: delays
          path: "/delay-alerts"
          operations:
            - name: send-delay-alerts
              method: POST

Retrieves train performance metrics, returning average speed, dwell time, and on-time performance percentage.

naftiko: "0.5"
info:
  label: "Train Performance Metrics"
  description: "Retrieves train performance metrics, returning average speed, dwell time, and on-time performance percentage."
  tags: [train-operations, performance, metrics]
capability:
  exposes:
    - type: mcp
      namespace: train-performance
      port: 8080
      tools:
        - name: get-train-performance
          description: "Look up train performance. Returns avg speed, dwell time, and OTP."
          inputParameters:
            - name: train_symbol
              in: body
              type: string
              description: "The train symbol."
          call: "ops-metrics.get-train-perf"
          with: { train_symbol: "{{train_symbol}}" }
          outputParameters:
            - name: avg_speed_mph
              type: number
              mapping: "$.performance.avgSpeed"
            - name: dwell_time_hours
              type: number
              mapping: "$.performance.avgDwellTime"
            - name: otp_pct
              type: number
              mapping: "$.performance.onTimePercentage"
  consumes:
    - type: http
      namespace: ops-metrics
      baseUri: "https://api.internal.csx.com/operations/v1"
      authentication: { type: bearer, token: "$secrets.ops_token" }
      resources:
        - name: performance
          path: "/trains/{{train_symbol}}/performance"
          inputParameters: [{ name: train_symbol, in: path }]
          operations: [{ name: get-train-perf, method: GET }]

Verifies tunnel clearance for an oversized shipment against the route clearance database.

naftiko: "0.5"
info:
  label: "Tunnel Clearance Verification"
  description: "Verifies tunnel clearance for an oversized shipment against the route clearance database."
  tags: [clearance, oversized, route-planning]
capability:
  exposes:
    - type: mcp
      namespace: clearance-ops
      port: 8080
      tools:
        - name: verify-tunnel-clearance
          description: "Check tunnel clearance for a shipment. Returns clearance status and restrictions."
          inputParameters:
            - name: route_id
              in: body
              type: string
              description: "The route identifier."
            - name: height_inches
              in: body
              type: number
              description: "The shipment height in inches."
            - name: width_inches
              in: body
              type: number
              description: "The shipment width in inches."
          call: "rail-planning.check-clearance"
          with: { route_id: "{{route_id}}", height: "{{height_inches}}", width: "{{width_inches}}" }
          outputParameters:
            - name: clearance_status
              type: string
              mapping: "$.clearance.status"
            - name: restrictions
              type: string
              mapping: "$.clearance.restrictions"
  consumes:
    - type: http
      namespace: rail-planning
      baseUri: "https://api.internal.csx.com/rail-planning/v1"
      authentication: { type: bearer, token: "$secrets.rail_planning_token" }
      resources:
        - name: clearance
          path: "/clearance/verify"
          operations: [{ name: check-clearance, method: POST }]

Checks Vault secret at CSX.

naftiko: "0.5"
info:
  label: "Vault Secret Metadata"
  description: "Checks Vault secret at CSX."
  tags:
    - security
    - vault
    - secrets-management
capability:
  exposes:
    - type: mcp
      namespace: vault
      port: 8080
      tools:
        - name: check-secret
          description: "Check secret at CSX."
          inputParameters:
            - name: path
              in: body
              type: string
              description: "Secret path."
          call: "vault.get-metadata"
          with:
            path: "{{path}}"
          outputParameters:
            - name: version
              type: number
              mapping: "$.data.current_version"
  consumes:
    - type: http
      namespace: vault
      baseUri: "https://vault.csx.com/v1"
      authentication:
        type: bearer
        token: "$secrets.vault_token"
      resources:
        - name: secrets
          path: "/secret/metadata/{{path}}"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: get-metadata
              method: GET

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

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

Reviews vendors at CSX.

naftiko: "0.5"
info:
  label: "Quarterly Vendor Review Pipeline"
  description: "Reviews vendors at CSX."
  tags:
    - procurement
    - vendor-management
    - review
capability:
  exposes:
    - type: mcp
      namespace: vendor-review
      port: 8080
      tools:
        - name: review-vendor
          description: "Review vendors at CSX."
          inputParameters:
            - name: vendor_id
              in: body
              type: string
              description: "Vendor ID."
            - name: quarter
              in: body
              type: string
              description: "Quarter."
          steps:
            - name: perf
              type: call
              call: "procurement.get-metrics"
              with:
                vendor: "{{vendor_id}}"
                q: "{{quarter}}"
            - name: scorecard
              type: call
              call: "analytics.scorecard"
              with:
                data: "{{perf.data}}"
            - name: invite
              type: call
              call: "email.send"
              with:
                to: "{{perf.contact}}"
                subject: "QBR - {{quarter}}"
            - name: schedule
              type: call
              call: "calendar.create-event"
              with:
                title: "QBR - {{perf.name}}"
  consumes:
    - type: http
      namespace: procurement
      baseUri: "https://procurement.csx.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.procurement_token"
      resources:
        - name: vendors
          path: "/vendors/{{vendor}}/metrics"
          inputParameters:
            - name: vendor
              in: path
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: analytics
      baseUri: "https://analytics.csx.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.analytics_token"
      resources:
        - name: scorecards
          path: "/compute"
          operations:
            - name: scorecard
              method: POST
    - type: http
      namespace: email
      baseUri: "https://email.csx.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.email_token"
      resources:
        - name: messages
          path: "/send"
          operations:
            - name: send
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/proc/events"
          operations:
            - name: create-event
              method: POST

When a wayside detector flags a hot bearing or dragging equipment, creates a ServiceNow incident, stops the train via dispatch, and notifies the mechanical team.

naftiko: "0.5"
info:
  label: "Wayside Detector Alert Pipeline"
  description: "When a wayside detector flags a hot bearing or dragging equipment, creates a ServiceNow incident, stops the train via dispatch, and notifies the mechanical team."
  tags: [wayside-detection, safety, servicenow, dispatch, microsoft-teams]
capability:
  exposes:
    - type: mcp
      namespace: wayside-safety
      port: 8080
      tools:
        - name: process-detector-alert
          description: "Given a detector alert, create incident, stop the train, and notify mechanical."
          inputParameters:
            - name: detector_id
              in: body
              type: string
              description: "The wayside detector ID."
            - name: alert_type
              in: body
              type: string
              description: "Alert type (hot-bearing, dragging-equipment, shifted-load)."
            - name: train_symbol
              in: body
              type: string
              description: "The train symbol."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with: { short_description: "Wayside alert: {{alert_type}} on {{train_symbol}}", category: "wayside_detection", priority: "critical" }
            - name: stop-train
              type: call
              call: "dispatch.issue-stop-order"
              with: { train_symbol: "{{train_symbol}}", reason: "{{alert_type}}", detector_id: "{{detector_id}}" }
            - name: notify-mechanical
              type: call
              call: "msteams.send-message"
              with: { channel_id: "mechanical-ops", text: "WAYSIDE ALERT: {{alert_type}} on {{train_symbol}} at detector {{detector_id}}. Train stopped. Incident: {{create-incident.number}}." }
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://csx.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: dispatch
      baseUri: "https://api.internal.csx.com/dispatch/v1"
      authentication: { type: bearer, token: "$secrets.dispatch_token" }
      resources:
        - name: stop-orders
          path: "/stop-orders"
          operations: [{ name: issue-stop-order, 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 }]

When severe weather is forecasted, pulls the affected route segments, adjusts train speeds via dispatch, and notifies the operations center via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Weather Impact Assessment Pipeline"
  description: "When severe weather is forecasted, pulls the affected route segments, adjusts train speeds via dispatch, and notifies the operations center via Microsoft Teams."
  tags:
    - weather
    - operations
    - dispatch
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: weather-ops
      port: 8080
      tools:
        - name: assess-weather-impact
          description: "Given a weather alert, identify affected routes, adjust operations, and notify the ops center."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The weather alert identifier."
            - name: alert_type
              in: body
              type: string
              description: "The weather type (flood, snow, wind, heat)."
          steps:
            - name: get-affected-routes
              type: call
              call: "weather-service.get-impact"
              with:
                alert_id: "{{alert_id}}"
            - name: issue-speed-restrictions
              type: call
              call: "dispatch.issue-slow-orders"
              with:
                subdivisions: "{{get-affected-routes.affected_subdivisions}}"
                weather_type: "{{alert_type}}"
                max_speed: "{{get-affected-routes.recommended_speed}}"
            - name: notify-ops-center
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "operations-center"
                text: "WEATHER ALERT: {{alert_type}}. Affected subdivisions: {{get-affected-routes.affected_subdivisions}}. Speed restrictions issued: {{get-affected-routes.recommended_speed}} mph. Estimated {{get-affected-routes.affected_trains}} trains impacted."
  consumes:
    - type: http
      namespace: weather-service
      baseUri: "https://api.internal.csx.com/weather/v1"
      authentication:
        type: bearer
        token: "$secrets.weather_token"
      resources:
        - name: impact
          path: "/alerts/{{alert_id}}/impact"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-impact
              method: GET
    - type: http
      namespace: dispatch
      baseUri: "https://api.internal.csx.com/dispatch/v1"
      authentication:
        type: bearer
        token: "$secrets.dispatch_token"
      resources:
        - name: slow-orders
          path: "/slow-orders"
          operations:
            - name: issue-slow-orders
              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 an employee's compensation details from Workday, returning base pay, railroad retirement, and total compensation.

naftiko: "0.5"
info:
  label: "Workday Compensation Lookup"
  description: "Retrieves an employee's compensation details from Workday, returning base pay, railroad retirement, and total compensation."
  tags:
    - hr
    - compensation
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-compensation
      port: 8080
      tools:
        - name: get-employee-compensation
          description: "Look up employee compensation in Workday. Returns base pay, benefits, 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: railroad_retirement
              type: number
              mapping: "$.benefits.railroadRetirement"
            - 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 CSX.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves employee profile from Workday for CSX."
  tags:
    - hr
    - workday
    - employee-directory
capability:
  exposes:
    - type: mcp
      namespace: workday-profile
      port: 8080
      tools:
        - name: get-employee-profile
          description: "Look up CSX 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.csx.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 from Workday, returning completed courses, overdue, and compliance percentage.

naftiko: "0.5"
info:
  label: "Workday Safety Training Compliance"
  description: "Retrieves an employee's safety training compliance from Workday, returning completed courses, overdue, 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 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

When a train arrives at a classification yard, processes the consist, assigns switching crews, and notifies the yardmaster via Microsoft Teams with the classification plan.

naftiko: "0.5"
info:
  label: "Yard Operations Pipeline"
  description: "When a train arrives at a classification yard, processes the consist, assigns switching crews, and notifies the yardmaster via Microsoft Teams with the classification plan."
  tags:
    - yard-operations
    - classification
    - dispatch
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: yard-ops
      port: 8080
      tools:
        - name: process-yard-arrival
          description: "Given an arriving train, create the classification plan, assign switching crews, and notify the yardmaster."
          inputParameters:
            - name: train_symbol
              in: body
              type: string
              description: "The arriving train symbol."
            - name: yard_code
              in: body
              type: string
              description: "The classification yard code."
          steps:
            - name: get-consist
              type: call
              call: "dispatch.get-consist"
              with:
                train_symbol: "{{train_symbol}}"
            - name: create-classification-plan
              type: call
              call: "yard-mgmt.create-plan"
              with:
                train_symbol: "{{train_symbol}}"
                yard: "{{yard_code}}"
                consist: "{{get-consist.cars}}"
            - name: assign-switching-crew
              type: call
              call: "crew-mgmt.assign-switching"
              with:
                yard: "{{yard_code}}"
                plan_id: "{{create-classification-plan.plan_id}}"
            - name: notify-yardmaster
              type: call
              call: "msteams.send-message"
              with:
                channel_id: "{{yard_code}}-operations"
                text: "Train {{train_symbol}} arriving: {{get-consist.car_count}} cars. Classification plan: {{create-classification-plan.plan_id}}. Switching crew: {{assign-switching-crew.crew_id}}."
  consumes:
    - type: http
      namespace: dispatch
      baseUri: "https://api.internal.csx.com/dispatch/v1"
      authentication:
        type: bearer
        token: "$secrets.dispatch_token"
      resources:
        - name: consists
          path: "/trains/{{train_symbol}}/consist"
          inputParameters:
            - name: train_symbol
              in: path
          operations:
            - name: get-consist
              method: GET
    - type: http
      namespace: yard-mgmt
      baseUri: "https://api.internal.csx.com/yard/v1"
      authentication:
        type: bearer
        token: "$secrets.yard_token"
      resources:
        - name: plans
          path: "/classification-plans"
          operations:
            - name: create-plan
              method: POST
    - type: http
      namespace: crew-mgmt
      baseUri: "https://api.internal.csx.com/crew/v1"
      authentication:
        type: bearer
        token: "$secrets.crew_token"
      resources:
        - name: switching
          path: "/switching-assignments"
          operations:
            - name: assign-switching
              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