General Motors Capabilities

Naftiko 0.5 capability definitions for General Motors - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

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

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

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

When an assembly line stop is triggered, fetches the stop details from the MES system, opens an urgent ServiceNow incident, and broadcasts an alert to the plant operations Slack channel and the plant manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Assembly Line Stop Notification"
  description: "When an assembly line stop is triggered, fetches the stop details from the MES system, opens an urgent ServiceNow incident, and broadcasts an alert to the plant operations Slack channel and the plant manager in Microsoft Teams."
  tags:
    - manufacturing
    - mes
    - servicenow
    - slack
    - microsoft-teams
    - plant-operations
capability:
  exposes:
    - type: mcp
      namespace: line-stop
      port: 8080
      tools:
        - name: handle-line-stop
          description: "Given a line stop event ID and plant code, fetch details, open an incident, and alert operations."
          inputParameters:
            - name: stop_event_id
              in: body
              type: string
              description: "The MES line stop event identifier."
            - name: plant_code
              in: body
              type: string
              description: "The manufacturing plant code."
            - name: plant_manager_email
              in: body
              type: string
              description: "The plant manager email address."
          steps:
            - name: get-stop-details
              type: call
              call: "mes.get-line-stop"
              with:
                event_id: "{{stop_event_id}}"
            - name: open-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Line stop — {{get-stop-details.line_name}}, Plant {{plant_code}}"
                description: "Line stop event {{stop_event_id}} on {{get-stop-details.line_name}}. Reason: {{get-stop-details.stop_reason}}. Station: {{get-stop-details.station}}. Duration: {{get-stop-details.elapsed_minutes}} min."
                urgency: "1"
                category: "production_stoppage"
                assigned_group: "Plant_Maintenance_{{plant_code}}"
            - name: alert-slack
              type: call
              call: "slack.post-message"
              with:
                channel: "#plant-{{plant_code}}-ops"
                text: "LINE STOP: {{get-stop-details.line_name}} at station {{get-stop-details.station}}. Reason: {{get-stop-details.stop_reason}}. Incident: {{open-incident.number}}."
            - name: alert-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{plant_manager_email}}"
                text: "Line Stop Alert: {{get-stop-details.line_name}} stopped at station {{get-stop-details.station}}. Reason: {{get-stop-details.stop_reason}}. Duration: {{get-stop-details.elapsed_minutes}} min. Incident: {{open-incident.number}}."
  consumes:
    - type: http
      namespace: mes
      baseUri: "https://mes-api.gm.com/production/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_mes_token"
      resources:
        - name: line-stops
          path: "/events/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-line-stop
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gm.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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves an autonomous driving test run summary from the Cruise test platform by run ID, returning miles driven, disengagement count, route, and weather conditions.

naftiko: "0.5"
info:
  label: "Autonomous Vehicle Test Run Summary"
  description: "Retrieves an autonomous driving test run summary from the Cruise test platform by run ID, returning miles driven, disengagement count, route, and weather conditions."
  tags:
    - autonomous-driving
    - cruise
    - testing
capability:
  exposes:
    - type: mcp
      namespace: av-testing
      port: 8080
      tools:
        - name: get-test-run
          description: "Retrieve an AV test run summary by run ID. Returns miles, disengagements, route, and conditions."
          inputParameters:
            - name: run_id
              in: body
              type: string
              description: "The Cruise test run identifier."
          call: "cruise.get-test-run"
          with:
            run_id: "{{run_id}}"
          outputParameters:
            - name: miles_driven
              type: number
              mapping: "$.run.milesDriven"
            - name: disengagements
              type: number
              mapping: "$.run.disengagementCount"
            - name: route_name
              type: string
              mapping: "$.run.routeName"
            - name: weather
              type: string
              mapping: "$.run.weatherCondition"
  consumes:
    - type: http
      namespace: cruise
      baseUri: "https://platform-api.cruise.com/testing/v1"
      authentication:
        type: bearer
        token: "$secrets.cruise_api_token"
      resources:
        - name: test-runs
          path: "/runs/{{run_id}}"
          inputParameters:
            - name: run_id
              in: path
          operations:
            - name: get-test-run
              method: GET

When an autonomous vehicle disengagement is logged in the Cruise platform, retrieves the event telemetry, creates a JIRA investigation ticket, and alerts the AV safety team in Slack.

naftiko: "0.5"
info:
  label: "AV Disengagement Incident Workflow"
  description: "When an autonomous vehicle disengagement is logged in the Cruise platform, retrieves the event telemetry, creates a JIRA investigation ticket, and alerts the AV safety team in Slack."
  tags:
    - autonomous-driving
    - cruise
    - jira
    - slack
    - safety
capability:
  exposes:
    - type: mcp
      namespace: av-disengagement
      port: 8080
      tools:
        - name: handle-disengagement
          description: "Given a Cruise disengagement event ID, pull telemetry, create a JIRA ticket, and alert the safety team."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "The Cruise disengagement event ID."
          steps:
            - name: get-event
              type: call
              call: "cruise.get-disengagement"
              with:
                event_id: "{{event_id}}"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "AVSAFETY"
                issue_type: "Investigation"
                summary: "Disengagement — {{get-event.vehicle_id}}, {{get-event.location}}"
                description: "Disengagement event {{event_id}} at {{get-event.timestamp}}. Reason: {{get-event.reason}}. Speed: {{get-event.speed_mph}} mph. Weather: {{get-event.weather}}. Location: {{get-event.location}}."
            - name: alert-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#av-safety"
                text: "Disengagement: Vehicle {{get-event.vehicle_id}} at {{get-event.location}}. Reason: {{get-event.reason}}. JIRA: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: cruise
      baseUri: "https://platform-api.cruise.com/testing/v1"
      authentication:
        type: bearer
        token: "$secrets.cruise_api_token"
      resources:
        - name: disengagements
          path: "/disengagements/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-disengagement
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://gm-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_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_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks build at GM.

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

naftiko: "0.5"
info:
  label: "Backup Verification Pipeline"
  description: "Verifies backups at GM."
  tags:
    - database
    - backup
    - operations
capability:
  exposes:
    - type: mcp
      namespace: backup-verify
      port: 8080
      tools:
        - name: verify-backups
          description: "Verify backups at GM."
          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.gm.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://gm.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

Traces a battery pack by serial number through the Ultium manufacturing system, returning cell lot origins, module assembly records, and final pack test results.

naftiko: "0.5"
info:
  label: "Battery Pack Serial Traceability"
  description: "Traces a battery pack by serial number through the Ultium manufacturing system, returning cell lot origins, module assembly records, and final pack test results."
  tags:
    - ev
    - battery
    - traceability
    - ultium
capability:
  exposes:
    - type: mcp
      namespace: battery-trace
      port: 8080
      tools:
        - name: trace-battery-pack
          description: "Trace a battery pack by serial number through manufacturing."
          inputParameters:
            - name: pack_serial
              in: body
              type: string
              description: "The battery pack serial number."
          call: "ultium.get-pack-trace"
          with:
            pack_serial: "{{pack_serial}}"
          outputParameters:
            - name: cell_lots
              type: array
              mapping: "$.trace.cellLots"
            - name: module_assembly_date
              type: string
              mapping: "$.trace.moduleAssemblyDate"
            - name: pack_test_result
              type: string
              mapping: "$.trace.packTestResult"
            - name: pack_capacity_kwh
              type: number
              mapping: "$.trace.packCapacityKwh"
  consumes:
    - type: http
      namespace: ultium
      baseUri: "https://ultium-api.gm.com/manufacturing/v1"
      authentication:
        type: bearer
        token: "$secrets.ultium_api_token"
      resources:
        - name: pack-trace
          path: "/packs/{{pack_serial}}/trace"
          inputParameters:
            - name: pack_serial
              in: path
          operations:
            - name: get-pack-trace
              method: GET

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

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

Plans capacity at GM by collecting utilization and forecasting.

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

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

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

Retrieves the real-time status of a GM Ultium charging station by station ID, returning availability, power output, active sessions, and fault codes.

naftiko: "0.5"
info:
  label: "Charging Station Status"
  description: "Retrieves the real-time status of a GM Ultium charging station by station ID, returning availability, power output, active sessions, and fault codes."
  tags:
    - ev
    - charging
    - ultium
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: ev-charging
      port: 8080
      tools:
        - name: get-station-status
          description: "Get real-time status of an Ultium charging station by station ID."
          inputParameters:
            - name: station_id
              in: body
              type: string
              description: "The Ultium charging station identifier."
          call: "charging-api.get-station"
          with:
            station_id: "{{station_id}}"
          outputParameters:
            - name: availability
              type: string
              mapping: "$.station.availabilityStatus"
            - name: power_kw
              type: number
              mapping: "$.station.powerOutputKw"
            - name: active_sessions
              type: number
              mapping: "$.station.activeSessionCount"
  consumes:
    - type: http
      namespace: charging-api
      baseUri: "https://charging-api.gm.com/ultium/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_charging_token"
      resources:
        - name: stations
          path: "/stations/{{station_id}}"
          inputParameters:
            - name: station_id
              in: path
          operations:
            - name: get-station
              method: GET

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

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

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

Pulls the latest OnStar diagnostic snapshot for a connected vehicle by VIN, returning battery health, tire pressure, oil life, and active DTC codes.

naftiko: "0.5"
info:
  label: "Connected Vehicle Diagnostic Pull"
  description: "Pulls the latest OnStar diagnostic snapshot for a connected vehicle by VIN, returning battery health, tire pressure, oil life, and active DTC codes."
  tags:
    - connected-vehicle
    - onstar
    - diagnostics
    - telematics
capability:
  exposes:
    - type: mcp
      namespace: connected-vehicle
      port: 8080
      tools:
        - name: get-vehicle-diagnostics
          description: "Retrieve the latest OnStar diagnostics for a VIN. Returns battery health, tire pressure, oil life, and DTCs."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The 17-character Vehicle Identification Number."
          call: "onstar.get-diagnostics"
          with:
            vin: "{{vin}}"
          outputParameters:
            - name: battery_voltage
              type: number
              mapping: "$.diagnostics.batteryVoltage"
            - name: oil_life_pct
              type: number
              mapping: "$.diagnostics.oilLifePercent"
            - name: tire_pressure
              type: object
              mapping: "$.diagnostics.tirePressure"
            - name: dtc_codes
              type: array
              mapping: "$.diagnostics.activeDtcCodes"
  consumes:
    - type: http
      namespace: onstar
      baseUri: "https://api.onstar.com/connected/v2"
      authentication:
        type: oauth2
        tokenUrl: "https://api.onstar.com/oauth/token"
        clientId: "$secrets.onstar_client_id"
        clientSecret: "$secrets.onstar_client_secret"
      resources:
        - name: diagnostics
          path: "/vehicles/{{vin}}/diagnostics"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-diagnostics
              method: GET

Sends a remote command (lock, unlock, start) to a connected vehicle via OnStar and logs the action in the fleet management system.

naftiko: "0.5"
info:
  label: "Connected Vehicle Remote Command"
  description: "Sends a remote command (lock, unlock, start) to a connected vehicle via OnStar and logs the action in the fleet management system."
  tags:
    - connected-vehicle
    - onstar
    - fleet
    - remote-command
capability:
  exposes:
    - type: mcp
      namespace: remote-command
      port: 8080
      tools:
        - name: send-remote-command
          description: "Send a remote command to a vehicle by VIN and log the action."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The 17-character Vehicle Identification Number."
            - name: command
              in: body
              type: string
              description: "The remote command (lock, unlock, start, stop)."
            - name: operator_id
              in: body
              type: string
              description: "The fleet operator ID issuing the command."
          steps:
            - name: execute-command
              type: call
              call: "onstar.send-command"
              with:
                vin: "{{vin}}"
                command: "{{command}}"
            - name: log-action
              type: call
              call: "fleet-api.log-command"
              with:
                vin: "{{vin}}"
                command: "{{command}}"
                operator_id: "{{operator_id}}"
                status: "{{execute-command.result_status}}"
                timestamp: "{{execute-command.timestamp}}"
  consumes:
    - type: http
      namespace: onstar
      baseUri: "https://api.onstar.com/connected/v2"
      authentication:
        type: oauth2
        tokenUrl: "https://api.onstar.com/oauth/token"
        clientId: "$secrets.onstar_client_id"
        clientSecret: "$secrets.onstar_client_secret"
      resources:
        - name: commands
          path: "/vehicles/{{vin}}/commands"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: send-command
              method: POST
    - type: http
      namespace: fleet-api
      baseUri: "https://fleet-api.gm.com/management/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_fleet_token"
      resources:
        - name: command-log
          path: "/vehicles/{{vin}}/commands"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: log-command
              method: POST

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

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

naftiko: "0.5"
info:
  label: "Cost Reallocation Pipeline"
  description: "Reallocates costs at GM."
  tags:
    - finance
    - cost-allocation
    - oracle
capability:
  exposes:
    - type: mcp
      namespace: cost-realloc
      port: 8080
      tools:
        - name: reallocate
          description: "Reallocate costs at GM."
          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.gm.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.gm.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

