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