When a Salesforce case reaches a defined age threshold, pulls the case details, checks the customer vehicle warranty status, escalates in ServiceNow, and notifies the regional service director in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Customer Service Case Escalation"
  description: "When a Salesforce case reaches a defined age threshold, pulls the case details, checks the customer vehicle warranty status, escalates in ServiceNow, and notifies the regional service director in Microsoft Teams."
  tags:
    - customer-service
    - salesforce
    - warranty
    - servicenow
    - microsoft-teams
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: case-escalation
      port: 8080
      tools:
        - name: escalate-service-case
          description: "Given a Salesforce case ID and VIN, check warranty, escalate, and notify the director."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID."
            - name: vin
              in: body
              type: string
              description: "The customer vehicle VIN."
            - name: director_email
              in: body
              type: string
              description: "The regional service director email."
          steps:
            - name: get-case
              type: call
              call: "salesforce.get-case"
              with:
                case_id: "{{case_id}}"
            - name: check-warranty
              type: call
              call: "warranty-api.get-coverage"
              with:
                vin: "{{vin}}"
            - name: escalate-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Escalated case: {{get-case.subject}}"
                description: "Salesforce case {{case_id}} open {{get-case.age_days}} days. Customer: {{get-case.customer_name}}. VIN: {{vin}}. Warranty: {{check-warranty.coverage_status}}. Original issue: {{get-case.description}}."
                urgency: "2"
                category: "customer_escalation"
                assigned_group: "Customer_Experience"
            - name: notify-director
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{director_email}}"
                text: "Case Escalation: {{get-case.subject}} ({{case_id}}) open {{get-case.age_days}} days. Customer: {{get-case.customer_name}}, VIN {{vin}}. Warranty: {{check-warranty.coverage_status}}. Incident: {{escalate-incident.number}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://gm.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: warranty-api
      baseUri: "https://warranty-api.gm.com/claims/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_warranty_token"
      resources:
        - name: coverage
          path: "/vehicles/{{vin}}/coverage"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-coverage
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gm.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a vehicle cybersecurity vulnerability is reported, retrieves the CVE details, identifies affected vehicle models from the configuration system, creates a JIRA security issue, and alerts the vehicle cybersecurity team in Slack.

naftiko: "0.5"
info:
  label: "Cybersecurity Vulnerability Triage"
  description: "When a vehicle cybersecurity vulnerability is reported, retrieves the CVE details, identifies affected vehicle models from the configuration system, creates a JIRA security issue, and alerts the vehicle cybersecurity team in Slack."
  tags:
    - cybersecurity
    - connected-vehicle
    - jira
    - slack
    - vulnerability
capability:
  exposes:
    - type: mcp
      namespace: vehicle-security
      port: 8080
      tools:
        - name: triage-vulnerability
          description: "Given a CVE ID and affected ECU, identify impacted models, create a JIRA issue, and alert the security team."
          inputParameters:
            - name: cve_id
              in: body
              type: string
              description: "The CVE identifier."
            - name: affected_ecu
              in: body
              type: string
              description: "The ECU module name affected."
            - name: severity
              in: body
              type: string
              description: "CVSS severity (low, medium, high, critical)."
          steps:
            - name: get-affected-models
              type: call
              call: "vehicle-config.get-models-by-ecu"
              with:
                ecu_name: "{{affected_ecu}}"
            - name: create-security-issue
              type: call
              call: "jira.create-issue"
              with:
                project: "VEHSEC"
                issue_type: "Security Bug"
                summary: "{{cve_id}} — {{affected_ecu}} ({{severity}})"
                description: "CVE: {{cve_id}}. ECU: {{affected_ecu}}. Severity: {{severity}}. Affected models: {{get-affected-models.model_list}}. Affected VIN count: {{get-affected-models.vin_count}}."
                priority: "{{severity}}"
            - name: alert-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#vehicle-cybersecurity"
                text: "VULNERABILITY: {{cve_id}} ({{severity}}) affects {{affected_ecu}}. Models: {{get-affected-models.model_list}}. ~{{get-affected-models.vin_count}} vehicles. JIRA: {{create-security-issue.key}}."
  consumes:
    - type: http
      namespace: vehicle-config
      baseUri: "https://vehicle-config-api.gm.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_config_token"
      resources:
        - name: models-by-ecu
          path: "/ecus/{{ecu_name}}/models"
          inputParameters:
            - name: ecu_name
              in: path
          operations:
            - name: get-models-by-ecu
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://gm-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_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_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

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

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

naftiko: "0.5"
info:
  label: "Datadog Monitor Check"
  description: "Checks Datadog monitor at GM."
  tags:
    - monitoring
    - datadog
    - observability
capability:
  exposes:
    - type: mcp
      namespace: dd-monitor
      port: 8080
      tools:
        - name: check-monitor
          description: "Check monitor at GM."
          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 current incentive programs applicable to a dealer by dealer code and vehicle model from the GM incentive management system.

naftiko: "0.5"
info:
  label: "Dealer Incentive Program Lookup"
  description: "Retrieves the current incentive programs applicable to a dealer by dealer code and vehicle model from the GM incentive management system."
  tags:
    - dealer
    - sales
    - incentives
capability:
  exposes:
    - type: mcp
      namespace: dealer-incentives
      port: 8080
      tools:
        - name: get-dealer-incentives
          description: "Retrieve active incentive programs for a dealer and vehicle model."
          inputParameters:
            - name: dealer_code
              in: body
              type: string
              description: "The GM dealer BAC code."
            - name: model
              in: body
              type: string
              description: "The vehicle model name."
          call: "incentive-api.get-programs"
          with:
            dealer_code: "{{dealer_code}}"
            model: "{{model}}"
          outputParameters:
            - name: programs
              type: array
              mapping: "$.incentives.activePrograms"
            - name: total_available
              type: number
              mapping: "$.incentives.totalAvailableAmount"
  consumes:
    - type: http
      namespace: incentive-api
      baseUri: "https://incentive-api.gm.com/programs/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_incentive_token"
      resources:
        - name: programs
          path: "/dealers/{{dealer_code}}/models/{{model}}/incentives"
          inputParameters:
            - name: dealer_code
              in: path
            - name: model
              in: path
          operations:
            - name: get-programs
              method: GET

Queries the GM dealer inventory system for current vehicle stock at a specific dealer by dealer code and optional model filter.

naftiko: "0.5"
info:
  label: "Dealer Inventory Lookup"
  description: "Queries the GM dealer inventory system for current vehicle stock at a specific dealer by dealer code and optional model filter."
  tags:
    - dealer
    - inventory
    - sales
capability:
  exposes:
    - type: mcp
      namespace: dealer-inventory
      port: 8080
      tools:
        - name: get-dealer-inventory
          description: "Query vehicle inventory at a dealer by dealer code and optional model filter."
          inputParameters:
            - name: dealer_code
              in: body
              type: string
              description: "The GM dealer BAC code."
            - name: model
              in: body
              type: string
              description: "Optional model name filter (e.g., Silverado, Equinox)."
          call: "dealer-api.get-inventory"
          with:
            dealer_code: "{{dealer_code}}"
            model: "{{model}}"
          outputParameters:
            - name: total_units
              type: number
              mapping: "$.inventory.totalCount"
            - name: vehicles
              type: array
              mapping: "$.inventory.vehicles"
  consumes:
    - type: http
      namespace: dealer-api
      baseUri: "https://dealer-api.gm.com/inventory/v2"
      authentication:
        type: bearer
        token: "$secrets.gm_dealer_api_token"
      resources:
        - name: inventory
          path: "/dealers/{{dealer_code}}/vehicles"
          inputParameters:
            - name: dealer_code
              in: path
            - name: model
              in: query
          operations:
            - name: get-inventory
              method: GET

Compiles a dealer's monthly performance by pulling sales data from Salesforce, service metrics from DMS, and customer satisfaction scores, then uploads the report to SharePoint.

naftiko: "0.5"
info:
  label: "Dealer Monthly Performance Report"
  description: "Compiles a dealer's monthly performance by pulling sales data from Salesforce, service metrics from DMS, and customer satisfaction scores, then uploads the report to SharePoint."
  tags:
    - dealer
    - salesforce
    - dms
    - sharepoint
    - performance
capability:
  exposes:
    - type: mcp
      namespace: dealer-performance
      port: 8080
      tools:
        - name: generate-dealer-report
          description: "Given a dealer code and month, compile sales, service, and satisfaction data and upload to SharePoint."
          inputParameters:
            - name: dealer_code
              in: body
              type: string
              description: "The GM dealer BAC code."
            - name: month
              in: body
              type: string
              description: "The reporting month (YYYY-MM)."
          steps:
            - name: get-sales
              type: call
              call: "salesforce.get-dealer-sales"
              with:
                dealer_code: "{{dealer_code}}"
                month: "{{month}}"
            - name: get-service-metrics
              type: call
              call: "dms.get-service-metrics"
              with:
                dealer_code: "{{dealer_code}}"
                month: "{{month}}"
            - name: get-csat
              type: call
              call: "survey-api.get-dealer-scores"
              with:
                dealer_code: "{{dealer_code}}"
                month: "{{month}}"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "dealer_performance"
                folder_path: "Reports/{{dealer_code}}/{{month}}"
                content: "Dealer {{dealer_code}} — {{month}}. Units sold: {{get-sales.units_sold}}. Revenue: ${{get-sales.revenue}}. Service ROs: {{get-service-metrics.repair_orders}}. Avg CSAT: {{get-csat.overall_score}}/5."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://gm.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: dealer-sales
          path: "/sobjects/Dealer_Sales__c/dealer/{{dealer_code}}"
          inputParameters:
            - name: dealer_code
              in: path
            - name: month
              in: query
          operations:
            - name: get-dealer-sales
              method: GET
    - type: http
      namespace: dms
      baseUri: "https://dealer-api.gm.com/dms/v2"
      authentication:
        type: bearer
        token: "$secrets.gm_dms_token"
      resources:
        - name: service-metrics
          path: "/dealers/{{dealer_code}}/metrics"
          inputParameters:
            - name: dealer_code
              in: path
            - name: month
              in: query
          operations:
            - name: get-service-metrics
              method: GET
    - type: http
      namespace: survey-api
      baseUri: "https://survey-api.gm.com/satisfaction/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_survey_token"
      resources:
        - name: scores
          path: "/dealers/{{dealer_code}}/scores"
          inputParameters:
            - name: dealer_code
              in: path
            - name: month
              in: query
          operations:
            - name: get-dealer-scores
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: upload-file
              method: PUT

Retrieves a dealer parts order from GM's Dealer Management System by order ID, returning line items, fulfillment status, and estimated delivery date.

naftiko: "0.5"
info:
  label: "Dealer Parts Order Lookup"
  description: "Retrieves a dealer parts order from GM's Dealer Management System by order ID, returning line items, fulfillment status, and estimated delivery date."
  tags:
    - dealer
    - parts
    - order-management
    - dms
capability:
  exposes:
    - type: mcp
      namespace: dealer-parts
      port: 8080
      tools:
        - name: get-parts-order
          description: "Retrieve a dealer parts order by order ID. Returns line items, fulfillment status, and estimated delivery."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The dealer parts order identifier."
          call: "dms.get-parts-order"
          with:
            order_id: "{{order_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.order.fulfillmentStatus"
            - name: line_items
              type: array
              mapping: "$.order.lineItems"
            - name: estimated_delivery
              type: string
              mapping: "$.order.estimatedDeliveryDate"
  consumes:
    - type: http
      namespace: dms
      baseUri: "https://dealer-api.gm.com/dms/v2"
      authentication:
        type: bearer
        token: "$secrets.gm_dms_token"
      resources:
        - name: parts-orders
          path: "/orders/{{order_id}}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-parts-order
              method: GET

When a lead arrives in Salesforce from gm.com, enriches the lead with dealer proximity data, assigns it to the nearest dealer, and notifies the dealer sales manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Dealer Sales Lead Assignment"
  description: "When a lead arrives in Salesforce from gm.com, enriches the lead with dealer proximity data, assigns it to the nearest dealer, and notifies the dealer sales manager via Microsoft Teams."
  tags:
    - sales
    - dealer
    - salesforce
    - microsoft-teams
    - lead-management
capability:
  exposes:
    - type: mcp
      namespace: lead-assignment
      port: 8080
      tools:
        - name: assign-lead-to-dealer
          description: "Given a Salesforce lead ID, enrich with location, assign to the nearest dealer, and notify the sales manager."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID."
          steps:
            - name: get-lead
              type: call
              call: "salesforce.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: find-nearest-dealer
              type: call
              call: "dealer-api.find-nearest"
              with:
                zip_code: "{{get-lead.postal_code}}"
                brand: "{{get-lead.vehicle_brand}}"
            - name: assign-lead
              type: call
              call: "salesforce.update-lead"
              with:
                lead_id: "{{lead_id}}"
                dealer_code: "{{find-nearest-dealer.dealer_code}}"
                dealer_name: "{{find-nearest-dealer.dealer_name}}"
            - name: notify-dealer
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{find-nearest-dealer.sales_manager_email}}"
                text: "New lead assigned: {{get-lead.first_name}} {{get-lead.last_name}} interested in {{get-lead.vehicle_model}}. Lead ID: {{lead_id}}. Contact: {{get-lead.email}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://gm.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{lead_id}}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
            - name: update-lead
              method: PATCH
    - type: http
      namespace: dealer-api
      baseUri: "https://dealer-api.gm.com/locator/v2"
      authentication:
        type: bearer
        token: "$secrets.gm_dealer_api_token"
      resources:
        - name: nearest
          path: "/dealers/nearest"
          inputParameters:
            - name: zip_code
              in: query
            - name: brand
              in: query
          operations:
            - name: find-nearest
              method: GET
    - 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

When a customer requests a service appointment through the myChevrolet/myGMC app, checks dealer availability via DMS, creates the appointment, and sends a confirmation to the customer through Salesforce Marketing Cloud.

naftiko: "0.5"
info:
  label: "Dealer Service Appointment Scheduler"
  description: "When a customer requests a service appointment through the myChevrolet/myGMC app, checks dealer availability via DMS, creates the appointment, and sends a confirmation to the customer through Salesforce Marketing Cloud."
  tags:
    - dealer
    - customer-service
    - dms
    - salesforce-marketing-cloud
    - appointment
capability:
  exposes:
    - type: mcp
      namespace: service-appointment
      port: 8080
      tools:
        - name: schedule-service
          description: "Given a dealer code, VIN, service type, and customer info, check availability, book the appointment, and confirm."
          inputParameters:
            - name: dealer_code
              in: body
              type: string
              description: "The dealer BAC code."
            - name: vin
              in: body
              type: string
              description: "The customer vehicle VIN."
            - name: service_type
              in: body
              type: string
              description: "The type of service requested."
            - name: preferred_date
              in: body
              type: string
              description: "The preferred date (YYYY-MM-DD)."
            - name: customer_email
              in: body
              type: string
              description: "The customer email address."
          steps:
            - name: check-availability
              type: call
              call: "dms.get-availability"
              with:
                dealer_code: "{{dealer_code}}"
                date: "{{preferred_date}}"
                service_type: "{{service_type}}"
            - name: create-appointment
              type: call
              call: "dms.create-appointment"
              with:
                dealer_code: "{{dealer_code}}"
                vin: "{{vin}}"
                service_type: "{{service_type}}"
                date: "{{check-availability.next_available_slot}}"
            - name: send-confirmation
              type: call
              call: "sfmc.send-transactional"
              with:
                email: "{{customer_email}}"
                template: "service_appointment_confirmation"
  consumes:
    - type: http
      namespace: dms
      baseUri: "https://dealer-api.gm.com/dms/v2"
      authentication:
        type: bearer
        token: "$secrets.gm_dms_token"
      resources:
        - name: availability
          path: "/dealers/{{dealer_code}}/availability"
          inputParameters:
            - name: dealer_code
              in: path
            - name: date
              in: query
            - name: service_type
              in: query
          operations:
            - name: get-availability
              method: GET
        - name: appointments
          path: "/dealers/{{dealer_code}}/appointments"
          inputParameters:
            - name: dealer_code
              in: path
          operations:
            - name: create-appointment
              method: POST
    - type: http
      namespace: sfmc
      baseUri: "https://mcj6cy1x9m-t.rest.marketingcloudapis.com"
      authentication:
        type: bearer
        token: "$secrets.sfmc_token"
      resources:
        - name: transactional
          path: "/messaging/v1/email/messages"
          operations:
            - name: send-transactional
              method: POST

Looks up a dealer technician's current certifications from the GM training platform by technician ID, returning active certifications, expiry dates, and pending courses.

naftiko: "0.5"
info:
  label: "Dealer Technician Certification Tracker"
  description: "Looks up a dealer technician's current certifications from the GM training platform by technician ID, returning active certifications, expiry dates, and pending courses."
  tags:
    - dealer
    - training
    - certification
capability:
  exposes:
    - type: mcp
      namespace: dealer-training
      port: 8080
      tools:
        - name: get-technician-certs
          description: "Retrieve a dealer technician's certifications by technician ID."
          inputParameters:
            - name: technician_id
              in: body
              type: string
              description: "The GM training platform technician ID."
          call: "training-api.get-certifications"
          with:
            technician_id: "{{technician_id}}"
          outputParameters:
            - name: active_certs
              type: array
              mapping: "$.certifications.active"
            - name: expiring_soon
              type: array
              mapping: "$.certifications.expiringSoon"
            - name: pending_courses
              type: array
              mapping: "$.certifications.pendingCourses"
  consumes:
    - type: http
      namespace: training-api
      baseUri: "https://training-api.gm.com/dealer-ed/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_training_token"
      resources:
        - name: certifications
          path: "/technicians/{{technician_id}}/certifications"
          inputParameters:
            - name: technician_id
              in: path
          operations:
            - name: get-certifications
              method: GET

When a dealer submits a warranty repair, validates the VIN against open recalls, retrieves the dealer profile from DMS, files the warranty claim, and updates the Salesforce service case with claim details.

naftiko: "0.5"
info:
  label: "Dealer Warranty Claim Orchestrator"
  description: "When a dealer submits a warranty repair, validates the VIN against open recalls, retrieves the dealer profile from DMS, files the warranty claim, and updates the Salesforce service case with claim details."
  tags:
    - warranty
    - dealer
    - recall
    - salesforce
    - dms
capability:
  exposes:
    - type: mcp
      namespace: warranty-processing
      port: 8080
      tools:
        - name: process-warranty-claim
          description: "Given a VIN, dealer code, repair code, and Salesforce case ID, validate recalls, file the claim, and update the case."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The VIN of the repaired vehicle."
            - name: dealer_code
              in: body
              type: string
              description: "The GM dealer BAC code."
            - name: repair_code
              in: body
              type: string
              description: "The warranty repair operation code."
            - name: case_id
              in: body
              type: string
              description: "The Salesforce service case ID."
          steps:
            - name: check-recalls
              type: call
              call: "recall-api.get-recalls"
              with:
                vin: "{{vin}}"
            - name: get-dealer
              type: call
              call: "dms.get-dealer"
              with:
                dealer_code: "{{dealer_code}}"
            - name: file-claim
              type: call
              call: "warranty-api.create-claim"
              with:
                vin: "{{vin}}"
                dealer_code: "{{dealer_code}}"
                repair_code: "{{repair_code}}"
                recall_ids: "{{check-recalls.open_recall_ids}}"
            - name: update-case
              type: call
              call: "salesforce.update-case"
              with:
                case_id: "{{case_id}}"
                comment: "Warranty claim {{file-claim.claim_number}} filed for VIN {{vin}} at {{get-dealer.dealer_name}}. Repair: {{repair_code}}. Open recalls addressed: {{check-recalls.recall_count}}."
                status: "In Progress"
  consumes:
    - type: http
      namespace: recall-api
      baseUri: "https://safety-api.gm.com/compliance/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_safety_token"
      resources:
        - name: recalls
          path: "/vehicles/{{vin}}/recalls"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-recalls
              method: GET
    - type: http
      namespace: dms
      baseUri: "https://dealer-api.gm.com/dms/v2"
      authentication:
        type: bearer
        token: "$secrets.gm_dms_token"
      resources:
        - name: dealers
          path: "/dealers/{{dealer_code}}"
          inputParameters:
            - name: dealer_code
              in: path
          operations:
            - name: get-dealer
              method: GET
    - type: http
      namespace: warranty-api
      baseUri: "https://warranty-api.gm.com/claims/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_warranty_token"
      resources:
        - name: claims
          path: "/claims"
          operations:
            - name: create-claim
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://gm.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: update-case
              method: PATCH

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

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

naftiko: "0.5"
info:
  label: "Drift Detection Pipeline"
  description: "Detects infrastructure drift at GM 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 GM."
          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://gm.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 ES index at GM.

naftiko: "0.5"
info:
  label: "ES Index Health"
  description: "Checks ES index at GM."
  tags:
    - search
    - elasticsearch
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: es-health
      port: 8080
      tools:
        - name: check-index
          description: "Check ES index at GM."
          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.gm.com:9200"
      authentication:
        type: bearer
        token: "$secrets.es_token"
      resources:
        - name: indices
          path: "/{{index}}/_stats"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: get-health
              method: GET

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

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

Pulls real-time energy consumption from the plant IoT platform, retrieves utility rate data, and updates the Tableau dashboard data source for the energy management team.

naftiko: "0.5"
info:
  label: "Energy Management Dashboard Sync"
  description: "Pulls real-time energy consumption from the plant IoT platform, retrieves utility rate data, and updates the Tableau dashboard data source for the energy management team."
  tags:
    - manufacturing
    - energy
    - iot
    - tableau
    - sustainability
capability:
  exposes:
    - type: mcp
      namespace: energy-mgmt
      port: 8080
      tools:
        - name: sync-energy-data
          description: "Given a plant code, pull energy consumption and utility rates, and update the Tableau data source."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
            - name: date
              in: body
              type: string
              description: "The date to sync (YYYY-MM-DD)."
          steps:
            - name: get-consumption
              type: call
              call: "iot-api.get-energy"
              with:
                plant_code: "{{plant_code}}"
                date: "{{date}}"
            - name: get-rates
              type: call
              call: "utility-api.get-rates"
              with:
                plant_code: "{{plant_code}}"
                date: "{{date}}"
            - name: update-tableau
              type: call
              call: "tableau.update-extract"
              with:
                datasource_id: "plant_energy_{{plant_code}}"
  consumes:
    - type: http
      namespace: iot-api
      baseUri: "https://iot-api.gm.com/sensors/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_iot_token"
      resources:
        - name: energy
          path: "/plants/{{plant_code}}/energy"
          inputParameters:
            - name: plant_code
              in: path
            - name: date
              in: query
          operations:
            - name: get-energy
              method: GET
    - type: http
      namespace: utility-api
      baseUri: "https://utility-api.gm.com/rates/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_utility_token"
      resources:
        - name: rates
          path: "/plants/{{plant_code}}/rates"
          inputParameters:
            - name: plant_code
              in: path
            - name: date
              in: query
          operations:
            - name: get-rates
              method: GET
    - type: http
      namespace: tableau
      baseUri: "https://tableau.gm.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: extracts
          path: "/sites/gm/datasources/{{datasource_id}}/data"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: update-extract
              method: POST

Pulls emissions data from the plant environmental monitoring system, retrieves permit limits from the compliance database, and generates a variance report logged in SharePoint for the environmental team.

naftiko: "0.5"
info:
  label: "Environmental Compliance Report"
  description: "Pulls emissions data from the plant environmental monitoring system, retrieves permit limits from the compliance database, and generates a variance report logged in SharePoint for the environmental team."
  tags:
    - manufacturing
    - environmental
    - compliance
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: env-compliance
      port: 8080
      tools:
        - name: generate-emissions-report
          description: "Given a plant code and reporting period, pull emissions data, check against permits, and store the report."
          inputParameters:
            - name: plant_code
              in: body
              type: string
              description: "The manufacturing plant code."
            - name: period
              in: body
              type: string
              description: "The reporting period (e.g., 2026-Q1)."
          steps:
            - name: get-emissions
              type: call
              call: "env-api.get-emissions"
              with:
                plant_code: "{{plant_code}}"
                period: "{{period}}"
            - name: get-permit-limits
              type: call
              call: "compliance-db.get-permits"
              with:
                plant_code: "{{plant_code}}"
            - name: store-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "environmental_compliance"
                folder_path: "Reports/{{plant_code}}/{{period}}"
                content: "Emissions report for plant {{plant_code}}, {{period}}. VOC: {{get-emissions.voc_tons}} tons (limit: {{get-permit-limits.voc_limit}}). NOx: {{get-emissions.nox_tons}} tons (limit: {{get-permit-limits.nox_limit}}). CO2: {{get-emissions.co2_tons}} tons."
  consumes:
    - type: http
      namespace: env-api
      baseUri: "https://env-api.gm.com/monitoring/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_env_token"
      resources:
        - name: emissions
          path: "/plants/{{plant_code}}/emissions"
          inputParameters:
            - name: plant_code
              in: path
            - name: period
              in: query
          operations:
            - name: get-emissions
              method: GET
    - type: http
      namespace: compliance-db
      baseUri: "https://compliance-api.gm.com/permits/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_compliance_token"
      resources:
        - name: permits
          path: "/plants/{{plant_code}}/permits"
          inputParameters:
            - name: plant_code
              in: path
          operations:
            - name: get-permits
              method: GET
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          path: "/{{site_id}}/drive/root:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: upload-file
              method: PUT

Queries the Ultium Cells battery inventory system to return current cell stock levels, lot traceability, and warehouse location for a given battery cell part number.

naftiko: "0.5"
info:
  label: "EV Battery Cell Inventory Check"
  description: "Queries the Ultium Cells battery inventory system to return current cell stock levels, lot traceability, and warehouse location for a given battery cell part number."
  tags:
    - ev
    - battery
    - inventory
    - supply-chain
capability:
  exposes:
    - type: mcp
      namespace: ev-battery
      port: 8080
      tools:
        - name: check-battery-inventory
          description: "Query battery cell inventory by part number. Returns stock quantity, lot numbers, and warehouse location."
          inputParameters:
            - name: part_number
              in: body
              type: string
              description: "The Ultium battery cell part number."
          call: "battery-inventory.get-stock"
          with:
            part_number: "{{part_number}}"
          outputParameters:
            - name: quantity_on_hand
              type: number
              mapping: "$.inventory.quantityOnHand"
            - name: lot_number
              type: string
              mapping: "$.inventory.lotNumber"
            - name: warehouse
              type: string
              mapping: "$.inventory.warehouseCode"
  consumes:
    - type: http
      namespace: battery-inventory
      baseUri: "https://ultium-api.gm.com/inventory/v1"
      authentication:
        type: bearer
        token: "$secrets.ultium_api_token"
      resources:
        - name: stock
          path: "/cells/{{part_number}}/stock"
          inputParameters:
            - name: part_number
              in: path
          operations:
            - name: get-stock
              method: GET

When a battery thermal anomaly is detected via OnStar telematics, retrieves the vehicle diagnostics, checks the battery lot in the Ultium inventory system, opens a safety incident in ServiceNow, and notifies the battery engineering team in Slack.

naftiko: "0.5"
info:
  label: "EV Battery Thermal Event Orchestrator"
  description: "When a battery thermal anomaly is detected via OnStar telematics, retrieves the vehicle diagnostics, checks the battery lot in the Ultium inventory system, opens a safety incident in ServiceNow, and notifies the battery engineering team in Slack."
  tags:
    - ev
    - battery
    - safety
    - onstar
    - servicenow
    - slack
    - thermal-management
capability:
  exposes:
    - type: mcp
      namespace: battery-safety
      port: 8080
      tools:
        - name: handle-thermal-event
          description: "Given a VIN and battery part number, investigate a thermal anomaly by pulling diagnostics, checking the lot, opening a safety incident, and alerting engineering."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The VIN of the affected vehicle."
            - name: battery_part_number
              in: body
              type: string
              description: "The Ultium battery cell part number."
          steps:
            - name: get-diagnostics
              type: call
              call: "onstar.get-diagnostics"
              with:
                vin: "{{vin}}"
            - name: get-battery-lot
              type: call
              call: "ultium.get-lot-info"
              with:
                part_number: "{{battery_part_number}}"
            - name: open-safety-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Battery thermal event — VIN {{vin}}"
                description: "Thermal anomaly on VIN {{vin}}. Battery temp: {{get-diagnostics.battery_temp_c}}C. Lot: {{get-battery-lot.lot_number}}, manufactured: {{get-battery-lot.manufacture_date}}. DTC codes: {{get-diagnostics.dtc_codes}}."
                category: "battery_safety"
                urgency: "1"
                assigned_group: "Battery_Engineering"
            - name: alert-engineering
              type: call
              call: "slack.post-message"
              with:
                channel: "#battery-safety-alerts"
                text: "THERMAL EVENT: VIN {{vin}}, Battery lot {{get-battery-lot.lot_number}}. Temp: {{get-diagnostics.battery_temp_c}}C. Incident: {{open-safety-incident.number}}. Immediate investigation required."
  consumes:
    - type: http
      namespace: onstar
      baseUri: "https://api.onstar.com/connected/v2"
      authentication:
        type: oauth2
        tokenUrl: "https://api.onstar.com/oauth/token"
        clientId: "$secrets.onstar_client_id"
        clientSecret: "$secrets.onstar_client_secret"
      resources:
        - name: diagnostics
          path: "/vehicles/{{vin}}/diagnostics"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-diagnostics
              method: GET
    - type: http
      namespace: ultium
      baseUri: "https://ultium-api.gm.com/inventory/v1"
      authentication:
        type: bearer
        token: "$secrets.ultium_api_token"
      resources:
        - name: lots
          path: "/cells/{{part_number}}/lot"
          inputParameters:
            - name: part_number
              in: path
          operations:
            - name: get-lot-info
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gm.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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a charging station reports a fault, retrieves the station details, opens a ServiceNow work order for field service, and notifies the regional charging operations team in Slack.

naftiko: "0.5"
info:
  label: "EV Charging Network Fault Orchestrator"
  description: "When a charging station reports a fault, retrieves the station details, opens a ServiceNow work order for field service, and notifies the regional charging operations team in Slack."
  tags:
    - ev
    - charging
    - servicenow
    - slack
    - field-service
capability:
  exposes:
    - type: mcp
      namespace: charging-fault
      port: 8080
      tools:
        - name: handle-station-fault
          description: "Given a station ID and fault code, retrieve details, open a work order, and alert operations."
          inputParameters:
            - name: station_id
              in: body
              type: string
              description: "The charging station identifier."
            - name: fault_code
              in: body
              type: string
              description: "The station fault code."
          steps:
            - name: get-station
              type: call
              call: "charging-api.get-station"
              with:
                station_id: "{{station_id}}"
            - name: create-work-order
              type: call
              call: "servicenow.create-work-order"
              with:
                short_description: "Charging station fault — {{station_id}}: {{fault_code}}"
                description: "Station {{station_id}} at {{get-station.address}} reported fault {{fault_code}}. Power output: {{get-station.power_kw}} kW. Region: {{get-station.region}}."
                category: "field_service"
                assigned_group: "Charging_Field_Service_{{get-station.region}}"
            - name: alert-ops
              type: call
              call: "slack.post-message"
              with:
                channel: "#charging-ops-{{get-station.region}}"
                text: "Station Fault: {{station_id}} at {{get-station.address}}. Fault: {{fault_code}}. Work order: {{create-work-order.number}}. Dispatching field service."
  consumes:
    - type: http
      namespace: charging-api
      baseUri: "https://charging-api.gm.com/ultium/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_charging_token"
      resources:
        - name: stations
          path: "/stations/{{station_id}}"
          inputParameters:
            - name: station_id
              in: path
          operations:
            - name: get-station
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gm.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: work-orders
          path: "/table/wm_order"
          operations:
            - name: create-work-order
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Collects real-world range data from a connected EV via OnStar, compares against the EPA estimate in the vehicle configuration system, and logs the variance in the engineering analytics platform for model improvement.

naftiko: "0.5"
info:
  label: "EV Range Estimation Feedback"
  description: "Collects real-world range data from a connected EV via OnStar, compares against the EPA estimate in the vehicle configuration system, and logs the variance in the engineering analytics platform for model improvement."
  tags:
    - ev
    - connected-vehicle
    - onstar
    - analytics
    - range-estimation
capability:
  exposes:
    - type: mcp
      namespace: range-analytics
      port: 8080
      tools:
        - name: log-range-variance
          description: "Given a VIN, collect real-world range data and log the EPA variance for analytics."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The VIN of the connected EV."
          steps:
            - name: get-range-data
              type: call
              call: "onstar.get-energy-stats"
              with:
                vin: "{{vin}}"
            - name: get-epa-estimate
              type: call
              call: "vehicle-config.get-range-spec"
              with:
                vin: "{{vin}}"
            - name: log-variance
              type: call
              call: "analytics-api.log-range-data"
              with:
                vin: "{{vin}}"
                actual_range_miles: "{{get-range-data.estimated_range_miles}}"
                epa_range_miles: "{{get-epa-estimate.epa_range}}"
                avg_efficiency_kwh_per_mile: "{{get-range-data.avg_efficiency}}"
                climate_zone: "{{get-range-data.climate_zone}}"
  consumes:
    - type: http
      namespace: onstar
      baseUri: "https://api.onstar.com/connected/v2"
      authentication:
        type: oauth2
        tokenUrl: "https://api.onstar.com/oauth/token"
        clientId: "$secrets.onstar_client_id"
        clientSecret: "$secrets.onstar_client_secret"
      resources:
        - name: energy
          path: "/vehicles/{{vin}}/energy"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-energy-stats
              method: GET
    - type: http
      namespace: vehicle-config
      baseUri: "https://vehicle-config-api.gm.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_config_token"
      resources:
        - name: range-spec
          path: "/vehicles/{{vin}}/range"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-range-spec
              method: GET
    - type: http
      namespace: analytics-api
      baseUri: "https://analytics-api.gm.com/engineering/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_analytics_token"
      resources:
        - name: range-data
          path: "/range-variance"
          operations:
            - name: log-range-data
              method: POST

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

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

Retrieves submitted expense reports from SAP Concur, validates against Workday cost center data, and opens a ServiceNow task for finance review when policy exceptions are detected.

naftiko: "0.5"
info:
  label: "Expense Report Processing"
  description: "Retrieves submitted expense reports from SAP Concur, validates against Workday cost center data, and opens a ServiceNow task for finance review when policy exceptions are detected."
  tags:
    - finance
    - expense
    - sap-concur
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: finance-expense
      port: 8080
      tools:
        - name: review-expense-report
          description: "Given a Concur expense report ID and employee ID, fetch, validate, and flag policy violations."
          inputParameters:
            - name: expense_report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
          steps:
            - name: get-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{expense_report_id}}"
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: open-review
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Expense review: {{get-report.report_name}} — {{get-employee.full_name}}"
                description: "Report {{expense_report_id}} total: {{get-report.total_amount}} {{get-report.currency}}. Cost center: {{get-employee.cost_center}}."
                assigned_group: "Finance_Audit"
                category: "expense_review"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gm.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

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

naftiko: "0.5"
info:
  label: "Customer Feedback Pipeline"
  description: "Analyzes feedback at GM 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 GM."
          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.gm.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.survey_token"
      resources:
        - name: responses
          path: "/surveys/{{id}}/responses"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get
              method: GET
    - type: http
      namespace: ai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: analyze
              method: POST
    - type: http
      namespace: power-bi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.power_bi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset}}/refreshes"
          inputParameters:
            - name: dataset
              in: path
          operations:
            - name: refresh
              method: POST

Retrieves a charging session history for a fleet vehicle from the Ultium charging platform by VIN, enriches it with vehicle info from OnStar, and posts the summary to a Salesforce fleet account.

naftiko: "0.5"
info:
  label: "Fleet EV Charging Session Report"
  description: "Retrieves a charging session history for a fleet vehicle from the Ultium charging platform by VIN, enriches it with vehicle info from OnStar, and posts the summary to a Salesforce fleet account."
  tags:
    - fleet
    - ev
    - charging
    - onstar
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: fleet-charging
      port: 8080
      tools:
        - name: generate-charging-report
          description: "Given a VIN and Salesforce fleet account ID, compile charging session data and update the fleet account."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The fleet vehicle VIN."
            - name: account_id
              in: body
              type: string
              description: "The Salesforce fleet account ID."
            - name: date_from
              in: body
              type: string
              description: "Start date for the report period (YYYY-MM-DD)."
            - name: date_to
              in: body
              type: string
              description: "End date for the report period (YYYY-MM-DD)."
          steps:
            - name: get-sessions
              type: call
              call: "charging-api.get-sessions"
              with:
                vin: "{{vin}}"
                from: "{{date_from}}"
                to: "{{date_to}}"
            - name: get-vehicle-info
              type: call
              call: "onstar.get-vehicle"
              with:
                vin: "{{vin}}"
            - name: update-account
              type: call
              call: "salesforce.update-account"
              with:
                account_id: "{{account_id}}"
                note: "Charging report for {{get-vehicle-info.model_year}} {{get-vehicle-info.model_name}} ({{vin}}), {{date_from}} to {{date_to}}: {{get-sessions.total_sessions}} sessions, {{get-sessions.total_kwh}} kWh consumed, ${{get-sessions.total_cost}} total cost."
  consumes:
    - type: http
      namespace: charging-api
      baseUri: "https://charging-api.gm.com/ultium/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_charging_token"
      resources:
        - name: sessions
          path: "/vehicles/{{vin}}/sessions"
          inputParameters:
            - name: vin
              in: path
            - name: from
              in: query
            - name: to
              in: query
          operations:
            - name: get-sessions
              method: GET
    - type: http
      namespace: onstar
      baseUri: "https://api.onstar.com/connected/v2"
      authentication:
        type: oauth2
        tokenUrl: "https://api.onstar.com/oauth/token"
        clientId: "$secrets.onstar_client_id"
        clientSecret: "$secrets.onstar_client_secret"
      resources:
        - name: vehicles
          path: "/vehicles/{{vin}}"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-vehicle
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://gm.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH

Checks GitHub repo at GM.

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

Checks Grafana dashboard at GM.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Status"
  description: "Checks Grafana dashboard at GM."
  tags:
    - monitoring
    - grafana
    - dashboards
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: check-dash
          description: "Check dashboard at GM."
          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.gm.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

Tracks an inbound parts shipment from a tier-1 supplier by retrieving the shipment from the TMS, checking customs clearance status, and updating the SAP inbound delivery.

naftiko: "0.5"
info:
  label: "Inbound Logistics Shipment Tracker"
  description: "Tracks an inbound parts shipment from a tier-1 supplier by retrieving the shipment from the TMS, checking customs clearance status, and updating the SAP inbound delivery."
  tags:
    - supply-chain
    - logistics
    - tms
    - sap
    - sap-s4hana
    - customs
capability:
  exposes:
    - type: mcp
      namespace: inbound-logistics
      port: 8080
      tools:
        - name: track-inbound-shipment
          description: "Given a shipment ID, track location and customs status and update SAP delivery."
          inputParameters:
            - name: shipment_id
              in: body
              type: string
              description: "The TMS shipment identifier."
            - name: sap_delivery_number
              in: body
              type: string
              description: "The SAP inbound delivery number."
          steps:
            - name: get-shipment
              type: call
              call: "tms.get-shipment"
              with:
                shipment_id: "{{shipment_id}}"
            - name: check-customs
              type: call
              call: "customs-api.get-clearance"
              with:
                shipment_ref: "{{shipment_id}}"
            - name: update-sap-delivery
              type: call
              call: "sap.update-inbound-delivery"
              with:
                delivery_number: "{{sap_delivery_number}}"
                eta: "{{get-shipment.estimated_arrival}}"
                customs_status: "{{check-customs.clearance_status}}"
                current_location: "{{get-shipment.current_location}}"
  consumes:
    - type: http
      namespace: tms
      baseUri: "https://tms-api.gm.com/logistics/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_tms_token"
      resources:
        - name: shipments
          path: "/shipments/{{shipment_id}}"
          inputParameters:
            - name: shipment_id
              in: path
          operations:
            - name: get-shipment
              method: GET
    - type: http
      namespace: customs-api
      baseUri: "https://customs-api.gm.com/trade/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_customs_token"
      resources:
        - name: clearance
          path: "/clearance/{{shipment_ref}}"
          inputParameters:
            - name: shipment_ref
              in: path
          operations:
            - name: get-clearance
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://gm-s4.sap.com/sap/opu/odata/sap/MM_INBOUND_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_InboundDelivery('{{delivery_number}}')"
          inputParameters:
            - name: delivery_number
              in: path
          operations:
            - name: update-inbound-delivery
              method: PATCH

When an IT change request is submitted in ServiceNow, retrieves the change details, looks up the change manager in Workday, and sends an approval request via Microsoft Teams.

naftiko: "0.5"
info:
  label: "IT Change Request Approval"
  description: "When an IT change request is submitted in ServiceNow, retrieves the change details, looks up the change manager in Workday, and sends an approval request via Microsoft Teams."
  tags:
    - it
    - servicenow
    - workday
    - microsoft-teams
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: it-change
      port: 8080
      tools:
        - name: route-change-approval
          description: "Given a ServiceNow change number, look up the manager and send approval request."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number."
          steps:
            - name: get-change
              type: call
              call: "servicenow.get-change"
              with:
                change_number: "{{change_number}}"
            - name: get-manager
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{get-change.requested_by_employee_id}}"
            - name: send-approval
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-manager.manager_email}}"
                text: "IT Change Approval Needed: {{change_number}} — {{get-change.short_description}}. Requested by: {{get-manager.full_name}}. Risk: {{get-change.risk_level}}. Planned start: {{get-change.planned_start}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://gm.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: changes
          path: "/table/change_request/{{change_number}}"
          inputParameters:
            - name: change_number
              in: path
          operations:
            - name: get-change
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: 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

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

naftiko: "0.5"
info:
  label: "IT Incident Escalation Pipeline"
  description: "Escalates IT incidents at GM 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 GM."
          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://gm.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 GM.

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

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

naftiko: "0.5"
info:
  label: "Weekly KPI Digest Pipeline"
  description: "Generates KPI digest at GM 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 GM."
          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://gm.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.gm.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.gm.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 GM.

naftiko: "0.5"
info:
  label: "K8s Pod Health"
  description: "Checks K8s pod health at GM."
  tags:
    - containers
    - kubernetes
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: k8s-pod
      port: 8080
      tools:
        - name: check-pod
          description: "Check pod at GM."
          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.gm.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 GM via scanning, entitlements, and procurement.

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

Generates monthly security reports at GM from Splunk and Qualys.

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

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

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

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

naftiko: "0.5"
info:
  label: "New Employee Onboarding Orchestrator"
  description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for the employee, 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 and start date, orchestrate onboarding across ServiceNow, SharePoint, and Microsoft Teams."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "The employee start date in YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "The department or business unit."
          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"
                description: "Onboarding for {{get-employee.full_name}} starting {{start_date}} in {{department}}."
            - name: provision-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr_onboarding_site"
                folder_path: "OnboardingDocs/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to GM, {{get-employee.first_name}}! Your onboarding ticket is {{open-ticket.number}}. Documents: {{provision-folder.url}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gm.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

Checks New Relic APM at GM.

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

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

When an OTA update fails on a vehicle, pulls the vehicle diagnostics from OnStar, retrieves the campaign details, opens a ServiceNow incident, and notifies the software delivery team in Slack.

naftiko: "0.5"
info:
  label: "OTA Update Failure Triage"
  description: "When an OTA update fails on a vehicle, pulls the vehicle diagnostics from OnStar, retrieves the campaign details, opens a ServiceNow incident, and notifies the software delivery team in Slack."
  tags:
    - connected-vehicle
    - ota
    - onstar
    - servicenow
    - slack
    - software-update
capability:
  exposes:
    - type: mcp
      namespace: ota-triage
      port: 8080
      tools:
        - name: triage-ota-failure
          description: "Given a VIN and OTA campaign ID, pull diagnostics, retrieve campaign info, open an incident, and alert the team."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The VIN of the vehicle that failed the update."
            - name: campaign_id
              in: body
              type: string
              description: "The OTA campaign identifier."
          steps:
            - name: get-diagnostics
              type: call
              call: "onstar.get-diagnostics"
              with:
                vin: "{{vin}}"
            - name: get-campaign
              type: call
              call: "ota-api.get-campaign"
              with:
                campaign_id: "{{campaign_id}}"
            - name: open-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "OTA failure — VIN {{vin}}, Campaign {{campaign_id}}"
                description: "OTA update {{get-campaign.campaign_name}} failed on VIN {{vin}}. ECU: {{get-campaign.target_ecu}}. DTCs: {{get-diagnostics.dtc_codes}}. Battery voltage: {{get-diagnostics.battery_voltage}}V."
                category: "ota_failure"
                assigned_group: "Software_Delivery"
            - name: alert-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#ota-failures"
                text: "OTA Failure: VIN {{vin}}, Campaign {{get-campaign.campaign_name}}. ECU: {{get-campaign.target_ecu}}. Incident: {{open-incident.number}}."
  consumes:
    - type: http
      namespace: onstar
      baseUri: "https://api.onstar.com/connected/v2"
      authentication:
        type: oauth2
        tokenUrl: "https://api.onstar.com/oauth/token"
        clientId: "$secrets.onstar_client_id"
        clientSecret: "$secrets.onstar_client_secret"
      resources:
        - name: diagnostics
          path: "/vehicles/{{vin}}/diagnostics"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-diagnostics
              method: GET
    - type: http
      namespace: ota-api
      baseUri: "https://ota-platform.gm.com/campaigns/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_ota_token"
      resources:
        - name: campaigns
          path: "/campaigns/{{campaign_id}}"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gm.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: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks on-call at GM.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Check"
  description: "Checks on-call at GM."
  tags:
    - incident-management
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: pd-oncall
      port: 8080
      tools:
        - name: get-oncall
          description: "Check on-call at GM."
          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

When a paint defect is detected by the vision inspection system, logs the defect in the MES, creates a quality record in the QMS, and alerts the paint shop supervisor in Slack.

naftiko: "0.5"
info:
  label: "Paint Shop Defect Tracking"
  description: "When a paint defect is detected by the vision inspection system, logs the defect in the MES, creates a quality record in the QMS, and alerts the paint shop supervisor in Slack."
  tags:
    - manufacturing
    - quality
    - mes
    - paint-shop
    - slack
capability:
  exposes:
    - type: mcp
      namespace: paint-quality
      port: 8080
      tools:
        - name: log-paint-defect
          description: "Given defect details from the vision system, log in MES and QMS, and alert the supervisor."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The VIN of the vehicle with the defect."
            - name: defect_type
              in: body
              type: string
              description: "The paint defect type (e.g., orange peel, run, sag, dirt)."
            - name: defect_location
              in: body
              type: string
              description: "Panel location of the defect."
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
          steps:
            - name: log-in-mes
              type: call
              call: "mes.create-defect"
              with:
                vin: "{{vin}}"
                defect_type: "{{defect_type}}"
                location: "{{defect_location}}"
                shop: "paint"
            - name: create-quality-record
              type: call
              call: "qms.create-defect-record"
              with:
                vin: "{{vin}}"
                defect_type: "{{defect_type}}"
                location: "{{defect_location}}"
                mes_ref: "{{log-in-mes.defect_id}}"
            - name: alert-supervisor
              type: call
              call: "slack.post-message"
              with:
                channel: "#paint-shop-{{plant_code}}"
                text: "Paint defect on VIN {{vin}}: {{defect_type}} on {{defect_location}}. MES ID: {{log-in-mes.defect_id}}. QMS: {{create-quality-record.record_id}}."
  consumes:
    - type: http
      namespace: mes
      baseUri: "https://mes-api.gm.com/production/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_mes_token"
      resources:
        - name: defects
          path: "/defects"
          operations:
            - name: create-defect
              method: POST
    - type: http
      namespace: qms
      baseUri: "https://qms-api.gm.com/quality/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_qms_token"
      resources:
        - name: defect-records
          path: "/defects"
          operations:
            - name: create-defect-record
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a quality escape is identified at a plant, retrieves the production order from SAP, queries affected VINs from the vehicle tracking system, opens a quality incident in ServiceNow, and alerts the quality team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Plant Quality Escape Workflow"
  description: "When a quality escape is identified at a plant, retrieves the production order from SAP, queries affected VINs from the vehicle tracking system, opens a quality incident in ServiceNow, and alerts the quality team in Microsoft Teams."
  tags:
    - manufacturing
    - quality
    - sap
    - sap-s4hana
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: quality-escape
      port: 8080
      tools:
        - name: handle-quality-escape
          description: "Given a production order number and defect description, identify affected VINs, open a quality incident, and alert the team."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
            - name: defect_description
              in: body
              type: string
              description: "Description of the quality defect found."
            - name: plant_code
              in: body
              type: string
              description: "The manufacturing plant code."
          steps:
            - name: get-order
              type: call
              call: "sap.get-production-order"
              with:
                order_number: "{{order_number}}"
            - name: get-affected-vins
              type: call
              call: "vehicle-tracking.get-vins-by-order"
              with:
                order_number: "{{order_number}}"
            - name: open-quality-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Quality escape — Plant {{plant_code}}, Order {{order_number}}"
                description: "Defect: {{defect_description}}. Production order: {{order_number}}. Affected VINs: {{get-affected-vins.vin_count}}. Model: {{get-order.material_description}}."
                category: "quality_escape"
                urgency: "2"
                assigned_group: "Plant_Quality_{{plant_code}}"
            - name: alert-quality-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "quality-team-{{plant_code}}@gm.com"
                text: "QUALITY ESCAPE: Plant {{plant_code}}, Order {{order_number}}. {{get-affected-vins.vin_count}} VINs affected. Defect: {{defect_description}}. Incident: {{open-quality-incident.number}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gm-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET
    - type: http
      namespace: vehicle-tracking
      baseUri: "https://vehicle-tracking-api.gm.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_tracking_token"
      resources:
        - name: vins
          path: "/orders/{{order_number}}/vins"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-vins-by-order
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gm.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Creates postmortems at GM.

naftiko: "0.5"
info:
  label: "Incident Postmortem Pipeline"
  description: "Creates postmortems at GM."
  tags:
    - incident-management
    - postmortem
    - pagerduty
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: postmortem
      port: 8080
      tools:
        - name: create-postmortem
          description: "Create postmortem at GM."
          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://gm.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: events
          path: "/users/sre/events"
          operations:
            - name: create-event
              method: POST

Checks Power BI refresh at GM.

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

When a SAP Ariba requisition exceeds a spend threshold, routes for manager approval via Workday and notifies the requestor in Microsoft Teams with approval status.

naftiko: "0.5"
info:
  label: "Procurement Requisition Approval"
  description: "When a SAP Ariba requisition exceeds a spend threshold, routes for manager approval via Workday and notifies the requestor in Microsoft Teams with approval status."
  tags:
    - procurement
    - sap-ariba
    - workday
    - microsoft-teams
    - approval
capability:
  exposes:
    - type: mcp
      namespace: procurement-approval
      port: 8080
      tools:
        - name: route-requisition-approval
          description: "Given an Ariba requisition ID and requestor employee ID, resolve the approver and notify both parties."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The SAP Ariba requisition identifier."
            - name: requestor_employee_id
              in: body
              type: string
              description: "The Workday employee ID of the requestor."
            - name: spend_amount
              in: body
              type: number
              description: "The total spend amount."
          steps:
            - name: get-requisition
              type: call
              call: "ariba.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: get-requestor
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{requestor_employee_id}}"
            - name: get-manager
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{get-requestor.manager_id}}"
            - name: notify-approver
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-manager.work_email}}"
                text: "Approval Required: Ariba requisition {{requisition_id}} from {{get-requestor.full_name}} for ${{spend_amount}}. Vendor: {{get-requisition.vendor_name}}."
            - name: notify-requestor
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-requestor.work_email}}"
                text: "Your requisition {{requisition_id}} (${{spend_amount}}) has been routed to {{get-manager.full_name}} for approval."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/purchase-req/v1"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: requisitions
          path: "/requisitions/{{requisition_id}}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: 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

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

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

When a new recall campaign is published, retrieves affected VINs from the safety system, looks up owner contact info via Salesforce, and triggers recall notification letters through the customer communication platform.

naftiko: "0.5"
info:
  label: "Recall Campaign Notification Orchestrator"
  description: "When a new recall campaign is published, retrieves affected VINs from the safety system, looks up owner contact info via Salesforce, and triggers recall notification letters through the customer communication platform."
  tags:
    - safety
    - recall
    - salesforce
    - customer-communication
capability:
  exposes:
    - type: mcp
      namespace: recall-notification
      port: 8080
      tools:
        - name: send-recall-notifications
          description: "Given a recall campaign ID, retrieve affected VINs, look up owners, and trigger notification letters."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The recall campaign identifier."
          steps:
            - name: get-affected-vins
              type: call
              call: "recall-api.get-campaign-vins"
              with:
                campaign_id: "{{campaign_id}}"
            - name: get-owners
              type: call
              call: "salesforce.get-owners-by-vins"
              with:
                vin_list: "{{get-affected-vins.vins}}"
            - name: trigger-letters
              type: call
              call: "comms-api.send-recall-letters"
              with:
                campaign_id: "{{campaign_id}}"
                recipients: "{{get-owners.owner_contacts}}"
                recall_description: "{{get-affected-vins.recall_description}}"
  consumes:
    - type: http
      namespace: recall-api
      baseUri: "https://safety-api.gm.com/compliance/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_safety_token"
      resources:
        - name: campaign-vins
          path: "/campaigns/{{campaign_id}}/vins"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-vins
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://gm.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: owners
          path: "/sobjects/Vehicle_Ownership__c"
          operations:
            - name: get-owners-by-vins
              method: POST
    - type: http
      namespace: comms-api
      baseUri: "https://comms-api.gm.com/notifications/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_comms_token"
      resources:
        - name: recall-letters
          path: "/recall-letters"
          operations:
            - name: send-recall-letters
              method: POST

Checks Redis at GM.

naftiko: "0.5"
info:
  label: "Redis Cache Status"
  description: "Checks Redis at GM."
  tags:
    - caching
    - redis
    - infrastructure
capability:
  exposes:
    - type: mcp
      namespace: redis
      port: 8080
      tools:
        - name: check-cache
          description: "Check Redis at GM."
          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.gm.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 GM.

naftiko: "0.5"
info:
  label: "Release Readiness Pipeline"
  description: "Checks release readiness at GM."
  tags:
    - release-management
    - devops
    - quality
capability:
  exposes:
    - type: mcp
      namespace: release-ready
      port: 8080
      tools:
        - name: check-release
          description: "Check release at GM."
          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/gm.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.gm.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.gm.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://gm.com.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

When a robot cell faults in the body shop, retrieves the error code from the MES, checks the maintenance history in SAP PM, opens a ServiceNow incident, and pages the robotics technician via PagerDuty.

naftiko: "0.5"
info:
  label: "Robot Cell Error Recovery"
  description: "When a robot cell faults in the body shop, retrieves the error code from the MES, checks the maintenance history in SAP PM, opens a ServiceNow incident, and pages the robotics technician via PagerDuty."
  tags:
    - manufacturing
    - robotics
    - mes
    - sap
    - sap-s4hana
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: robot-recovery
      port: 8080
      tools:
        - name: handle-robot-fault
          description: "Given a robot cell ID and plant code, retrieve the fault, check history, open incident, and page technician."
          inputParameters:
            - name: cell_id
              in: body
              type: string
              description: "The robot cell identifier."
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
          steps:
            - name: get-fault
              type: call
              call: "mes.get-robot-fault"
              with:
                cell_id: "{{cell_id}}"
            - name: get-maintenance-history
              type: call
              call: "sap.get-equipment-history"
              with:
                equipment_id: "{{cell_id}}"
                plant: "{{plant_code}}"
            - name: open-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Robot fault — Cell {{cell_id}}, Plant {{plant_code}}"
                description: "Error: {{get-fault.error_code}} — {{get-fault.error_description}}. Cell: {{cell_id}}. Last PM: {{get-maintenance-history.last_pm_date}}. Fault count (30d): {{get-maintenance-history.recent_fault_count}}."
                urgency: "1"
                category: "robot_fault"
                assigned_group: "Robotics_Maintenance_{{plant_code}}"
            - name: page-technician
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "robotics-{{plant_code}}"
                title: "Robot Cell {{cell_id}} Fault: {{get-fault.error_code}}"
                body: "Cell {{cell_id}} faulted at Plant {{plant_code}}. Error: {{get-fault.error_description}}. ServiceNow: {{open-incident.number}}."
  consumes:
    - type: http
      namespace: mes
      baseUri: "https://mes-api.gm.com/production/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_mes_token"
      resources:
        - name: robot-faults
          path: "/cells/{{cell_id}}/faults/latest"
          inputParameters:
            - name: cell_id
              in: path
          operations:
            - name: get-robot-fault
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://gm-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: equipment-history
          path: "/A_Equipment('{{equipment_id}}')/MaintenanceHistory"
          inputParameters:
            - name: equipment_id
              in: path
          operations:
            - name: get-equipment-history
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gm.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: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

When a workplace safety incident is reported, creates a ServiceNow incident, pulls the employee record from Workday for context, files an OSHA-reportable event if applicable, and notifies the plant safety manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Safety Incident Investigation Orchestrator"
  description: "When a workplace safety incident is reported, creates a ServiceNow incident, pulls the employee record from Workday for context, files an OSHA-reportable event if applicable, and notifies the plant safety manager in Microsoft Teams."
  tags:
    - safety
    - manufacturing
    - servicenow
    - workday
    - microsoft-teams
    - ehs
capability:
  exposes:
    - type: mcp
      namespace: safety-incident
      port: 8080
      tools:
        - name: report-safety-incident
          description: "Given incident details, create ServiceNow record, pull employee info, file OSHA report if needed, and notify safety manager."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID of the injured worker."
            - name: plant_code
              in: body
              type: string
              description: "The plant code where the incident occurred."
            - name: incident_description
              in: body
              type: string
              description: "Description of the safety incident."
            - name: severity
              in: body
              type: string
              description: "Incident severity (minor, moderate, severe)."
            - name: safety_manager_email
              in: body
              type: string
              description: "The plant safety manager email."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Safety incident — Plant {{plant_code}}: {{incident_description}}"
                description: "Employee: {{get-employee.full_name}} ({{employee_id}}). Plant: {{plant_code}}. Department: {{get-employee.department}}. Severity: {{severity}}. Description: {{incident_description}}."
                urgency: "1"
                category: "workplace_safety"
                assigned_group: "EHS_{{plant_code}}"
            - name: file-osha-report
              type: call
              call: "ehs-api.create-osha-record"
              with:
                employee_name: "{{get-employee.full_name}}"
                plant_code: "{{plant_code}}"
                description: "{{incident_description}}"
                severity: "{{severity}}"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{safety_manager_email}}"
                text: "Safety Incident: Plant {{plant_code}}, {{get-employee.full_name}}. Severity: {{severity}}. Incident: {{create-incident.number}}. OSHA: {{file-osha-report.record_id}}. Details: {{incident_description}}"
  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://gm.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: ehs-api
      baseUri: "https://ehs-api.gm.com/safety/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_ehs_token"
      resources:
        - name: osha-records
          path: "/osha-reports"
          operations:
            - name: create-osha-record
              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

Checks material availability in SAP S/4HANA by material number and plant, returning available stock, reserved quantity, and next planned receipt date.

naftiko: "0.5"
info:
  label: "SAP Material Availability Check"
  description: "Checks material availability in SAP S/4HANA by material number and plant, returning available stock, reserved quantity, and next planned receipt date."
  tags:
    - supply-chain
    - erp
    - sap
    - sap-s4hana
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: material-mgmt
      port: 8080
      tools:
        - name: check-material-availability
          description: "Check material stock in SAP by material number and plant."
          inputParameters:
            - name: material_number
              in: body
              type: string
              description: "The SAP material number."
            - name: plant
              in: body
              type: string
              description: "The SAP plant code."
          call: "sap.get-material-stock"
          with:
            material_number: "{{material_number}}"
            plant: "{{plant}}"
          outputParameters:
            - name: available_stock
              type: number
              mapping: "$.d.AvailableStock"
            - name: reserved_qty
              type: number
              mapping: "$.d.ReservedQuantity"
            - name: next_receipt_date
              type: string
              mapping: "$.d.NextPlannedReceiptDate"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gm-s4.sap.com/sap/opu/odata/sap/MM_MATERIAL_STOCK_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: material-stock
          path: "/A_MaterialStock(Material='{{material_number}}',Plant='{{plant}}')"
          inputParameters:
            - name: material_number
              in: path
            - name: plant
              in: path
          operations:
            - name: get-material-stock
              method: GET

Checks SAP PO at GM.

naftiko: "0.5"
info:
  label: "SAP PO Check"
  description: "Checks SAP PO at GM."
  tags:
    - procurement
    - sap
    - purchase-orders
capability:
  exposes:
    - type: mcp
      namespace: sap-po
      port: 8080
      tools:
        - name: get-po
          description: "Check PO at GM."
          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.gm.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 S/4HANA purchase order by number and returns header status, vendor, total value, and delivery date for GM procurement.

naftiko: "0.5"
info:
  label: "SAP Purchase Order Status"
  description: "Looks up a SAP S/4HANA purchase order by number and returns header status, vendor, total value, and delivery date for GM procurement."
  tags:
    - procurement
    - erp
    - sap
    - sap-s4hana
    - purchase-order
capability:
  exposes:
    - type: mcp
      namespace: erp-procurement
      port: 8080
      tools:
        - name: get-purchase-order
          description: "Look up a SAP S/4HANA purchase order by PO number. Returns status, vendor, total value, and delivery date."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number (10-digit)."
          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://gm-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET

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

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "Remediates vulnerabilities at GM 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 GM."
          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.gm.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://gm.com.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks IT incident in ServiceNow for GM.

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

Retrieves SharePoint metadata at GM.

naftiko: "0.5"
info:
  label: "SharePoint File Metadata"
  description: "Retrieves SharePoint metadata at GM."
  tags:
    - document-management
    - sharepoint
    - collaboration
capability:
  exposes:
    - type: mcp
      namespace: sp-docs
      port: 8080
      tools:
        - name: get-file
          description: "Look up file at GM."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "Site ID."
            - name: file_path
              in: body
              type: string
              description: "Path."
          call: "sharepoint.get-file"
          with:
            site_id: "{{site_id}}"
            path: "{{file_path}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: size
              type: number
              mapping: "$.size"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.microsoft_graph_token"
      resources:
        - name: files
          path: "/sites/{{site_id}}/drive/root:/{{path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: path
              in: path
          operations:
            - name: get-file
              method: GET

Monitors SLAs at GM via Datadog and Slack.

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

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

Pulls vibration sensor data from the IoT platform for a stamping press, checks the last maintenance record in SAP PM, and creates a preventive work order if the vibration threshold is exceeded.

naftiko: "0.5"
info:
  label: "Stamping Press Predictive Maintenance"
  description: "Pulls vibration sensor data from the IoT platform for a stamping press, checks the last maintenance record in SAP PM, and creates a preventive work order if the vibration threshold is exceeded."
  tags:
    - manufacturing
    - predictive-maintenance
    - iot
    - sap
    - sap-s4hana
capability:
  exposes:
    - type: mcp
      namespace: predictive-maint
      port: 8080
      tools:
        - name: check-press-health
          description: "Given a press ID, pull sensor data and last maintenance record, and create a work order if needed."
          inputParameters:
            - name: press_id
              in: body
              type: string
              description: "The stamping press equipment ID."
            - name: plant_code
              in: body
              type: string
              description: "The plant code."
          steps:
            - name: get-sensor-data
              type: call
              call: "iot-api.get-vibration"
              with:
                equipment_id: "{{press_id}}"
            - name: get-last-maintenance
              type: call
              call: "sap.get-last-work-order"
              with:
                equipment_id: "{{press_id}}"
                plant: "{{plant_code}}"
            - name: create-work-order
              type: call
              call: "sap.create-pm-order"
              with:
                equipment_id: "{{press_id}}"
                plant: "{{plant_code}}"
                order_type: "PM01"
                description: "Preventive maintenance — vibration {{get-sensor-data.vibration_mm_s}} mm/s (threshold: {{get-sensor-data.threshold_mm_s}}). Last PM: {{get-last-maintenance.completion_date}}."
  consumes:
    - type: http
      namespace: iot-api
      baseUri: "https://iot-api.gm.com/sensors/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_iot_token"
      resources:
        - name: vibration
          path: "/equipment/{{equipment_id}}/vibration"
          inputParameters:
            - name: equipment_id
              in: path
          operations:
            - name: get-vibration
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://gm-s4.sap.com/sap/opu/odata/sap/PM_WORK_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: work-orders
          path: "/A_MaintenanceOrder?$filter=Equipment eq '{{equipment_id}}' and Plant eq '{{plant}}'"
          inputParameters:
            - name: equipment_id
              in: path
            - name: plant
              in: path
          operations:
            - name: get-last-work-order
              method: GET
        - name: pm-orders
          path: "/A_MaintenanceOrder"
          operations:
            - name: create-pm-order
              method: POST

When a supplier quality issue is identified, creates a corrective action request in the QMS, notifies the supplier via SAP Ariba, creates a JIRA tracking issue, and alerts the SQE in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supplier Corrective Action Workflow"
  description: "When a supplier quality issue is identified, creates a corrective action request in the QMS, notifies the supplier via SAP Ariba, creates a JIRA tracking issue, and alerts the SQE in Microsoft Teams."
  tags:
    - supply-chain
    - quality
    - qms
    - sap-ariba
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: supplier-corrective
      port: 8080
      tools:
        - name: initiate-corrective-action
          description: "Given a supplier ID, defect info, and SQE email, create corrective action records and notify all parties."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
            - name: part_number
              in: body
              type: string
              description: "The affected part number."
            - name: defect_description
              in: body
              type: string
              description: "Description of the quality defect."
            - name: sqe_email
              in: body
              type: string
              description: "The SQE email address."
          steps:
            - name: get-supplier
              type: call
              call: "ariba.get-supplier"
              with:
                supplier_id: "{{supplier_id}}"
            - name: create-car
              type: call
              call: "qms.create-corrective-action"
              with:
                supplier_id: "{{supplier_id}}"
                supplier_name: "{{get-supplier.supplier_name}}"
                part_number: "{{part_number}}"
                defect: "{{defect_description}}"
            - name: notify-supplier
              type: call
              call: "ariba.send-supplier-message"
              with:
                supplier_id: "{{supplier_id}}"
                subject: "Corrective Action Required — Part {{part_number}}"
                message: "CAR {{create-car.car_number}} has been issued for part {{part_number}}. Defect: {{defect_description}}. Please respond within 10 business days."
            - name: create-jira
              type: call
              call: "jira.create-issue"
              with:
                project: "SQE"
                issue_type: "Task"
                summary: "CAR {{create-car.car_number}} — {{get-supplier.supplier_name}}, Part {{part_number}}"
                description: "Corrective action for {{get-supplier.supplier_name}}. Part: {{part_number}}. Defect: {{defect_description}}."
            - name: notify-sqe
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{sqe_email}}"
                text: "CAR Issued: {{create-car.car_number}} for {{get-supplier.supplier_name}}, part {{part_number}}. JIRA: {{create-jira.key}}. Defect: {{defect_description}}"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-mgmt/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET
        - name: messages
          path: "/suppliers/{{supplier_id}}/messages"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: send-supplier-message
              method: POST
    - type: http
      namespace: qms
      baseUri: "https://qms-api.gm.com/quality/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_qms_token"
      resources:
        - name: corrective-actions
          path: "/corrective-actions"
          operations:
            - name: create-corrective-action
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gm-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              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

When a supply chain risk is flagged in Resilinc, enriches the alert with SAP Ariba supplier data, opens a ServiceNow incident for procurement, and notifies the commodity manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supplier Disruption Alert Pipeline"
  description: "When a supply chain risk is flagged in Resilinc, enriches the alert with SAP Ariba supplier data, opens a ServiceNow incident for procurement, and notifies the commodity manager in Microsoft Teams."
  tags:
    - supply-chain
    - resilinc
    - sap-ariba
    - servicenow
    - microsoft-teams
    - risk-management
capability:
  exposes:
    - type: mcp
      namespace: supply-risk
      port: 8080
      tools:
        - name: process-disruption-alert
          description: "Given a Resilinc alert ID and commodity manager email, enrich the alert, open a ServiceNow incident, and notify the manager."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Resilinc supply disruption alert ID."
            - name: commodity_manager_email
              in: body
              type: string
              description: "The email of the commodity manager to notify."
          steps:
            - name: get-alert
              type: call
              call: "resilinc.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: get-supplier
              type: call
              call: "ariba.get-supplier"
              with:
                supplier_id: "{{get-alert.supplier_id}}"
            - name: open-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Supply disruption: {{get-supplier.supplier_name}} — {{get-alert.event_type}}"
                description: "Resilinc alert {{alert_id}}: {{get-alert.description}}. Supplier: {{get-supplier.supplier_name}}, Region: {{get-alert.region}}. Impact: {{get-alert.severity}}."
                category: "supply_chain_disruption"
                assigned_group: "Procurement_Risk"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{commodity_manager_email}}"
                text: "Supply Disruption Alert: {{get-supplier.supplier_name}} — {{get-alert.event_type}} ({{get-alert.severity}}). Incident {{open-incident.number}} opened. Details: {{get-alert.description}}"
  consumes:
    - type: http
      namespace: resilinc
      baseUri: "https://api.resilinc.com/v2"
      authentication:
        type: bearer
        token: "$secrets.resilinc_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-mgmt/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://gm.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When a supplier shipment misses its delivery window, retrieves the PO from SAP, pulls the supplier scorecard from Ariba, logs a delivery exception, and notifies the buyer in Slack.

naftiko: "0.5"
info:
  label: "Supplier On-Time Delivery Alert"
  description: "When a supplier shipment misses its delivery window, retrieves the PO from SAP, pulls the supplier scorecard from Ariba, logs a delivery exception, and notifies the buyer in Slack."
  tags:
    - supply-chain
    - sap
    - sap-s4hana
    - sap-ariba
    - slack
    - delivery
capability:
  exposes:
    - type: mcp
      namespace: delivery-exception
      port: 8080
      tools:
        - name: handle-late-delivery
          description: "Given a PO number and supplier ID, pull PO details, check scorecard, log exception, and notify buyer."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "The SAP purchase order number."
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier ID."
            - name: buyer_slack_id
              in: body
              type: string
              description: "The buyer's Slack user ID."
          steps:
            - name: get-po
              type: call
              call: "sap.get-po"
              with:
                po_number: "{{po_number}}"
            - name: get-scorecard
              type: call
              call: "ariba.get-supplier-scorecard"
              with:
                supplier_id: "{{supplier_id}}"
            - name: log-exception
              type: call
              call: "logistics-api.create-exception"
              with:
                po_number: "{{po_number}}"
                supplier_id: "{{supplier_id}}"
                exception_type: "late_delivery"
                expected_date: "{{get-po.delivery_date}}"
            - name: notify-buyer
              type: call
              call: "slack.post-message"
              with:
                channel: "#procurement-alerts"
                text: "<@{{buyer_slack_id}}> Late delivery: PO {{po_number}} from {{get-po.vendor}} was due {{get-po.delivery_date}}. Supplier OTD score: {{get-scorecard.on_time_delivery_pct}}%. Exception logged: {{log-exception.exception_id}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gm-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
      resources:
        - name: purchase-orders
          path: "/A_PurchaseOrder('{{po_number}}')"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-mgmt/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: scorecards
          path: "/suppliers/{{supplier_id}}/scorecard"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier-scorecard
              method: GET
    - type: http
      namespace: logistics-api
      baseUri: "https://logistics-api.gm.com/exceptions/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_logistics_token"
      resources:
        - name: exceptions
          path: "/exceptions"
          operations:
            - name: create-exception
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a supplier submits a Production Part Approval Process package, validates it in SAP Ariba, logs the submission in the quality management system, and notifies the SQE via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Supplier PPAP Submission Workflow"
  description: "When a supplier submits a Production Part Approval Process package, validates it in SAP Ariba, logs the submission in the quality management system, and notifies the SQE via Microsoft Teams."
  tags:
    - supply-chain
    - quality
    - sap-ariba
    - ppap
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ppap-submission
      port: 8080
      tools:
        - name: process-ppap
          description: "Given a supplier ID, part number, and PPAP package reference, validate, log, and notify."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier identifier."
            - name: part_number
              in: body
              type: string
              description: "The GM part number being approved."
            - name: ppap_package_ref
              in: body
              type: string
              description: "Reference ID of the PPAP submission package."
            - name: sqe_email
              in: body
              type: string
              description: "The supplier quality engineer email."
          steps:
            - name: get-supplier
              type: call
              call: "ariba.get-supplier"
              with:
                supplier_id: "{{supplier_id}}"
            - name: log-submission
              type: call
              call: "qms.create-ppap-record"
              with:
                supplier_id: "{{supplier_id}}"
                supplier_name: "{{get-supplier.supplier_name}}"
                part_number: "{{part_number}}"
                package_ref: "{{ppap_package_ref}}"
            - name: notify-sqe
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{sqe_email}}"
                text: "PPAP Submission: {{get-supplier.supplier_name}} submitted PPAP for part {{part_number}}. Package ref: {{ppap_package_ref}}. QMS record: {{log-submission.record_id}}. Please review."
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-mgmt/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: suppliers
          path: "/suppliers/{{supplier_id}}"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier
              method: GET
    - type: http
      namespace: qms
      baseUri: "https://qms-api.gm.com/quality/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_qms_token"
      resources:
        - name: ppap-records
          path: "/ppap"
          operations:
            - name: create-ppap-record
              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

Fetches a supplier quality scorecard from SAP Ariba by supplier ID, returning PPM defect rate, on-time delivery percentage, and corrective action count.

naftiko: "0.5"
info:
  label: "Supplier Quality Scorecard"
  description: "Fetches a supplier quality scorecard from SAP Ariba by supplier ID, returning PPM defect rate, on-time delivery percentage, and corrective action count."
  tags:
    - supply-chain
    - quality
    - sap-ariba
    - supplier-management
capability:
  exposes:
    - type: mcp
      namespace: supplier-quality
      port: 8080
      tools:
        - name: get-supplier-scorecard
          description: "Retrieve supplier quality scorecard by supplier ID. Returns PPM, on-time delivery, and corrective actions."
          inputParameters:
            - name: supplier_id
              in: body
              type: string
              description: "The SAP Ariba supplier identifier."
          call: "ariba.get-supplier-scorecard"
          with:
            supplier_id: "{{supplier_id}}"
          outputParameters:
            - name: ppm_rate
              type: number
              mapping: "$.scorecard.ppmDefectRate"
            - name: on_time_delivery_pct
              type: number
              mapping: "$.scorecard.onTimeDeliveryPercent"
            - name: corrective_actions
              type: number
              mapping: "$.scorecard.correctiveActionCount"
  consumes:
    - type: http
      namespace: ariba
      baseUri: "https://openapi.ariba.com/api/supplier-mgmt/v2"
      authentication:
        type: bearer
        token: "$secrets.ariba_token"
      resources:
        - name: scorecards
          path: "/suppliers/{{supplier_id}}/scorecard"
          inputParameters:
            - name: supplier_id
              in: path
          operations:
            - name: get-supplier-scorecard
              method: GET

Retrieves Teams activity at GM.

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

Checks Terraform workspace at GM.

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

When a tooling change is requested for a stamping die, creates the engineering change order in SAP, opens a JIRA task for the tooling team, and notifies the manufacturing engineer in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Tooling Change Request Workflow"
  description: "When a tooling change is requested for a stamping die, creates the engineering change order in SAP, opens a JIRA task for the tooling team, and notifies the manufacturing engineer in Microsoft Teams."
  tags:
    - manufacturing
    - tooling
    - sap
    - sap-s4hana
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: tooling-change
      port: 8080
      tools:
        - name: submit-tooling-change
          description: "Given tooling details, create an SAP change order, open a JIRA task, and notify the engineer."
          inputParameters:
            - name: tool_id
              in: body
              type: string
              description: "The stamping die or tool identifier."
            - name: change_description
              in: body
              type: string
              description: "Description of the requested tooling change."
            - name: part_number
              in: body
              type: string
              description: "The affected part number."
            - name: engineer_email
              in: body
              type: string
              description: "The manufacturing engineer email."
          steps:
            - name: create-eco
              type: call
              call: "sap.create-change-order"
              with:
                tool_id: "{{tool_id}}"
                description: "{{change_description}}"
                material: "{{part_number}}"
            - name: create-jira-task
              type: call
              call: "jira.create-issue"
              with:
                project: "TOOLING"
                issue_type: "Task"
                summary: "Tooling change — {{tool_id}} for part {{part_number}}"
                description: "ECO: {{create-eco.eco_number}}. Change: {{change_description}}. Tool: {{tool_id}}, Part: {{part_number}}."
            - name: notify-engineer
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{engineer_email}}"
                text: "Tooling Change Request: Tool {{tool_id}}, Part {{part_number}}. ECO: {{create-eco.eco_number}}. JIRA: {{create-jira-task.key}}. Details: {{change_description}}"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gm-s4.sap.com/sap/opu/odata/sap/PLM_ECO_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: change-orders
          path: "/A_EngineeringChangeOrder"
          operations:
            - name: create-change-order
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://gm-engineering.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              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

Checks Vault secret at GM.

naftiko: "0.5"
info:
  label: "Vault Secret Metadata"
  description: "Checks Vault secret at GM."
  tags:
    - security
    - vault
    - secrets-management
capability:
  exposes:
    - type: mcp
      namespace: vault
      port: 8080
      tools:
        - name: check-secret
          description: "Check secret at GM."
          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.gm.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

When a dealer requests a vehicle build sheet by VIN, retrieves the production order from SAP, fetches installed option codes from the vehicle configuration system, and delivers the compiled build sheet via Salesforce case update.

naftiko: "0.5"
info:
  label: "Vehicle Build Sheet Orchestrator"
  description: "When a dealer requests a vehicle build sheet by VIN, retrieves the production order from SAP, fetches installed option codes from the vehicle configuration system, and delivers the compiled build sheet via Salesforce case update."
  tags:
    - manufacturing
    - dealer
    - sap
    - sap-s4hana
    - salesforce
    - vehicle-configuration
capability:
  exposes:
    - type: mcp
      namespace: build-sheet
      port: 8080
      tools:
        - name: generate-build-sheet
          description: "Given a VIN and Salesforce case ID, compile the vehicle build sheet from SAP and configuration data and update the dealer case."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The 17-character Vehicle Identification Number."
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID for the dealer request."
          steps:
            - name: get-production-order
              type: call
              call: "sap.get-order-by-vin"
              with:
                vin: "{{vin}}"
            - name: get-options
              type: call
              call: "vehicle-config.get-options"
              with:
                vin: "{{vin}}"
            - name: update-case
              type: call
              call: "salesforce.update-case"
              with:
                case_id: "{{case_id}}"
                comment: "Build sheet for VIN {{vin}}: Plant {{get-production-order.plant}}, Build Date {{get-production-order.build_date}}. Options: {{get-options.option_summary}}."
                status: "Resolved"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gm-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
      resources:
        - name: orders-by-vin
          path: "/A_ProductionOrder?$filter=VIN eq '{{vin}}'"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-order-by-vin
              method: GET
    - type: http
      namespace: vehicle-config
      baseUri: "https://vehicle-config-api.gm.com/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_config_token"
      resources:
        - name: options
          path: "/vehicles/{{vin}}/options"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-options
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://gm.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: update-case
              method: PATCH

When OnStar detects a vehicle crash event, retrieves crash telemetry, looks up the owner in Salesforce, creates an emergency case, and dispatches a notification to the OnStar advisor queue.

naftiko: "0.5"
info:
  label: "Vehicle Crash Notification Response"
  description: "When OnStar detects a vehicle crash event, retrieves crash telemetry, looks up the owner in Salesforce, creates an emergency case, and dispatches a notification to the OnStar advisor queue."
  tags:
    - connected-vehicle
    - onstar
    - safety
    - salesforce
    - emergency-response
capability:
  exposes:
    - type: mcp
      namespace: crash-response
      port: 8080
      tools:
        - name: process-crash-event
          description: "Given a VIN and crash event ID, pull telemetry, look up the owner, create an emergency case, and dispatch."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The VIN of the crashed vehicle."
            - name: event_id
              in: body
              type: string
              description: "The OnStar crash event identifier."
          steps:
            - name: get-crash-data
              type: call
              call: "onstar.get-crash-event"
              with:
                vin: "{{vin}}"
                event_id: "{{event_id}}"
            - name: get-owner
              type: call
              call: "salesforce.get-owner-by-vin"
              with:
                vin: "{{vin}}"
            - name: create-case
              type: call
              call: "salesforce.create-case"
              with:
                subject: "Crash Event — VIN {{vin}}"
                description: "Crash detected. Severity: {{get-crash-data.severity}}. Location: {{get-crash-data.latitude}}, {{get-crash-data.longitude}}. Speed at impact: {{get-crash-data.impact_speed_mph}} mph. Airbags: {{get-crash-data.airbags_deployed}}. Owner: {{get-owner.customer_name}}."
                priority: "Critical"
                type: "Emergency"
            - name: dispatch-advisor
              type: call
              call: "onstar.dispatch-advisor"
              with:
                event_id: "{{event_id}}"
                case_id: "{{create-case.case_id}}"
                owner_phone: "{{get-owner.phone}}"
  consumes:
    - type: http
      namespace: onstar
      baseUri: "https://api.onstar.com/connected/v2"
      authentication:
        type: oauth2
        tokenUrl: "https://api.onstar.com/oauth/token"
        clientId: "$secrets.onstar_client_id"
        clientSecret: "$secrets.onstar_client_secret"
      resources:
        - name: crash-events
          path: "/vehicles/{{vin}}/crash-events/{{event_id}}"
          inputParameters:
            - name: vin
              in: path
            - name: event_id
              in: path
          operations:
            - name: get-crash-event
              method: GET
        - name: advisor-dispatch
          path: "/crash-events/{{event_id}}/dispatch"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: dispatch-advisor
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://gm.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: owners
          path: "/sobjects/Vehicle_Ownership__c/vin/{{vin}}"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-owner-by-vin
              method: GET
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST

When a vehicle completes production, updates the SAP delivery record, notifies the allocated dealer via the DMS, and sends the customer an estimated delivery date through Salesforce Marketing Cloud.

naftiko: "0.5"
info:
  label: "Vehicle Delivery Coordination"
  description: "When a vehicle completes production, updates the SAP delivery record, notifies the allocated dealer via the DMS, and sends the customer an estimated delivery date through Salesforce Marketing Cloud."
  tags:
    - manufacturing
    - dealer
    - sap
    - sap-s4hana
    - dms
    - salesforce-marketing-cloud
    - delivery
capability:
  exposes:
    - type: mcp
      namespace: vehicle-delivery
      port: 8080
      tools:
        - name: coordinate-delivery
          description: "Given a VIN and dealer code, update the SAP delivery, notify the dealer, and send customer ETA."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The VIN of the completed vehicle."
            - name: dealer_code
              in: body
              type: string
              description: "The dealer BAC code."
            - name: estimated_arrival
              in: body
              type: string
              description: "Estimated dealer arrival date in YYYY-MM-DD format."
          steps:
            - name: update-delivery
              type: call
              call: "sap.update-delivery"
              with:
                vin: "{{vin}}"
                delivery_date: "{{estimated_arrival}}"
                status: "SHIPPED"
            - name: notify-dealer
              type: call
              call: "dms.send-notification"
              with:
                dealer_code: "{{dealer_code}}"
                message: "VIN {{vin}} has shipped. Estimated arrival: {{estimated_arrival}}."
                notification_type: "vehicle_shipment"
            - name: get-customer
              type: call
              call: "salesforce.get-order-by-vin"
              with:
                vin: "{{vin}}"
            - name: send-customer-eta
              type: call
              call: "sfmc.send-transactional"
              with:
                email: "{{get-customer.customer_email}}"
                template: "vehicle_delivery_eta"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gm-s4.sap.com/sap/opu/odata/sap/VMS_DELIVERY_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: deliveries
          path: "/A_VehicleDelivery('{{vin}}')"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: update-delivery
              method: PATCH
    - type: http
      namespace: dms
      baseUri: "https://dealer-api.gm.com/dms/v2"
      authentication:
        type: bearer
        token: "$secrets.gm_dms_token"
      resources:
        - name: notifications
          path: "/dealers/{{dealer_code}}/notifications"
          inputParameters:
            - name: dealer_code
              in: path
          operations:
            - name: send-notification
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://gm.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: orders
          path: "/sobjects/Vehicle_Order__c/vin/{{vin}}"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-order-by-vin
              method: GET
    - type: http
      namespace: sfmc
      baseUri: "https://mcj6cy1x9m-t.rest.marketingcloudapis.com"
      authentication:
        type: bearer
        token: "$secrets.sfmc_token"
      resources:
        - name: transactional
          path: "/messaging/v1/email/messages"
          operations:
            - name: send-transactional
              method: POST

Retrieves a vehicle production order from SAP S/4HANA by order number and returns current build status, plant assignment, scheduled completion date, and VIN allocation.

naftiko: "0.5"
info:
  label: "Vehicle Production Order Status"
  description: "Retrieves a vehicle production order from SAP S/4HANA by order number and returns current build status, plant assignment, scheduled completion date, and VIN allocation."
  tags:
    - manufacturing
    - erp
    - sap
    - sap-s4hana
    - production-order
capability:
  exposes:
    - type: mcp
      namespace: manufacturing
      port: 8080
      tools:
        - name: get-production-order
          description: "Look up a SAP S/4HANA vehicle production order by order number. Returns build status, plant, scheduled date, and VIN."
          inputParameters:
            - name: order_number
              in: body
              type: string
              description: "The SAP production order number."
          call: "sap.get-production-order"
          with:
            order_number: "{{order_number}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.d.OrderStatus"
            - name: plant
              type: string
              mapping: "$.d.ProductionPlant"
            - name: scheduled_date
              type: string
              mapping: "$.d.ScheduledCompletionDate"
            - name: vin
              type: string
              mapping: "$.d.VehicleIdentificationNumber"
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://gm-s4.sap.com/sap/opu/odata/sap/PP_PROD_ORDER_SRV"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      inputParameters:
        - name: Accept
          in: header
          value: "application/json"
        - name: sap-client
          in: header
          value: "100"
      resources:
        - name: production-orders
          path: "/A_ProductionOrder('{{order_number}}')"
          inputParameters:
            - name: order_number
              in: path
          operations:
            - name: get-production-order
              method: GET

Checks whether a vehicle has open recalls by VIN using the GM safety compliance system, returning recall campaign IDs, descriptions, and remedy status.

naftiko: "0.5"
info:
  label: "Vehicle Recall Check"
  description: "Checks whether a vehicle has open recalls by VIN using the GM safety compliance system, returning recall campaign IDs, descriptions, and remedy status."
  tags:
    - safety
    - recall
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: safety-compliance
      port: 8080
      tools:
        - name: check-recalls
          description: "Check open recalls for a vehicle by VIN."
          inputParameters:
            - name: vin
              in: body
              type: string
              description: "The 17-character Vehicle Identification Number."
          call: "recall-api.get-recalls"
          with:
            vin: "{{vin}}"
          outputParameters:
            - name: open_recalls
              type: array
              mapping: "$.recalls"
            - name: recall_count
              type: number
              mapping: "$.totalCount"
  consumes:
    - type: http
      namespace: recall-api
      baseUri: "https://safety-api.gm.com/compliance/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_safety_token"
      resources:
        - name: recalls
          path: "/vehicles/{{vin}}/recalls"
          inputParameters:
            - name: vin
              in: path
          operations:
            - name: get-recalls
              method: GET

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

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

Reviews vendors at GM.

naftiko: "0.5"
info:
  label: "Quarterly Vendor Review Pipeline"
  description: "Reviews vendors at GM."
  tags:
    - procurement
    - vendor-management
    - review
capability:
  exposes:
    - type: mcp
      namespace: vendor-review
      port: 8080
      tools:
        - name: review-vendor
          description: "Review vendors at GM."
          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.gm.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.gm.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.gm.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

Retrieves a warranty claim record from GM's warranty management system by claim number, returning VIN, repair code, dealer, labor hours, and claim status.

naftiko: "0.5"
info:
  label: "Warranty Claim Lookup"
  description: "Retrieves a warranty claim record from GM's warranty management system by claim number, returning VIN, repair code, dealer, labor hours, and claim status."
  tags:
    - warranty
    - dealer
    - claim-management
capability:
  exposes:
    - type: mcp
      namespace: warranty
      port: 8080
      tools:
        - name: get-warranty-claim
          description: "Look up a warranty claim by claim number. Returns VIN, repair code, dealer, labor hours, and status."
          inputParameters:
            - name: claim_number
              in: body
              type: string
              description: "The warranty claim reference number."
          call: "warranty-api.get-claim"
          with:
            claim_number: "{{claim_number}}"
          outputParameters:
            - name: vin
              type: string
              mapping: "$.claim.vin"
            - name: repair_code
              type: string
              mapping: "$.claim.repairCode"
            - name: dealer_code
              type: string
              mapping: "$.claim.dealerCode"
            - name: status
              type: string
              mapping: "$.claim.claimStatus"
  consumes:
    - type: http
      namespace: warranty-api
      baseUri: "https://warranty-api.gm.com/claims/v1"
      authentication:
        type: bearer
        token: "$secrets.gm_warranty_token"
      resources:
        - name: claims
          path: "/claims/{{claim_number}}"
          inputParameters:
            - name: claim_number
              in: path
          operations:
            - name: get-claim
              method: GET

Retrieves employee profile from Workday for GM.

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