Exxon Mobil Capabilities
Naftiko 0.5 capability definitions for Exxon Mobil - 100 capabilities showing integration workflows and service orchestrations.
Uses Anthropic Claude to summarize incoming environmental or regulatory compliance documents, then stores summaries in Salesforce and notifies the compliance team via Teams.
naftiko: "0.5"
info:
label: "AI-Assisted Regulatory Document Summarization"
description: "Uses Anthropic Claude to summarize incoming environmental or regulatory compliance documents, then stores summaries in Salesforce and notifies the compliance team via Teams."
tags:
- ai
- compliance
- anthropic
- salesforce
- msteams
- oil-gas
capability:
exposes:
- type: mcp
namespace: compliance-ai
port: 8080
tools:
- name: summarize-regulatory-document
description: "Given a compliance document text and Salesforce case ID, call Anthropic Claude to generate an executive summary and action items, then store in Salesforce and alert the compliance team via Teams."
inputParameters:
- name: document_text
in: body
type: string
description: "Full text of the regulatory or environmental compliance document."
- name: salesforce_case_id
in: body
type: string
description: "Salesforce case ID associated with this compliance matter."
steps:
- name: generate-summary
type: call
call: anthropic.create-message
with:
model: "claude-opus-4-5"
max_tokens: "800"
system: "You are a regulatory compliance analyst for an energy company. Summarize the key requirements, deadlines, and required actions from the following regulatory document in plain language. Provide: 1) Executive summary (3-4 sentences), 2) Key compliance deadlines, 3) Required actions."
user_content: "{{document_text}}"
- name: store-summary
type: call
call: salesforce.update-case-notes
with:
case_id: "{{salesforce_case_id}}"
Regulatory_Summary__c: "{{generate-summary.content}}"
- name: notify-compliance
type: call
call: msteams.send-message
with:
channel: "regulatory-compliance"
text: "Regulatory document summarized and stored. Salesforce case: {{salesforce_case_id}}. Review required."
consumes:
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: salesforce
baseUri: "https://exxon.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-notes
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/compliance/channels/regulatory/messages"
operations:
- name: send-message
method: POST
Monitors Azure daily spend for energy and technology subscriptions, records cost anomalies in Snowflake, and opens ServiceNow incidents when thresholds are exceeded.
naftiko: "0.5"
info:
label: "Azure Cloud Cost Anomaly Alert"
description: "Monitors Azure daily spend for energy and technology subscriptions, records cost anomalies in Snowflake, and opens ServiceNow incidents when thresholds are exceeded."
tags:
- cloud
- finops
- azure
- snowflake
- servicenow
- cost-management
capability:
exposes:
- type: mcp
namespace: cloud-cost
port: 8080
tools:
- name: detect-cost-anomaly
description: "Given an Azure subscription ID and daily spend threshold, query current daily costs, record to Snowflake, and raise a ServiceNow incident if the threshold is exceeded. Use for daily FinOps monitoring across E&P cloud subscriptions."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID to check for cost anomalies."
- name: threshold_usd
in: body
type: number
description: "Daily spend threshold in USD above which an alert is raised."
steps:
- name: get-daily-cost
type: call
call: azure.query-cost
with:
subscription_id: "{{subscription_id}}"
- name: log-cost
type: call
call: snowflake.insert-cost-record
with:
subscription_id: "{{subscription_id}}"
daily_cost: "{{get-daily-cost.total_cost}}"
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Azure cost anomaly: ${{get-daily-cost.total_cost}} exceeds threshold on {{subscription_id}}"
urgency: "2"
category: "cloud_cost"
consumes:
- type: http
namespace: azure
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_token"
resources:
- name: cost-query
path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query"
inputParameters:
- name: subscription_id
in: path
operations:
- name: query-cost
method: POST
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: cost-records
path: "/statements"
operations:
- name: insert-cost-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://exxon.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
Enforces a release gate in Azure DevOps for SCADA system deployments by verifying safety review approvals in ServiceNow and change window compliance before allowing production releases.
naftiko: "0.5"
info:
label: "Azure DevOps Release Gate for SCADA Systems"
description: "Enforces a release gate in Azure DevOps for SCADA system deployments by verifying safety review approvals in ServiceNow and change window compliance before allowing production releases."
tags:
- safety
- devops
- azure-devops
- servicenow
- ot
capability:
exposes:
- type: mcp
namespace: scada-release-gate
port: 8080
tools:
- name: check-scada-release-gate
description: "Given an Azure DevOps release ID, verify ServiceNow safety review approval and change window compliance before allowing SCADA deployment."
inputParameters:
- name: release_id
in: body
type: string
description: "Azure DevOps release pipeline ID."
- name: change_request_id
in: body
type: string
description: "ServiceNow change request number."
steps:
- name: check-approval
type: call
call: servicenow.get-change-request
with:
change_request_id: "{{change_request_id}}"
- name: validate-window
type: call
call: servicenow.check-change-window
with:
change_request_id: "{{change_request_id}}"
- name: update-release
type: call
call: azuredevops.update-release-gate
with:
release_id: "{{release_id}}"
approved: "{{check-approval.state}}"
in_window: "{{validate-window.in_window}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: get-change-request
method: GET
- name: check-change-window
method: GET
- type: http
namespace: azuredevops
baseUri: "https://dev.azure.com/exxon"
authentication:
type: bearer
token: "$secrets.azuredevops_token"
resources:
- name: releases
path: "/_apis/release/releases/{{release_id}}"
inputParameters:
- name: release_id
in: path
operations:
- name: update-release-gate
method: PATCH
Fetches current energy commodity prices from Bloomberg for crude oil, natural gas, and refined products, returning bid, ask, and last trade values.
naftiko: "0.5"
info:
label: "Bloomberg Energy Market Price Snapshot"
description: "Fetches current energy commodity prices from Bloomberg for crude oil, natural gas, and refined products, returning bid, ask, and last trade values."
tags:
- trading
- bloomberg
- energy-markets
capability:
exposes:
- type: mcp
namespace: market-prices
port: 8080
tools:
- name: get-energy-prices
description: "Look up current energy commodity prices from Bloomberg by ticker symbol. Returns bid, ask, last trade price, and volume for trading desk queries."
inputParameters:
- name: ticker
in: body
type: string
description: "Bloomberg ticker symbol (e.g., CL1 for WTI crude, NG1 for natural gas)."
call: bloomberg.get-price
with:
ticker: "{{ticker}}"
outputParameters:
- name: bid
type: number
mapping: "$.data.bid"
- name: ask
type: number
mapping: "$.data.ask"
- name: last_trade
type: number
mapping: "$.data.lastTrade"
- name: volume
type: number
mapping: "$.data.volume"
consumes:
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/fields"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: prices
path: "/{{ticker}}/snapshot"
inputParameters:
- name: ticker
in: path
operations:
- name: get-price
method: GET
After a ServiceNow incident is closed, creates a Confluence post-incident review page in the IT knowledge base with incident details and lessons learned.
naftiko: "0.5"
info:
label: "Confluence Post-Incident Review Knowledge Capture"
description: "After a ServiceNow incident is closed, creates a Confluence post-incident review page in the IT knowledge base with incident details and lessons learned."
tags:
- itsm
- knowledge-management
- servicenow
- confluence
- incident-response
capability:
exposes:
- type: mcp
namespace: incident-knowledge
port: 8080
tools:
- name: capture-post-incident-review
description: "Given a resolved ServiceNow incident number and Confluence space key, fetch incident close notes and resolution details, then create a post-incident review (PIR) page in Confluence."
inputParameters:
- name: incident_number
in: body
type: string
description: "ServiceNow incident number (e.g., INC0099887)."
- name: confluence_space_key
in: body
type: string
description: "Confluence space key for the IT knowledge base (e.g., OPSOPS)."
steps:
- name: get-incident
type: call
call: servicenow.get-incident
with:
number: "{{incident_number}}"
- name: create-pir-page
type: call
call: confluence.create-page
with:
space_key: "{{confluence_space_key}}"
title: "PIR: {{incident_number}} — {{get-incident.short_description}}"
body: "Incident: {{incident_number}}\nSummary: {{get-incident.short_description}}\nImpact: {{get-incident.impact}}\nRoot Cause: {{get-incident.close_notes}}\nResolution: {{get-incident.resolution_notes}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: number
in: query
operations:
- name: get-incident
method: GET
- type: http
namespace: confluence
baseUri: "https://exxon.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: pages
path: "/content"
operations:
- name: create-page
method: POST
Creates and updates Confluence pages for refinery turnaround planning, pulling scope details from SAP Plant Maintenance and resource plans from Workday to maintain a living knowledge base.
naftiko: "0.5"
info:
label: "Confluence Turnaround Planning Knowledge Base"
description: "Creates and updates Confluence pages for refinery turnaround planning, pulling scope details from SAP Plant Maintenance and resource plans from Workday to maintain a living knowledge base."
tags:
- refining
- maintenance
- confluence
- sap
- workday
capability:
exposes:
- type: mcp
namespace: turnaround-kb
port: 8080
tools:
- name: update-turnaround-plan
description: "Given a turnaround project ID, pull SAP PM scope and Workday resource plan, then update the Confluence turnaround planning page."
inputParameters:
- name: project_id
in: body
type: string
description: "Turnaround project identifier."
- name: plant_code
in: body
type: string
description: "SAP plant code for the refinery."
steps:
- name: get-scope
type: call
call: sap.get-turnaround-scope
with:
project_id: "{{project_id}}"
plant_code: "{{plant_code}}"
- name: get-resources
type: call
call: workday.get-project-resources
with:
project_id: "{{project_id}}"
- name: update-page
type: call
call: confluence.update-page
with:
space: "TURNAROUND"
title: "TA-{{project_id}} Plan"
body: "Scope: {{get-scope.summary}} | Resources: {{get-resources.headcount}} team members"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: turnaround
path: "/A_MaintenanceOrder"
operations:
- name: get-turnaround-scope
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: project-resources
path: "/workers"
operations:
- name: get-project-resources
method: GET
- type: http
namespace: confluence
baseUri: "https://exxon.atlassian.net/wiki/rest/api"
authentication:
type: bearer
token: "$secrets.confluence_token"
resources:
- name: pages
path: "/content"
operations:
- name: update-page
method: PUT
When CrowdStrike detects a threat on a SCADA-adjacent endpoint, isolates the host, creates a ServiceNow security incident, and notifies the OT security team via Teams for immediate response.
naftiko: "0.5"
info:
label: "CrowdStrike Endpoint Threat Response for SCADA"
description: "When CrowdStrike detects a threat on a SCADA-adjacent endpoint, isolates the host, creates a ServiceNow security incident, and notifies the OT security team via Teams for immediate response."
tags:
- safety
- security
- crowdstrike
- servicenow
- msteams
- ot
capability:
exposes:
- type: mcp
namespace: scada-threat
port: 8080
tools:
- name: respond-to-scada-threat
description: "Given a CrowdStrike detection ID, isolate the endpoint, create a ServiceNow security incident, and notify OT security team."
inputParameters:
- name: detection_id
in: body
type: string
description: "CrowdStrike detection ID."
- name: hostname
in: body
type: string
description: "Hostname of the affected endpoint."
steps:
- name: isolate-host
type: call
call: crowdstrike.contain-host
with:
hostname: "{{hostname}}"
- name: create-incident
type: call
call: servicenow.create-security-incident
with:
hostname: "{{hostname}}"
detection_id: "{{detection_id}}"
category: "ot_security"
- name: notify-ot-security
type: call
call: msteams.send-message
with:
channel: "ot-security"
text: "SCADA THREAT | Host: {{hostname}} isolated | Detection: {{detection_id}} | INC: {{create-incident.number}} | Immediate review required"
consumes:
- type: http
namespace: crowdstrike
baseUri: "https://api.crowdstrike.com"
authentication:
type: bearer
token: "$secrets.crowdstrike_token"
resources:
- name: hosts
path: "/devices/entities/host-actions/v2"
operations:
- name: contain-host
method: POST
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: security-incidents
path: "/table/sn_si_incident"
operations:
- name: create-security-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/security/channels/ot/messages"
operations:
- name: send-message
method: POST
Pulls compressor station telemetry from Datadog including vibration, temperature, and throughput metrics, and creates a SAP PM notification if readings exceed thresholds.
naftiko: "0.5"
info:
label: "Datadog Compressor Station Health Check"
description: "Pulls compressor station telemetry from Datadog including vibration, temperature, and throughput metrics, and creates a SAP PM notification if readings exceed thresholds."
tags:
- upstream
- maintenance
- datadog
- sap
capability:
exposes:
- type: mcp
namespace: compressor-health
port: 8080
tools:
- name: check-compressor-health
description: "Given a Datadog host tag for a compressor station, pull health metrics and create a SAP PM notification if thresholds are exceeded."
inputParameters:
- name: host_tag
in: body
type: string
description: "Datadog host tag for the compressor station."
steps:
- name: get-metrics
type: call
call: datadog.query-metrics
with:
host_tag: "{{host_tag}}"
metrics: "vibration,temperature,throughput"
- name: create-notification
type: call
call: sap.create-pm-notification
with:
equipment: "{{host_tag}}"
description: "Health check alert: {{get-metrics.summary}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "$secrets.datadog_api_key"
resources:
- name: metrics
path: "/query"
operations:
- name: query-metrics
method: GET
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_NOTIFICATION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: notifications
path: "/A_MaintenanceNotification"
operations:
- name: create-pm-notification
method: POST
Queries Datadog for SLO compliance across E&P production infrastructure, aggregates in Snowflake, and posts a weekly compliance digest to the IT operations Teams channel.
naftiko: "0.5"
info:
label: "Datadog Infrastructure SLO Report"
description: "Queries Datadog for SLO compliance across E&P production infrastructure, aggregates in Snowflake, and posts a weekly compliance digest to the IT operations Teams channel."
tags:
- observability
- slo
- datadog
- snowflake
- msteams
- reporting
capability:
exposes:
- type: mcp
namespace: slo-ops
port: 8080
tools:
- name: report-slo-compliance
description: "Given a service tag and evaluation window, fetch SLO statuses from Datadog, write compliance metrics to Snowflake, and post a Teams digest if any SLOs are at risk. Use weekly for reliability reviews."
inputParameters:
- name: service_tag
in: body
type: string
description: "Datadog service tag to filter (e.g., service:upstream-operations-api)."
- name: time_window
in: body
type: string
description: "Evaluation window: 7d, 30d, or 90d."
steps:
- name: get-slo-status
type: call
call: datadog.list-slos
with:
tags: "{{service_tag}}"
time_window: "{{time_window}}"
- name: write-compliance
type: call
call: snowflake.insert-slo-row
with:
service_tag: "{{service_tag}}"
time_window: "{{time_window}}"
at_risk_count: "{{get-slo-status.at_risk_count}}"
- name: post-digest
type: call
call: msteams.send-message
with:
channel: "it-operations"
text: "SLO Report ({{time_window}}) | {{service_tag}}: {{get-slo-status.at_risk_count}} SLOs at risk."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: slos
path: "/slo"
inputParameters:
- name: tags
in: query
- name: time_window
in: query
operations:
- name: list-slos
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: slo-table
path: "/statements"
operations:
- name: insert-slo-row
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/it/channels/operations/messages"
operations:
- name: send-message
method: POST
When Datadog detects a refinery process alarm threshold breach, logs the event in Snowflake, creates a ServiceNow incident, and notifies the refinery operations team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Datadog Refinery Process Alarm Handler"
description: "When Datadog detects a refinery process alarm threshold breach, logs the event in Snowflake, creates a ServiceNow incident, and notifies the refinery operations team via Microsoft Teams."
tags:
- refining
- safety
- datadog
- snowflake
- servicenow
- msteams
capability:
exposes:
- type: mcp
namespace: refinery-alarm
port: 8080
tools:
- name: handle-refinery-alarm
description: "Given a Datadog monitor ID and alarm severity, retrieve alarm details, log in Snowflake, create a ServiceNow incident, and alert the refinery ops team in Teams."
inputParameters:
- name: monitor_id
in: body
type: string
description: "Datadog monitor ID that triggered the refinery process alarm."
- name: severity
in: body
type: string
description: "Alarm severity level: critical, high, medium, low."
steps:
- name: get-alarm-details
type: call
call: datadog.get-monitor-state
with:
monitor_id: "{{monitor_id}}"
- name: log-alarm
type: call
call: snowflake.insert-alarm-record
with:
monitor_id: "{{monitor_id}}"
severity: "{{severity}}"
message: "{{get-alarm-details.message}}"
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "Refinery alarm: {{get-alarm-details.name}} - {{severity}}"
urgency: "1"
category: "refinery_safety"
- name: notify-ops
type: call
call: msteams.send-message
with:
channel: "refinery-operations"
text: "Refinery alarm triggered | Monitor: {{get-alarm-details.name}} | Severity: {{severity}} | INC: {{create-incident.number}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "$secrets.datadog_api_key"
resources:
- name: monitors
path: "/monitor/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor-state
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: alarm-records
path: "/statements"
operations:
- name: insert-alarm-record
method: POST
- type: http
namespace: servicenow
baseUri: "https://exxon.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.msteams_token"
resources:
- name: channel-messages
path: "/teams/operations/channels/refinery/messages"
operations:
- name: send-message
method: POST
Routes joint venture operating agreements through DocuSign for signature, tracks completion status, and logs the executed agreement in SharePoint for records management.
naftiko: "0.5"
info:
label: "DocuSign Joint Venture Agreement Routing"
description: "Routes joint venture operating agreements through DocuSign for signature, tracks completion status, and logs the executed agreement in SharePoint for records management."
tags:
- upstream
- legal
- docusign
- sharepoint
capability:
exposes:
- type: mcp
namespace: jv-agreement
port: 8080
tools:
- name: route-jv-agreement
description: "Given an agreement document and signer list, create a DocuSign envelope and log in SharePoint upon completion."
inputParameters:
- name: agreement_title
in: body
type: string
description: "Title of the joint venture agreement."
- name: signers
in: body
type: string
description: "Comma-separated list of signer email addresses."
steps:
- name: create-envelope
type: call
call: docusign.create-envelope
with:
title: "{{agreement_title}}"
signers: "{{signers}}"
- name: log-agreement
type: call
call: sharepoint.upload-document
with:
library: "JV-Agreements"
filename: "{{agreement_title}}"
envelope_id: "{{create-envelope.envelope_id}}"
consumes:
- type: http
namespace: docusign
baseUri: "https://na4.docusign.net/restapi/v2.1"
authentication:
type: bearer
token: "$secrets.docusign_token"
resources:
- name: envelopes
path: "/accounts/exxon/envelopes"
operations:
- name: create-envelope
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0/sites/exxon.sharepoint.com"
authentication:
type: bearer
token: "$secrets.sharepoint_token"
resources:
- name: documents
path: "/drive/root:/JV-Agreements"
operations:
- name: upload-document
method: PUT
On confirmed Workday termination, disables the Microsoft 365 account, revokes GitHub organization access, and creates a ServiceNow offboarding checklist ticket.
naftiko: "0.5"
info:
label: "Employee Offboarding"
description: "On confirmed Workday termination, disables the Microsoft 365 account, revokes GitHub organization access, and creates a ServiceNow offboarding checklist ticket."
tags:
- hr
- offboarding
- workday
- microsoft-365
- github
- servicenow
- identity
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID and termination date, disable Microsoft 365 account, remove GitHub org membership, and open a ServiceNow IT offboarding ticket. Use on confirmed Workday termination events."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "Workday worker ID of the departing employee."
- name: termination_date
in: body
type: string
description: "Effective termination date in ISO 8601 format (YYYY-MM-DD)."
steps:
- name: get-worker
type: call
call: workday.get-worker
with:
worker_id: "{{workday_employee_id}}"
- name: disable-m365
type: call
call: msgraph.disable-user
with:
user_id: "{{get-worker.email}}"
- name: remove-github-access
type: call
call: github.remove-org-member
with:
org: "exxonmobil"
username: "{{get-worker.github_username}}"
- name: open-offboarding-ticket
type: call
call: servicenow.create-incident
with:
short_description: "Offboarding: {{get-worker.full_name}} — {{termination_date}}"
category: "offboarding"
assignment_group: "IT_Security"
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: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: disable-user
method: PATCH
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: org-members
path: "/orgs/{{org}}/members/{{username}}"
inputParameters:
- name: org
in: path
- name: username
in: path
operations:
- name: remove-org-member
method: DELETE
- type: http
namespace: servicenow
baseUri: "https://exxon.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
Triggers a GitHub Actions workflow to deploy OPC-UA gateway firmware to field edge devices, verifies deployment status, and logs results in ServiceNow for change management compliance.
naftiko: "0.5"
info:
label: "GitHub Actions OPC-UA Gateway Deployment"
description: "Triggers a GitHub Actions workflow to deploy OPC-UA gateway firmware to field edge devices, verifies deployment status, and logs results in ServiceNow for change management compliance."
tags:
- ot
- devops
- github
- servicenow
- upstream
capability:
exposes:
- type: mcp
namespace: opcua-deploy
port: 8080
tools:
- name: deploy-opcua-gateway
description: "Given a firmware version and target device group, trigger GitHub Actions deployment, verify status, and log in ServiceNow."
inputParameters:
- name: firmware_version
in: body
type: string
description: "Firmware version to deploy (e.g., v2.4.1)."
- name: device_group
in: body
type: string
description: "Target device group (e.g., permian-edge-gateways)."
- name: change_request_id
in: body
type: string
description: "ServiceNow change request number."
steps:
- name: trigger-deployment
type: call
call: github.trigger-workflow
with:
repo: "exxon/opcua-gateway"
workflow: "deploy.yml"
ref: "{{firmware_version}}"
inputs: "{{device_group}}"
- name: log-deployment
type: call
call: servicenow.update-change-request
with:
change_request_id: "{{change_request_id}}"
status: "implemented"
notes: "OPC-UA gateway {{firmware_version}} deployed to {{device_group}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflows
path: "/repos/exxon/opcua-gateway/actions/workflows/deploy.yml/dispatches"
operations:
- name: trigger-workflow
method: POST
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: update-change-request
method: PATCH
On a GitHub Actions pipeline failure on a main branch in a digital or data engineering repository, creates a Jira bug, posts a Datadog event, and alerts the engineering team via Teams.
naftiko: "0.5"
info:
label: "GitHub CI/CD Pipeline Failure Response"
description: "On a GitHub Actions pipeline failure on a main branch in a digital or data engineering repository, creates a Jira bug, posts a Datadog event, and alerts the engineering team via Teams."
tags:
- devops
- ci-cd
- github
- jira
- datadog
- msteams
capability:
exposes:
- type: mcp
namespace: cicd-ops
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub repository, run ID, branch, and commit SHA, fetch run details, open a Jira bug, post a Datadog event, and alert the engineering channel in Teams."
inputParameters:
- name: repo_full_name
in: body
type: string
description: "GitHub repository full name (e.g., exxonmobil/downstream-api)."
- name: run_id
in: body
type: string
description: "GitHub Actions workflow run ID."
- name: branch
in: body
type: string
description: "Branch where the failure occurred."
- name: commit_sha
in: body
type: string
description: "Commit SHA of the failing run."
steps:
- name: get-run
type: call
call: github.get-workflow-run
with:
repo: "{{repo_full_name}}"
run_id: "{{run_id}}"
- name: create-bug
type: call
call: jira.create-issue
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repo_full_name}} / {{branch}}"
description: "Run: {{run_id}}\nBranch: {{branch}}\nCommit: {{commit_sha}}\nConclusion: {{get-run.conclusion}}"
- name: post-event
type: call
call: datadog.create-event
with:
title: "CI Failure: {{repo_full_name}}"
text: "Branch {{branch}} run {{run_id}} failed on commit {{commit_sha}}"
alert_type: "error"
tags: "repo:{{repo_full_name}},branch:{{branch}}"
- name: alert-engineering
type: call
call: msteams.send-message
with:
channel: "engineering-alerts"
text: "Pipeline failure: {{repo_full_name}} | Branch: {{branch}} | Jira: {{create-bug.key}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-runs
path: "/repos/{{repo}}/actions/runs/{{run_id}}"
inputParameters:
- name: repo
in: path
- name: run_id
in: path
operations:
- name: get-workflow-run
method: GET
- type: http
namespace: jira
baseUri: "https://exxon.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: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/engineering/channels/alerts/messages"
operations:
- name: send-message
method: POST
Scans ExxonMobil GitHub organization repositories for critical Dependabot alerts, creates Jira security issues, and notifies the cybersecurity team via Teams.
naftiko: "0.5"
info:
label: "GitHub Security Vulnerability Triage"
description: "Scans ExxonMobil GitHub organization repositories for critical Dependabot alerts, creates Jira security issues, and notifies the cybersecurity team via Teams."
tags:
- security
- devops
- github
- jira
- msteams
- vulnerability-management
capability:
exposes:
- type: mcp
namespace: cyber-security
port: 8080
tools:
- name: triage-dependabot-alerts
description: "Given a GitHub organization and severity level, list open Dependabot vulnerability alerts, create a Jira security issue for findings, and post to the cybersecurity Teams channel. Use for weekly security hygiene reviews."
inputParameters:
- name: github_org
in: body
type: string
description: "GitHub organization name to scan (e.g., exxonmobil)."
- name: severity
in: body
type: string
description: "Minimum alert severity: critical, high, medium, or low."
steps:
- name: list-alerts
type: call
call: github.list-dependabot-alerts
with:
org: "{{github_org}}"
severity: "{{severity}}"
- name: create-security-issue
type: call
call: jira.create-issue
with:
project_key: "CYBER"
issuetype: "Security Vulnerability"
summary: "Dependabot {{severity}} alerts in {{github_org}}: {{list-alerts.alert_count}} findings"
description: "Repos: {{list-alerts.repo_names}}. Packages: {{list-alerts.package_names}}"
- name: notify-cybersecurity
type: call
call: msteams.send-message
with:
channel: "cybersecurity-ops"
text: "Dependabot triage: {{list-alerts.alert_count}} {{severity}} alerts | {{github_org}} | Jira: {{create-security-issue.key}}"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: dependabot-alerts
path: "/orgs/{{org}}/dependabot/alerts"
inputParameters:
- name: org
in: path
- name: severity
in: query
operations:
- name: list-dependabot-alerts
method: GET
- type: http
namespace: jira
baseUri: "https://exxon.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.msteams_token"
resources:
- name: channel-messages
path: "/teams/security/channels/ops/messages"
operations:
- name: send-message
method: POST
Pulls active drilling project issues from Jira, aggregates status by well pad, and posts a daily digest to the drilling operations Teams channel with blockers highlighted.
naftiko: "0.5"
info:
label: "Jira Drilling Project Status Digest"
description: "Pulls active drilling project issues from Jira, aggregates status by well pad, and posts a daily digest to the drilling operations Teams channel with blockers highlighted."
tags:
- upstream
- drilling
- jira
- msteams
capability:
exposes:
- type: mcp
namespace: drilling-digest
port: 8080
tools:
- name: generate-drilling-digest
description: "Given a Jira project key for drilling operations, compile a status digest of active issues and post to the drilling ops Teams channel."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key for the drilling program (e.g., DRILL)."
steps:
- name: get-issues
type: call
call: jira.search-issues
with:
project_key: "{{project_key}}"
status: "In Progress,Blocked"
- name: post-digest
type: call
call: msteams.send-message
with:
channel: "drilling-operations"
text: "Drilling Digest | Active: {{get-issues.in_progress_count}} | Blocked: {{get-issues.blocked_count}} | Top blocker: {{get-issues.top_blocker}}"
consumes:
- type: http
namespace: jira
baseUri: "https://exxon.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: search
path: "/search"
operations:
- name: search-issues
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/drilling/channels/operations/messages"
operations:
- name: send-message
method: POST
Fetches Jira sprint completion data for engineering teams, writes velocity metrics to Snowflake, and triggers a Power BI engineering performance dashboard refresh.
naftiko: "0.5"
info:
label: "Jira Engineering Sprint Velocity Report"
description: "Fetches Jira sprint completion data for engineering teams, writes velocity metrics to Snowflake, and triggers a Power BI engineering performance dashboard refresh."
tags:
- devops
- agile
- jira
- snowflake
- power-bi
- reporting
capability:
exposes:
- type: mcp
namespace: sprint-reporting
port: 8080
tools:
- name: publish-sprint-velocity
description: "Given a Jira project key and sprint ID, fetch completed story points and issues, write to Snowflake, and trigger a Power BI engineering dashboard refresh for leadership review."
inputParameters:
- name: jira_project_key
in: body
type: string
description: "Jira project key (e.g., DIG, API)."
- name: sprint_id
in: body
type: integer
description: "Jira sprint ID to analyze."
steps:
- name: get-sprint-data
type: call
call: jira.get-sprint
with:
sprint_id: "{{sprint_id}}"
- name: write-velocity
type: call
call: snowflake.insert-velocity-row
with:
project_key: "{{jira_project_key}}"
sprint_id: "{{sprint_id}}"
completed_points: "{{get-sprint-data.completedPoints}}"
- name: refresh-powerbi
type: call
call: powerbi.trigger-refresh
with:
dataset_id: "$secrets.powerbi_engineering_dataset_id"
consumes:
- type: http
namespace: jira
baseUri: "https://exxon.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: sprints
path: "/sprint/{{sprint_id}}"
inputParameters:
- name: sprint_id
in: path
operations:
- name: get-sprint
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: velocity-table
path: "/statements"
operations:
- name: insert-velocity-row
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
Fetches ExxonMobil LinkedIn company page engagement metrics, aggregates in Snowflake, and sends a weekly digest to the corporate communications team via Teams.
naftiko: "0.5"
info:
label: "LinkedIn Employer Brand Performance Digest"
description: "Fetches ExxonMobil LinkedIn company page engagement metrics, aggregates in Snowflake, and sends a weekly digest to the corporate communications team via Teams."
tags:
- marketing
- social
- linkedin
- snowflake
- msteams
- reporting
capability:
exposes:
- type: mcp
namespace: brand-reporting
port: 8080
tools:
- name: digest-linkedin-brand
description: "Given a LinkedIn organization ID and a date range, fetch post engagement and follower stats, write to Snowflake, and post a Teams digest to the corporate communications channel."
inputParameters:
- name: organization_id
in: body
type: string
description: "LinkedIn organization ID (URN) for the ExxonMobil company page."
- name: start_date
in: body
type: string
description: "Report start date in ISO 8601 format (YYYY-MM-DD)."
- name: end_date
in: body
type: string
description: "Report end date in ISO 8601 format (YYYY-MM-DD)."
steps:
- name: get-engagement-stats
type: call
call: linkedin.get-share-statistics
with:
organization_id: "{{organization_id}}"
start: "{{start_date}}"
end: "{{end_date}}"
- name: write-stats
type: call
call: snowflake.insert-social-row
with:
platform: "linkedin"
impressions: "{{get-engagement-stats.totalImpressions}}"
engagements: "{{get-engagement-stats.totalEngagements}}"
start_date: "{{start_date}}"
- name: send-digest
type: call
call: msteams.send-message
with:
channel: "corporate-comms"
text: "LinkedIn Brand ({{start_date}} to {{end_date}}): {{get-engagement-stats.totalImpressions}} impressions, {{get-engagement-stats.totalEngagements}} engagements."
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: share-statistics
path: "/organizationalEntityShareStatistics"
inputParameters:
- name: organization_id
in: query
- name: start
in: query
- name: end
in: query
operations:
- name: get-share-statistics
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: social-stats
path: "/statements"
operations:
- name: insert-social-row
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/comms/channels/corporate/messages"
operations:
- name: send-message
method: POST
When a new hire record is created in Workday, provisions a Microsoft 365 account, opens a ServiceNow IT onboarding ticket, and sends a Teams welcome message to the new hire and their manager.
naftiko: "0.5"
info:
label: "New Employee Onboarding"
description: "When a new hire record is created in Workday, provisions a Microsoft 365 account, opens a ServiceNow IT onboarding ticket, and sends a Teams welcome message to the new hire and their manager."
tags:
- hr
- onboarding
- workday
- microsoft-365
- servicenow
- msteams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-employee-onboarding
description: "Given a Workday employee ID and start date, provision a Microsoft 365 account, create a ServiceNow IT onboarding incident, and send a Teams welcome message. Use on new hire creation events in Workday."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "Employee start date in ISO 8601 format (YYYY-MM-DD)."
steps:
- name: get-worker
type: call
call: workday.get-worker
with:
worker_id: "{{workday_employee_id}}"
- name: provision-m365
type: call
call: msgraph.create-user
with:
displayName: "{{get-worker.full_name}}"
userPrincipalName: "{{get-worker.email}}"
department: "{{get-worker.department}}"
- name: open-ticket
type: call
call: servicenow.create-incident
with:
short_description: "IT Onboarding: {{get-worker.full_name}} — start {{start_date}}"
category: "onboarding"
assignment_group: "IT_Onboarding"
- name: send-welcome
type: call
call: msteams.send-message
with:
channel: "hr-announcements"
text: "Welcome {{get-worker.full_name}} to ExxonMobil! Start: {{start_date}}. IT ticket: {{open-ticket.number}}"
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: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: servicenow
baseUri: "https://exxon.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.msteams_token"
resources:
- name: channel-messages
path: "/teams/hr/channels/announcements/messages"
operations:
- name: send-message
method: POST
Performs a quarterly privileged access review for operational technology systems by pulling user assignments from Okta, cross-referencing active employees in Workday, and generating a compliance report in ServiceNow.
naftiko: "0.5"
info:
label: "Okta Privileged Access Review for OT Systems"
description: "Performs a quarterly privileged access review for operational technology systems by pulling user assignments from Okta, cross-referencing active employees in Workday, and generating a compliance report in ServiceNow."
tags:
- safety
- security
- okta
- workday
- servicenow
- ot
capability:
exposes:
- type: mcp
namespace: ot-access-review
port: 8080
tools:
- name: review-ot-access
description: "Given an Okta application ID for an OT system, pull privileged users, verify active status in Workday, and log findings in ServiceNow."
inputParameters:
- name: app_id
in: body
type: string
description: "Okta application ID for the OT system."
steps:
- name: get-privileged-users
type: call
call: okta.get-app-users
with:
app_id: "{{app_id}}"
- name: verify-employment
type: call
call: workday.verify-active-employees
with:
user_list: "{{get-privileged-users.users}}"
- name: log-findings
type: call
call: servicenow.create-audit-record
with:
app_id: "{{app_id}}"
total_users: "{{get-privileged-users.count}}"
inactive_users: "{{verify-employment.inactive_count}}"
consumes:
- type: http
namespace: okta
baseUri: "https://exxon.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_token"
resources:
- name: app-users
path: "/apps/{{app_id}}/users"
inputParameters:
- name: app_id
in: path
operations:
- name: get-app-users
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"
operations:
- name: verify-active-employees
method: GET
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: audit-records
path: "/table/u_access_review"
operations:
- name: create-audit-record
method: POST
Aggregates daily production data from Snowflake and triggers a Power BI energy production dashboard refresh for E&P operations leadership.
naftiko: "0.5"
info:
label: "Power BI Energy Production Dashboard Refresh"
description: "Aggregates daily production data from Snowflake and triggers a Power BI energy production dashboard refresh for E&P operations leadership."
tags:
- oil-gas
- analytics
- reporting
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: production-reporting
port: 8080
tools:
- name: refresh-production-dashboard
description: "Given a reporting date and business unit, insert the daily production summary into Snowflake and trigger a Power BI dataset refresh for E&P leadership. Use for daily operational reporting."
inputParameters:
- name: report_date
in: body
type: string
description: "Reporting date in ISO 8601 format (YYYY-MM-DD)."
- name: business_unit
in: body
type: string
description: "Business unit identifier (e.g., UPSTREAM, DOWNSTREAM, CHEMICAL)."
steps:
- name: write-summary
type: call
call: snowflake.insert-production-summary
with:
report_date: "{{report_date}}"
business_unit: "{{business_unit}}"
- name: refresh-dashboard
type: call
call: powerbi.trigger-refresh
with:
dataset_id: "$secrets.powerbi_production_dataset_id"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: production-table
path: "/statements"
operations:
- name: insert-production-summary
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
When Datadog detects a critical SCADA or process control anomaly, creates a P1 ServiceNow incident, pages the on-call operations team, and opens a Jira tracking issue for root-cause analysis.
naftiko: "0.5"
info:
label: "Production Operations Incident Response"
description: "When Datadog detects a critical SCADA or process control anomaly, creates a P1 ServiceNow incident, pages the on-call operations team, and opens a Jira tracking issue for root-cause analysis."
tags:
- oil-gas
- ot
- incident-response
- datadog
- servicenow
- jira
- msteams
capability:
exposes:
- type: mcp
namespace: production-ops
port: 8080
tools:
- name: handle-production-incident
description: "Given a Datadog alert ID, affected facility, and severity, create a ServiceNow P1 incident, open a Jira tracking issue, and alert the production operations channel in Teams."
inputParameters:
- name: datadog_alert_id
in: body
type: string
description: "Datadog monitor alert ID from the SCADA or process control integration."
- name: facility_id
in: body
type: string
description: "Facility or asset identifier where the anomaly was detected (e.g., PERMIAN-COMPLEX-A)."
- name: severity
in: body
type: string
description: "Incident severity: P1, P2, or P3."
steps:
- name: get-alert-details
type: call
call: datadog.get-monitor
with:
alert_id: "{{datadog_alert_id}}"
- name: create-incident
type: call
call: servicenow.create-incident
with:
short_description: "[{{severity}}] Production anomaly: {{facility_id}}"
urgency: "1"
impact: "1"
description: "Datadog alert {{datadog_alert_id}}: {{get-alert-details.message}}. Facility: {{facility_id}}"
- name: create-jira-issue
type: call
call: jira.create-issue
with:
project_key: "OPS"
issuetype: "Bug"
summary: "[{{severity}}] Production anomaly at {{facility_id}}"
description: "Incident: {{create-incident.number}} | Alert: {{datadog_alert_id}} | Details: {{get-alert-details.message}}"
- name: alert-ops-team
type: call
call: msteams.send-message
with:
channel: "production-operations"
text: "INCIDENT {{create-incident.number}} | {{severity}} | Facility: {{facility_id}} | Jira: {{create-jira-issue.key}}"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{{alert_id}}"
inputParameters:
- name: alert_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: servicenow
baseUri: "https://exxon.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: jira
baseUri: "https://exxon.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.msteams_token"
resources:
- name: channel-messages
path: "/teams/operations/channels/production/messages"
operations:
- name: send-message
method: POST
Periodically checks Salesforce customer accounts for open cases, stalled opportunities, and missing contacts, and generates a health summary report via Teams for the account management team.
naftiko: "0.5"
info:
label: "Salesforce Customer Account Health Check"
description: "Periodically checks Salesforce customer accounts for open cases, stalled opportunities, and missing contacts, and generates a health summary report via Teams for the account management team."
tags:
- sales
- crm
- salesforce
- msteams
- reporting
- account-management
capability:
exposes:
- type: mcp
namespace: account-health
port: 8080
tools:
- name: check-account-health
description: "Given a Salesforce account ID, fetch open case count, active opportunity pipeline, and last activity date, then post a health summary to the account-management Teams channel."
inputParameters:
- name: salesforce_account_id
in: body
type: string
description: "Salesforce account ID to evaluate."
steps:
- name: get-account
type: call
call: salesforce.get-account
with:
account_id: "{{salesforce_account_id}}"
- name: get-open-cases
type: call
call: salesforce-cases.list-open-cases
with:
account_id: "{{salesforce_account_id}}"
- name: post-summary
type: call
call: msteams.send-message
with:
channel: "account-management"
text: "Account health: {{get-account.name}} | Open cases: {{get-open-cases.count}} | Last activity: {{get-account.last_activity_date}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: salesforce-cases
baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/query"
inputParameters:
- name: account_id
in: query
operations:
- name: list-open-cases
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/sales/channels/account-mgmt/messages"
operations:
- name: send-message
method: POST
Queries Salesforce for energy supply contracts approaching renewal, creates follow-up tasks for the account team, and sends a summary digest to the commercial operations channel in Teams.
naftiko: "0.5"
info:
label: "Salesforce Energy Contract Renewal Tracker"
description: "Queries Salesforce for energy supply contracts approaching renewal, creates follow-up tasks for the account team, and sends a summary digest to the commercial operations channel in Teams."
tags:
- trading
- salesforce
- msteams
- downstream
capability:
exposes:
- type: mcp
namespace: contract-renewal
port: 8080
tools:
- name: track-contract-renewals
description: "Given a number of days until expiry, find all energy contracts in Salesforce approaching renewal, create tasks, and notify commercial ops via Teams."
inputParameters:
- name: days_until_expiry
in: body
type: number
description: "Number of days before contract expiry to flag (e.g., 90)."
steps:
- name: find-expiring-contracts
type: call
call: salesforce.query-contracts
with:
days_until_expiry: "{{days_until_expiry}}"
- name: create-tasks
type: call
call: salesforce.create-renewal-tasks
with:
contracts: "{{find-expiring-contracts.records}}"
- name: notify-commercial
type: call
call: msteams.send-message
with:
channel: "commercial-operations"
text: "Contract renewal digest | {{find-expiring-contracts.total_count}} contracts expiring within {{days_until_expiry}} days | Tasks created: {{create-tasks.count}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: contracts
path: "/query"
operations:
- name: query-contracts
method: GET
- name: tasks
path: "/sobjects/Task"
operations:
- name: create-renewal-tasks
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/commercial/channels/operations/messages"
operations:
- name: send-message
method: POST
Looks up a fuel card customer account in Salesforce, returning card status, credit limit, recent transactions, and loyalty points balance for retail customer service.
naftiko: "0.5"
info:
label: "Salesforce Fuel Card Customer Inquiry"
description: "Looks up a fuel card customer account in Salesforce, returning card status, credit limit, recent transactions, and loyalty points balance for retail customer service."
tags:
- downstream
- retail
- salesforce
capability:
exposes:
- type: mcp
namespace: fuel-card
port: 8080
tools:
- name: lookup-fuel-card
description: "Look up fuel card customer by account number or card number. Returns account status, credit limit, last transactions, and loyalty balance."
inputParameters:
- name: card_number
in: body
type: string
description: "Fuel card number or customer account number."
call: salesforce.get-fuel-card-account
with:
card_number: "{{card_number}}"
outputParameters:
- name: status
type: string
mapping: "$.records[0].Status__c"
- name: credit_limit
type: number
mapping: "$.records[0].Credit_Limit__c"
- name: loyalty_points
type: number
mapping: "$.records[0].Loyalty_Points__c"
consumes:
- type: http
namespace: salesforce
baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/query"
operations:
- name: get-fuel-card-account
method: GET
Exports open and committed Salesforce opportunities for the current fiscal quarter, writes forecast data to Snowflake, and triggers a Power BI quarterly revenue dashboard refresh.
naftiko: "0.5"
info:
label: "Salesforce Quarterly Revenue Forecast Sync"
description: "Exports open and committed Salesforce opportunities for the current fiscal quarter, writes forecast data to Snowflake, and triggers a Power BI quarterly revenue dashboard refresh."
tags:
- sales
- finance
- forecasting
- salesforce
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: revenue-forecast
port: 8080
tools:
- name: sync-revenue-forecast
description: "Given a fiscal quarter label, export pipeline opportunities from Salesforce, write to Snowflake, and trigger a Power BI refresh for quarterly business reviews."
inputParameters:
- name: fiscal_quarter
in: body
type: string
description: "Salesforce fiscal quarter label (e.g., Q2-2026)."
steps:
- name: export-opportunities
type: call
call: salesforce.query-pipeline
with:
fiscal_quarter: "{{fiscal_quarter}}"
- name: write-forecast
type: call
call: snowflake.insert-forecast
with:
fiscal_quarter: "{{fiscal_quarter}}"
records: "{{export-opportunities.records}}"
- name: refresh-powerbi
type: call
call: powerbi.trigger-refresh
with:
dataset_id: "$secrets.powerbi_forecast_dataset_id"
consumes:
- type: http
namespace: salesforce
baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: pipeline
path: "/query"
inputParameters:
- name: fiscal_quarter
in: query
operations:
- name: query-pipeline
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: forecast-table
path: "/statements"
operations:
- name: insert-forecast
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
Performs a credit review for wholesale fuel customers by pulling account data from Salesforce, checking payment history in SAP, and generating a risk assessment stored in Snowflake.
naftiko: "0.5"
info:
label: "Salesforce Wholesale Customer Credit Review"
description: "Performs a credit review for wholesale fuel customers by pulling account data from Salesforce, checking payment history in SAP, and generating a risk assessment stored in Snowflake."
tags:
- downstream
- finance
- salesforce
- sap
- snowflake
capability:
exposes:
- type: mcp
namespace: credit-review
port: 8080
tools:
- name: review-customer-credit
description: "Given a Salesforce account ID, pull account details, check SAP payment history, and log risk assessment in Snowflake."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account ID for the wholesale customer."
steps:
- name: get-account
type: call
call: salesforce.get-account
with:
account_id: "{{account_id}}"
- name: get-payment-history
type: call
call: sap.get-ar-aging
with:
customer_number: "{{get-account.sap_customer_number}}"
- name: log-assessment
type: call
call: snowflake.insert-credit-assessment
with:
account_id: "{{account_id}}"
aging_balance: "{{get-payment-history.total_overdue}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/FI_AR_AGING_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: ar-aging
path: "/A_AccountReceivable"
operations:
- name: get-ar-aging
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: credit-assessments
path: "/statements"
operations:
- name: insert-credit-assessment
method: POST
Pulls contract spend data from SAP Ariba for a given commodity category, compares against budgeted amounts in SAP, and generates a variance report in Snowflake.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Spend Analysis"
description: "Pulls contract spend data from SAP Ariba for a given commodity category, compares against budgeted amounts in SAP, and generates a variance report in Snowflake."
tags:
- procurement
- sap-ariba
- sap
- snowflake
capability:
exposes:
- type: mcp
namespace: contract-spend
port: 8080
tools:
- name: analyze-contract-spend
description: "Given a commodity category and fiscal period, pull Ariba spend, compare to SAP budget, and log variance to Snowflake."
inputParameters:
- name: commodity_category
in: body
type: string
description: "Commodity category code (e.g., drilling-services, chemicals)."
- name: fiscal_period
in: body
type: string
description: "Fiscal period (e.g., 2026-03)."
steps:
- name: get-ariba-spend
type: call
call: ariba.get-spend
with:
category: "{{commodity_category}}"
period: "{{fiscal_period}}"
- name: get-sap-budget
type: call
call: sap.get-budget
with:
category: "{{commodity_category}}"
period: "{{fiscal_period}}"
- name: log-variance
type: call
call: snowflake.insert-variance
with:
category: "{{commodity_category}}"
actual_spend: "{{get-ariba-spend.total}}"
budgeted: "{{get-sap-budget.amount}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://exxon.ariba.com/api/spend-visibility"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: spend
path: "/reports/spend"
operations:
- name: get-spend
method: GET
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/FI_BUDGET_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: budget
path: "/A_BudgetAllocation"
operations:
- name: get-budget
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: variance
path: "/statements"
operations:
- name: insert-variance
method: POST
Matches incoming supplier invoices in SAP Ariba to open SAP purchase orders, flags discrepancies beyond tolerance, and routes exceptions to the AP team via ServiceNow.
naftiko: "0.5"
info:
label: "SAP Ariba Supplier Invoice Matching"
description: "Matches incoming supplier invoices in SAP Ariba to open SAP purchase orders, flags discrepancies beyond tolerance, and routes exceptions to the AP team via ServiceNow."
tags:
- procurement
- finance
- sap-ariba
- sap
- servicenow
- invoice-matching
capability:
exposes:
- type: mcp
namespace: ap-invoice
port: 8080
tools:
- name: match-supplier-invoice
description: "Given an SAP Ariba invoice ID and SAP PO number, compare invoice amounts to PO values, flag discrepancies greater than 2%, and create a ServiceNow AP exception task for review."
inputParameters:
- name: ariba_invoice_id
in: body
type: string
description: "SAP Ariba invoice document ID."
- name: po_number
in: body
type: string
description: "SAP purchase order number to match against."
steps:
- name: get-invoice
type: call
call: ariba.get-invoice
with:
invoice_id: "{{ariba_invoice_id}}"
- name: get-po
type: call
call: sap.get-po-header
with:
po_number: "{{po_number}}"
- name: create-exception-task
type: call
call: servicenow.create-task
with:
short_description: "AP invoice exception: Ariba {{ariba_invoice_id}} vs PO {{po_number}}"
assignment_group: "AP_Team"
description: "Invoice amount: {{get-invoice.net_amount}}. PO amount: {{get-po.total_amount}}. Discrepancy requires review."
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/invoice/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: invoices
path: "/{{invoice_id}}"
inputParameters:
- name: invoice_id
in: path
operations:
- name: get-invoice
method: GET
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po-header
method: GET
- type: http
namespace: servicenow
baseUri: "https://exxon.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
Retrieves asphalt production batch data from SAP, returning batch grade, penetration test results, production date, and available inventory for downstream distribution.
naftiko: "0.5"
info:
label: "SAP Asphalt Production Batch Tracking"
description: "Retrieves asphalt production batch data from SAP, returning batch grade, penetration test results, production date, and available inventory for downstream distribution."
tags:
- downstream
- production
- sap
capability:
exposes:
- type: mcp
namespace: asphalt-batch
port: 8080
tools:
- name: get-asphalt-batch
description: "Look up asphalt batch by batch number. Returns grade, test results, production date, and available volume."
inputParameters:
- name: batch_number
in: body
type: string
description: "SAP batch number for the asphalt production lot."
call: sap.get-batch-details
with:
batch_number: "{{batch_number}}"
outputParameters:
- name: grade
type: string
mapping: "$.d.MaterialGrade"
- name: penetration_value
type: number
mapping: "$.d.PenetrationTest"
- name: available_tons
type: number
mapping: "$.d.AvailableQuantity"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_BATCH_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: batches
path: "/A_Batch('{{batch_number}}')"
inputParameters:
- name: batch_number
in: path
operations:
- name: get-batch-details
method: GET
Retrieves batch quality inspection results from SAP Quality Management for chemical plant production batches, returning test results, conformance status, and disposition.
naftiko: "0.5"
info:
label: "SAP Chemical Plant Batch Quality Check"
description: "Retrieves batch quality inspection results from SAP Quality Management for chemical plant production batches, returning test results, conformance status, and disposition."
tags:
- downstream
- quality
- sap
capability:
exposes:
- type: mcp
namespace: batch-quality
port: 8080
tools:
- name: get-batch-quality
description: "Look up quality inspection results by batch number. Returns test results, conformance status, and disposition decision."
inputParameters:
- name: batch_number
in: body
type: string
description: "SAP batch number for the production lot."
call: sap.get-inspection-lot
with:
batch_number: "{{batch_number}}"
outputParameters:
- name: conformance
type: string
mapping: "$.d.ConformanceStatus"
- name: disposition
type: string
mapping: "$.d.UsageDecision"
- name: test_results
type: string
mapping: "$.d.InspectionResults"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/QM_INSPECTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inspection-lots
path: "/A_InspectionLot(Batch='{{batch_number}}')"
inputParameters:
- name: batch_number
in: path
operations:
- name: get-inspection-lot
method: GET
Queries SAP Concur for expense reports pending approval beyond the policy threshold, and sends Teams reminders to the overdue approvers.
naftiko: "0.5"
info:
label: "SAP Concur Expense Approval Reminder"
description: "Queries SAP Concur for expense reports pending approval beyond the policy threshold, and sends Teams reminders to the overdue approvers."
tags:
- finance
- expense-management
- sap-concur
- msteams
- approval
capability:
exposes:
- type: mcp
namespace: expense-compliance
port: 8080
tools:
- name: remind-expense-approvers
description: "Fetch SAP Concur expense reports with pending approval status older than the specified number of business days, and send Teams reminders to each approver. Use for daily finance operations oversight."
inputParameters:
- name: pending_days_threshold
in: body
type: integer
description: "Business days an expense report can be pending before triggering a reminder (e.g., 5)."
steps:
- name: get-pending-reports
type: call
call: concur.get-pending-reports
with:
approval_status: "A_PEND"
- name: send-reminders
type: call
call: msteams.send-message
with:
channel: "finance-ops"
text: "Expense approval overdue: {{get-pending-reports.report_count}} reports pending over {{pending_days_threshold}} days. Approvers: {{get-pending-reports.approver_list}}"
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"
inputParameters:
- name: approval_status
in: query
operations:
- name: get-pending-reports
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/finance/channels/ops/messages"
operations:
- name: send-message
method: POST
Retrieves corrosion inhibitor injection rates from SAP for pipeline segments, returning current dosage, target rate, and compliance status.
naftiko: "0.5"
info:
label: "SAP Corrosion Inhibitor Injection Rate"
description: "Retrieves corrosion inhibitor injection rates from SAP for pipeline segments, returning current dosage, target rate, and compliance status."
tags:
- upstream
- safety
- sap
- maintenance
capability:
exposes:
- type: mcp
namespace: corrosion-inhibitor
port: 8080
tools:
- name: get-inhibitor-rate
description: "Look up corrosion inhibitor injection rate by pipeline equipment number. Returns current rate, target, and compliance."
inputParameters:
- name: equipment_number
in: body
type: string
description: "SAP equipment number for the injection point."
call: sap.get-inhibitor-data
with:
equipment_number: "{{equipment_number}}"
outputParameters:
- name: current_rate_ppm
type: number
mapping: "$.d.CurrentRate"
- name: target_rate_ppm
type: number
mapping: "$.d.TargetRate"
- name: compliant
type: boolean
mapping: "$.d.WithinSpec"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inhibitor-data
path: "/A_MeasurementDocument(Equipment='{{equipment_number}}')"
inputParameters:
- name: equipment_number
in: path
operations:
- name: get-inhibitor-data
method: GET
Retrieves the crude blending recipe from SAP for a given refinery run, returning feedstock grades, blend ratios, and target API gravity specifications.
naftiko: "0.5"
info:
label: "SAP Crude Blending Recipe Lookup"
description: "Retrieves the crude blending recipe from SAP for a given refinery run, returning feedstock grades, blend ratios, and target API gravity specifications."
tags:
- refining
- sap
- production
capability:
exposes:
- type: mcp
namespace: crude-blending
port: 8080
tools:
- name: get-blend-recipe
description: "Look up crude blending recipe by process order number. Returns feedstock grades, ratios, and target specifications."
inputParameters:
- name: process_order
in: body
type: string
description: "SAP process order number for the refinery run."
call: sap.get-recipe
with:
process_order: "{{process_order}}"
outputParameters:
- name: feedstocks
type: string
mapping: "$.d.FeedstockList"
- name: target_api
type: number
mapping: "$.d.TargetAPIGravity"
- name: target_sulfur_pct
type: number
mapping: "$.d.TargetSulfurContent"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PP_PROCESS_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: recipes
path: "/A_ProcessOrder('{{process_order}}')/to_Recipe"
inputParameters:
- name: process_order
in: path
operations:
- name: get-recipe
method: GET
Retrieves current crude oil inventory levels from SAP for a given storage terminal, returning tank volumes, product grades, and last measurement timestamps.
naftiko: "0.5"
info:
label: "SAP Crude Oil Inventory Lookup"
description: "Retrieves current crude oil inventory levels from SAP for a given storage terminal, returning tank volumes, product grades, and last measurement timestamps."
tags:
- upstream
- inventory
- sap
- supply-chain
capability:
exposes:
- type: mcp
namespace: crude-inventory
port: 8080
tools:
- name: get-crude-inventory
description: "Look up crude oil inventory by storage terminal ID. Returns tank volumes, product grades, and last measurement timestamps for upstream supply chain visibility."
inputParameters:
- name: terminal_id
in: body
type: string
description: "SAP plant code for the storage terminal (e.g., BAYTOWN-T01)."
call: sap.get-inventory
with:
terminal_id: "{{terminal_id}}"
outputParameters:
- name: total_volume_bbl
type: number
mapping: "$.d.TotalVolume"
- name: product_grade
type: string
mapping: "$.d.MaterialGrade"
- name: last_measured
type: string
mapping: "$.d.LastMeasurementDate"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inventory
path: "/A_MaterialStock(Plant='{{terminal_id}}')"
inputParameters:
- name: terminal_id
in: path
operations:
- name: get-inventory
method: GET
Retrieves demurrage claim data from SAP for marine terminal operations, returning vessel wait times, demurrage rates, and claim amounts for cost management.
naftiko: "0.5"
info:
label: "SAP Demurrage Claim Tracker"
description: "Retrieves demurrage claim data from SAP for marine terminal operations, returning vessel wait times, demurrage rates, and claim amounts for cost management."
tags:
- downstream
- trading
- sap
- logistics
capability:
exposes:
- type: mcp
namespace: demurrage
port: 8080
tools:
- name: get-demurrage-claim
description: "Look up demurrage claim by voyage number. Returns vessel wait time, rate, claim amount, and status."
inputParameters:
- name: voyage_number
in: body
type: string
description: "SAP voyage/shipment reference number."
call: sap.get-demurrage
with:
voyage_number: "{{voyage_number}}"
outputParameters:
- name: wait_hours
type: number
mapping: "$.d.WaitingHours"
- name: demurrage_rate
type: number
mapping: "$.d.DailyRate"
- name: claim_amount
type: number
mapping: "$.d.ClaimAmount"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: demurrage
path: "/A_DemurrageClaim('{{voyage_number}}')"
inputParameters:
- name: voyage_number
in: path
operations:
- name: get-demurrage
method: GET
Looks up the shipment status of a downstream petroleum product delivery in SAP Transportation Management, returning carrier, ETA, and delivery quantity.
naftiko: "0.5"
info:
label: "SAP Downstream Product Shipment Status"
description: "Looks up the shipment status of a downstream petroleum product delivery in SAP Transportation Management, returning carrier, ETA, and delivery quantity."
tags:
- downstream
- logistics
- sap
- supply-chain
capability:
exposes:
- type: mcp
namespace: shipment-status
port: 8080
tools:
- name: get-shipment-status
description: "Look up a downstream product shipment by delivery number. Returns carrier name, current status, ETA, and quantity in barrels."
inputParameters:
- name: delivery_number
in: body
type: string
description: "SAP delivery document number (e.g., 8000012345)."
call: sap.get-delivery
with:
delivery_number: "{{delivery_number}}"
outputParameters:
- name: carrier
type: string
mapping: "$.d.CarrierName"
- name: status
type: string
mapping: "$.d.OverallStatus"
- name: eta
type: string
mapping: "$.d.PlannedArrivalDate"
- name: quantity_bbl
type: number
mapping: "$.d.TotalQuantity"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_DELIVERY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: deliveries
path: "/A_OutboundDelivery('{{delivery_number}}')"
inputParameters:
- name: delivery_number
in: path
operations:
- name: get-delivery
method: GET
Creates preventive maintenance work orders in SAP for electrical substations at refinery and upstream facilities, scheduling transformer oil testing, relay calibration, and switchgear inspections.
naftiko: "0.5"
info:
label: "SAP Electrical Substation Preventive Maintenance"
description: "Creates preventive maintenance work orders in SAP for electrical substations at refinery and upstream facilities, scheduling transformer oil testing, relay calibration, and switchgear inspections."
tags:
- maintenance
- safety
- sap
- refining
capability:
exposes:
- type: mcp
namespace: substation-pm
port: 8080
tools:
- name: schedule-substation-pm
description: "Given a substation functional location and PM type, create a preventive maintenance work order in SAP."
inputParameters:
- name: functional_location
in: body
type: string
description: "SAP functional location for the electrical substation."
- name: pm_type
in: body
type: string
description: "PM type: transformer-oil-test, relay-calibration, switchgear-inspection."
steps:
- name: create-pm-order
type: call
call: sap.create-pm-work-order
with:
functional_location: "{{functional_location}}"
order_type: "PM01"
short_text: "Scheduled {{pm_type}} for substation {{functional_location}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel: "electrical-maintenance"
text: "PM scheduled | Substation: {{functional_location}} | Type: {{pm_type}} | WO: {{create-pm-order.order_number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: work-orders
path: "/A_MaintenanceOrder"
operations:
- name: create-pm-work-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/maintenance/channels/electrical/messages"
operations:
- name: send-message
method: POST
Retrieves flare gas recovery rates from SAP Plant Maintenance for a given refinery unit, returning recovery percentage, flare volume, and compliance status against regulatory limits.
naftiko: "0.5"
info:
label: "SAP Flare Gas Recovery Monitoring"
description: "Retrieves flare gas recovery rates from SAP Plant Maintenance for a given refinery unit, returning recovery percentage, flare volume, and compliance status against regulatory limits."
tags:
- environmental
- refining
- sap
- compliance
capability:
exposes:
- type: mcp
namespace: flare-recovery
port: 8080
tools:
- name: get-flare-recovery
description: "Look up flare gas recovery metrics by refinery unit. Returns recovery rate, flare volume, and regulatory compliance status."
inputParameters:
- name: unit_id
in: body
type: string
description: "SAP functional location for the refinery unit."
call: sap.get-flare-metrics
with:
unit_id: "{{unit_id}}"
outputParameters:
- name: recovery_pct
type: number
mapping: "$.d.RecoveryPercentage"
- name: flare_volume_mcf
type: number
mapping: "$.d.FlareVolume"
- name: compliant
type: boolean
mapping: "$.d.RegulatoryCompliant"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: flare-metrics
path: "/A_MeasurementDocument(FunctionalLocation='{{unit_id}}')"
inputParameters:
- name: unit_id
in: path
operations:
- name: get-flare-metrics
method: GET
Retrieves current fuel rack prices from SAP for gasoline, diesel, and jet fuel at specified terminals, returning posted price, effective date, and pricing zone.
naftiko: "0.5"
info:
label: "SAP Fuel Rack Pricing Update"
description: "Retrieves current fuel rack prices from SAP for gasoline, diesel, and jet fuel at specified terminals, returning posted price, effective date, and pricing zone."
tags:
- downstream
- trading
- sap
capability:
exposes:
- type: mcp
namespace: rack-pricing
port: 8080
tools:
- name: get-rack-prices
description: "Look up fuel rack prices by terminal and product type. Returns posted price, effective date, and pricing zone."
inputParameters:
- name: terminal_code
in: body
type: string
description: "Terminal code for pricing lookup."
- name: product_type
in: body
type: string
description: "Product type: gasoline, diesel, jet-fuel."
call: sap.get-rack-price
with:
terminal_code: "{{terminal_code}}"
product_type: "{{product_type}}"
outputParameters:
- name: posted_price
type: number
mapping: "$.d.PostedPrice"
- name: effective_date
type: string
mapping: "$.d.EffectiveDate"
- name: pricing_zone
type: string
mapping: "$.d.PricingZone"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_PRICING_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: rack-prices
path: "/A_PricingCondition"
inputParameters:
- name: terminal_code
in: query
- name: product_type
in: query
operations:
- name: get-rack-price
method: GET
Retrieves natural gas liquids recovery data from SAP for a gas processing plant, returning NGL volumes by product, recovery efficiency, and shrinkage percentage.
naftiko: "0.5"
info:
label: "SAP Gas Plant NGL Recovery Report"
description: "Retrieves natural gas liquids recovery data from SAP for a gas processing plant, returning NGL volumes by product, recovery efficiency, and shrinkage percentage."
tags:
- upstream
- production
- sap
capability:
exposes:
- type: mcp
namespace: ngl-recovery
port: 8080
tools:
- name: get-ngl-recovery
description: "Look up NGL recovery metrics by gas plant code. Returns ethane, propane, butane volumes, recovery efficiency, and shrinkage."
inputParameters:
- name: plant_code
in: body
type: string
description: "SAP plant code for the gas processing facility."
call: sap.get-ngl-data
with:
plant_code: "{{plant_code}}"
outputParameters:
- name: ethane_bbl
type: number
mapping: "$.d.EthaneVolume"
- name: propane_bbl
type: number
mapping: "$.d.PropaneVolume"
- name: recovery_efficiency_pct
type: number
mapping: "$.d.RecoveryEfficiency"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/OG_PRODUCTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: ngl-data
path: "/A_GasPlantProduction"
inputParameters:
- name: plant_code
in: query
operations:
- name: get-ngl-data
method: GET
Retrieves heat exchanger performance data from SAP Plant Maintenance, calculating fouling factor trends and flagging units that need cleaning for refinery reliability.
naftiko: "0.5"
info:
label: "SAP Heat Exchanger Fouling Monitor"
description: "Retrieves heat exchanger performance data from SAP Plant Maintenance, calculating fouling factor trends and flagging units that need cleaning for refinery reliability."
tags:
- refining
- maintenance
- sap
capability:
exposes:
- type: mcp
namespace: hx-fouling
port: 8080
tools:
- name: get-fouling-status
description: "Look up heat exchanger fouling metrics by equipment number. Returns fouling factor, duty degradation, and recommended cleaning date."
inputParameters:
- name: equipment_number
in: body
type: string
description: "SAP equipment number for the heat exchanger."
call: sap.get-hx-performance
with:
equipment_number: "{{equipment_number}}"
outputParameters:
- name: fouling_factor
type: number
mapping: "$.d.FoulingFactor"
- name: duty_degradation_pct
type: number
mapping: "$.d.DutyDegradation"
- name: cleaning_recommended
type: boolean
mapping: "$.d.CleaningRecommended"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: hx-data
path: "/A_MeasurementDocument(Equipment='{{equipment_number}}')"
inputParameters:
- name: equipment_number
in: path
operations:
- name: get-hx-performance
method: GET
Retrieves hydrogen production unit operating data from SAP for refinery operations, returning production rate, purity level, and feed gas consumption.
naftiko: "0.5"
info:
label: "SAP Hydrogen Production Unit Status"
description: "Retrieves hydrogen production unit operating data from SAP for refinery operations, returning production rate, purity level, and feed gas consumption."
tags:
- refining
- production
- sap
capability:
exposes:
- type: mcp
namespace: hydrogen-unit
port: 8080
tools:
- name: get-hydrogen-status
description: "Look up hydrogen production unit status by equipment number. Returns production rate, purity, and feed gas usage."
inputParameters:
- name: unit_id
in: body
type: string
description: "SAP equipment number for the hydrogen unit."
call: sap.get-hydrogen-data
with:
unit_id: "{{unit_id}}"
outputParameters:
- name: production_rate_scfh
type: number
mapping: "$.d.ProductionRate"
- name: purity_pct
type: number
mapping: "$.d.H2Purity"
- name: feed_gas_mcf
type: number
mapping: "$.d.FeedGasConsumption"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PP_PRODUCTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: hydrogen
path: "/A_ProductionUnit('{{unit_id}}')"
inputParameters:
- name: unit_id
in: path
operations:
- name: get-hydrogen-data
method: GET
Retrieves intercompany crude oil transfer pricing from SAP, returning transfer price, quality adjustment, and transportation differential for internal accounting.
naftiko: "0.5"
info:
label: "SAP Intercompany Crude Transfer Pricing"
description: "Retrieves intercompany crude oil transfer pricing from SAP, returning transfer price, quality adjustment, and transportation differential for internal accounting."
tags:
- trading
- finance
- sap
capability:
exposes:
- type: mcp
namespace: transfer-pricing
port: 8080
tools:
- name: get-transfer-price
description: "Look up intercompany crude transfer price by contract and period. Returns base price, quality differential, and transport cost."
inputParameters:
- name: contract_number
in: body
type: string
description: "SAP intercompany contract number."
- name: period
in: body
type: string
description: "Pricing period in YYYY-MM format."
call: sap.get-transfer-price
with:
contract_number: "{{contract_number}}"
period: "{{period}}"
outputParameters:
- name: base_price
type: number
mapping: "$.d.BasePrice"
- name: quality_adjustment
type: number
mapping: "$.d.QualityDifferential"
- name: transport_cost
type: number
mapping: "$.d.TransportCost"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_PRICING_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: transfer-prices
path: "/A_IntercompanyPrice"
inputParameters:
- name: contract_number
in: query
- name: period
in: query
operations:
- name: get-transfer-price
method: GET
Retrieves production volumes from SAP and calculates royalty payments owed to mineral rights owners based on lease terms, posting results to Snowflake for audit and reporting.
naftiko: "0.5"
info:
label: "SAP Lease Royalty Payment Calculation"
description: "Retrieves production volumes from SAP and calculates royalty payments owed to mineral rights owners based on lease terms, posting results to Snowflake for audit and reporting."
tags:
- upstream
- finance
- sap
- snowflake
capability:
exposes:
- type: mcp
namespace: royalty-calc
port: 8080
tools:
- name: calculate-royalties
description: "Given a lease ID and production month, pull SAP volumes, calculate royalties, and log to Snowflake."
inputParameters:
- name: lease_id
in: body
type: string
description: "SAP lease contract ID."
- name: production_month
in: body
type: string
description: "Production month in YYYY-MM format."
steps:
- name: get-production
type: call
call: sap.get-lease-production
with:
lease_id: "{{lease_id}}"
month: "{{production_month}}"
- name: log-royalty
type: call
call: snowflake.insert-royalty-record
with:
lease_id: "{{lease_id}}"
volume: "{{get-production.total_volume}}"
month: "{{production_month}}"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/OG_PRODUCTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: lease-production
path: "/A_LeaseProduction"
operations:
- name: get-lease-production
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: royalties
path: "/statements"
operations:
- name: insert-royalty-record
method: POST
Retrieves LNG cargo nomination status from SAP, returning nominated volume, loading port, discharge port, vessel assignment, and laycan window.
naftiko: "0.5"
info:
label: "SAP LNG Cargo Nomination Status"
description: "Retrieves LNG cargo nomination status from SAP, returning nominated volume, loading port, discharge port, vessel assignment, and laycan window."
tags:
- trading
- logistics
- sap
- downstream
capability:
exposes:
- type: mcp
namespace: lng-nomination
port: 8080
tools:
- name: get-lng-nomination
description: "Look up LNG cargo nomination by contract number. Returns nominated volume, ports, vessel, and laycan dates."
inputParameters:
- name: contract_number
in: body
type: string
description: "SAP LNG contract/nomination number."
call: sap.get-lng-nomination
with:
contract_number: "{{contract_number}}"
outputParameters:
- name: volume_mmbtu
type: number
mapping: "$.d.NominatedVolume"
- name: loading_port
type: string
mapping: "$.d.LoadingPort"
- name: vessel
type: string
mapping: "$.d.VesselName"
- name: laycan_start
type: string
mapping: "$.d.LaycanStart"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: lng-nominations
path: "/A_LNGNomination('{{contract_number}}')"
inputParameters:
- name: contract_number
in: path
operations:
- name: get-lng-nomination
method: GET
Tracks lubricant product order fulfillment in SAP, returning order status, shipped quantities, and delivery confirmation for downstream distribution operations.
naftiko: "0.5"
info:
label: "SAP Lubricants Order Fulfillment Tracker"
description: "Tracks lubricant product order fulfillment in SAP, returning order status, shipped quantities, and delivery confirmation for downstream distribution operations."
tags:
- downstream
- sap
- logistics
capability:
exposes:
- type: mcp
namespace: lubricants-fulfillment
port: 8080
tools:
- name: get-lubricant-order-status
description: "Look up lubricant order fulfillment by sales order number. Returns line item status, shipped quantities, and delivery dates."
inputParameters:
- name: sales_order
in: body
type: string
description: "SAP sales order number for the lubricant order."
call: sap.get-sales-order
with:
sales_order: "{{sales_order}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OverallDeliveryStatus"
- name: shipped_qty
type: number
mapping: "$.d.TotalDeliveredQuantity"
- name: delivery_date
type: string
mapping: "$.d.ActualDeliveryDate"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_SALES_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales-orders
path: "/A_SalesOrder('{{sales_order}}')"
inputParameters:
- name: sales_order
in: path
operations:
- name: get-sales-order
method: GET
Retrieves the marine vessel loading schedule from SAP for a given terminal, returning vessel name, cargo type, loading window, and nominated volume.
naftiko: "0.5"
info:
label: "SAP Marine Vessel Loading Schedule"
description: "Retrieves the marine vessel loading schedule from SAP for a given terminal, returning vessel name, cargo type, loading window, and nominated volume."
tags:
- downstream
- logistics
- sap
- trading
capability:
exposes:
- type: mcp
namespace: vessel-loading
port: 8080
tools:
- name: get-loading-schedule
description: "Look up vessel loading schedule by terminal and date range. Returns vessel names, cargo types, windows, and volumes."
inputParameters:
- name: terminal_code
in: body
type: string
description: "SAP terminal plant code."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
call: sap.get-vessel-schedule
with:
terminal_code: "{{terminal_code}}"
date_from: "{{date_from}}"
outputParameters:
- name: vessels
type: string
mapping: "$.d.results"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: vessel-schedule
path: "/A_Shipment"
inputParameters:
- name: terminal_code
in: query
- name: date_from
in: query
operations:
- name: get-vessel-schedule
method: GET
Checks SAP MRP for materials below reorder point at a given plant, creates SAP purchase requisitions, and notifies the procurement team via Teams.
naftiko: "0.5"
info:
label: "SAP Material Inventory Reorder Alert"
description: "Checks SAP MRP for materials below reorder point at a given plant, creates SAP purchase requisitions, and notifies the procurement team via Teams."
tags:
- supply-chain
- procurement
- sap
- msteams
- inventory
capability:
exposes:
- type: mcp
namespace: inventory-ops
port: 8080
tools:
- name: alert-material-reorder
description: "Given a SAP plant code, query MRP for materials below reorder point, create purchase requisitions in SAP, and notify the procurement team via Teams with a reorder summary."
inputParameters:
- name: plant_code
in: body
type: string
description: "SAP plant code to scan for low stock (e.g., 2001)."
steps:
- name: get-low-stock-materials
type: call
call: sap.list-below-reorder-point
with:
plant: "{{plant_code}}"
- name: create-pr
type: call
call: sap-pr.create-purchase-requisition
with:
plant: "{{plant_code}}"
materials: "{{get-low-stock-materials.material_list}}"
- name: notify-procurement
type: call
call: msteams.send-message
with:
channel: "procurement"
text: "Reorder alert at plant {{plant_code}}: {{get-low-stock-materials.count}} materials below minimum. PRs created: {{create-pr.requisition_numbers}}"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV_01"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: mrp-materials
path: "/A_MRPMaterial"
inputParameters:
- name: plant
in: query
operations:
- name: list-below-reorder-point
method: GET
- type: http
namespace: sap-pr
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_PUR_REQ_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-requisitions
path: "/A_PurchaseRequisitionHeader"
operations:
- name: create-purchase-requisition
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/procurement/channels/general/messages"
operations:
- name: send-message
method: POST
Retrieves the material safety data sheet (MSDS) for a given chemical material number from SAP EHS, returning hazard classifications, handling instructions, and emergency contacts.
naftiko: "0.5"
info:
label: "SAP Material Safety Data Sheet Lookup"
description: "Retrieves the material safety data sheet (MSDS) for a given chemical material number from SAP EHS, returning hazard classifications, handling instructions, and emergency contacts."
tags:
- safety
- environmental
- sap
- compliance
capability:
exposes:
- type: mcp
namespace: msds-lookup
port: 8080
tools:
- name: get-msds
description: "Look up an MSDS by SAP material number. Returns hazard class, handling instructions, PPE requirements, and emergency contact information."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number for the chemical (e.g., 000000001234)."
call: sap.get-msds
with:
material_number: "{{material_number}}"
outputParameters:
- name: hazard_class
type: string
mapping: "$.d.HazardClassification"
- name: handling_instructions
type: string
mapping: "$.d.HandlingInstructions"
- name: ppe_required
type: string
mapping: "$.d.PPERequirements"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/EHS_MSDS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: safety-data-sheets
path: "/A_MaterialSafetySheet('{{material_number}}')"
inputParameters:
- name: material_number
in: path
operations:
- name: get-msds
method: GET
Retrieves operational status of a natural gas liquefaction train from SAP Plant Maintenance, returning throughput rate, temperature readings, and maintenance alerts.
naftiko: "0.5"
info:
label: "SAP Natural Gas Liquefaction Unit Status"
description: "Retrieves operational status of a natural gas liquefaction train from SAP Plant Maintenance, returning throughput rate, temperature readings, and maintenance alerts."
tags:
- lng
- downstream
- sap
- production
capability:
exposes:
- type: mcp
namespace: lng-unit-status
port: 8080
tools:
- name: get-liquefaction-status
description: "Look up natural gas liquefaction unit status by functional location."
inputParameters:
- name: functional_location
in: body
type: string
description: "SAP functional location for the liquefaction train."
call: "sap.get-unit-status"
with:
functional_location: "{{functional_location}}"
outputParameters:
- name: throughput_mmscfd
type: number
mapping: "$.d.Throughput"
- name: operating_status
type: string
mapping: "$.d.OperatingStatus"
- name: next_maintenance
type: string
mapping: "$.d.NextMaintenanceDate"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_FUNCLOC_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: unit-status
path: "/A_FunctionalLocation('{{functional_location}}')"
inputParameters:
- name: functional_location
in: path
operations:
- name: get-unit-status
method: GET
Retrieves natural gas pipeline nomination balances from SAP, returning nominated vs actual flow volumes, imbalance quantity, and penalty exposure.
naftiko: "0.5"
info:
label: "SAP Natural Gas Nomination Balance"
description: "Retrieves natural gas pipeline nomination balances from SAP, returning nominated vs actual flow volumes, imbalance quantity, and penalty exposure."
tags:
- trading
- upstream
- sap
capability:
exposes:
- type: mcp
namespace: gas-nomination
port: 8080
tools:
- name: get-nomination-balance
description: "Look up gas nomination balance by pipeline contract. Returns nominated, actual, imbalance, and penalty exposure."
inputParameters:
- name: pipeline_contract
in: body
type: string
description: "SAP pipeline transportation contract number."
call: sap.get-gas-balance
with:
pipeline_contract: "{{pipeline_contract}}"
outputParameters:
- name: nominated_mcf
type: number
mapping: "$.d.NominatedVolume"
- name: actual_mcf
type: number
mapping: "$.d.ActualVolume"
- name: imbalance_mcf
type: number
mapping: "$.d.ImbalanceVolume"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/OG_GAS_BALANCE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: gas-balances
path: "/A_GasNominationBalance('{{pipeline_contract}}')"
inputParameters:
- name: pipeline_contract
in: path
operations:
- name: get-gas-balance
method: GET
Retrieves spare parts availability from SAP for offshore platform equipment, returning stock levels, warehouse location, and lead times for critical maintenance parts.
naftiko: "0.5"
info:
label: "SAP Offshore Platform Spare Parts Lookup"
description: "Retrieves spare parts availability from SAP for offshore platform equipment, returning stock levels, warehouse location, and lead times for critical maintenance parts."
tags:
- upstream
- inventory
- sap
- maintenance
capability:
exposes:
- type: mcp
namespace: offshore-spares
port: 8080
tools:
- name: lookup-spare-parts
description: "Look up spare parts availability by material number and offshore plant. Returns stock, location, and lead time."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number for the spare part."
- name: platform_code
in: body
type: string
description: "SAP plant code for the offshore platform."
call: sap.get-spare-stock
with:
material_number: "{{material_number}}"
platform_code: "{{platform_code}}"
outputParameters:
- name: available_qty
type: number
mapping: "$.d.AvailableStock"
- name: warehouse
type: string
mapping: "$.d.StorageLocation"
- name: lead_time_days
type: number
mapping: "$.d.ReplenishmentLeadTime"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/A_MaterialStock"
inputParameters:
- name: material_number
in: query
- name: platform_code
in: query
operations:
- name: get-spare-stock
method: GET
At month-end, queries SAP for open financial documents, creates a ServiceNow change request for the close checklist, and notifies the finance controller team via Teams.
naftiko: "0.5"
info:
label: "SAP Period Close Checklist"
description: "At month-end, queries SAP for open financial documents, creates a ServiceNow change request for the close checklist, and notifies the finance controller team via Teams."
tags:
- finance
- erp
- sap
- servicenow
- msteams
- period-close
capability:
exposes:
- type: mcp
namespace: finance-close
port: 8080
tools:
- name: run-period-close
description: "Given a SAP fiscal period and company code, query open FI posting documents, open a ServiceNow change request, and notify the controller team in Teams. Use at the start of month-end close."
inputParameters:
- name: fiscal_period
in: body
type: string
description: "SAP fiscal period in YYYYMM format (e.g., 202503)."
- name: company_code
in: body
type: string
description: "SAP company code (e.g., XOM1)."
steps:
- name: get-open-items
type: call
call: sap.get-open-fi-items
with:
fiscal_period: "{{fiscal_period}}"
company_code: "{{company_code}}"
- name: create-change-request
type: call
call: servicenow.create-change-request
with:
short_description: "Period close {{fiscal_period}} — {{company_code}}"
category: "financial_close"
description: "Open FI items: {{get-open-items.count}}. Period: {{fiscal_period}}"
- name: notify-controllers
type: call
call: msteams.send-message
with:
channel: "finance-controllers"
text: "Period close initiated {{fiscal_period}} / {{company_code}}. Open items: {{get-open-items.count}}. Change: {{create-change-request.number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: fi-items
path: "/A_JournalEntryItem"
inputParameters:
- name: fiscal_period
in: query
- name: company_code
in: query
operations:
- name: get-open-fi-items
method: GET
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change-request
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/finance/channels/controllers/messages"
operations:
- name: send-message
method: POST
Retrieves pipeline integrity inspection records from SAP Plant Maintenance, returning last inspection date, wall thickness readings, corrosion rate, and next scheduled inspection.
naftiko: "0.5"
info:
label: "SAP Pipeline Integrity Inspection Tracker"
description: "Retrieves pipeline integrity inspection records from SAP Plant Maintenance, returning last inspection date, wall thickness readings, corrosion rate, and next scheduled inspection."
tags:
- upstream
- safety
- sap
- maintenance
capability:
exposes:
- type: mcp
namespace: pipeline-integrity
port: 8080
tools:
- name: get-inspection-status
description: "Look up pipeline integrity inspection history by functional location. Returns last inspection, wall thickness, corrosion rate, and next due date."
inputParameters:
- name: functional_location
in: body
type: string
description: "SAP functional location for the pipeline segment."
call: sap.get-inspection-records
with:
functional_location: "{{functional_location}}"
outputParameters:
- name: last_inspection
type: string
mapping: "$.d.LastInspectionDate"
- name: wall_thickness_mm
type: number
mapping: "$.d.WallThickness"
- name: corrosion_rate
type: number
mapping: "$.d.CorrosionRate"
- name: next_due
type: string
mapping: "$.d.NextInspectionDate"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inspections
path: "/A_MeasurementDocument"
inputParameters:
- name: functional_location
in: query
operations:
- name: get-inspection-records
method: GET
Retrieves pipeline right-of-way inspection records from SAP, returning encroachment findings, vegetation status, and marker condition for pipeline safety compliance.
naftiko: "0.5"
info:
label: "SAP Pipeline Right-of-Way Inspection"
description: "Retrieves pipeline right-of-way inspection records from SAP, returning encroachment findings, vegetation status, and marker condition for pipeline safety compliance."
tags:
- upstream
- safety
- sap
- compliance
capability:
exposes:
- type: mcp
namespace: row-inspection
port: 8080
tools:
- name: get-row-inspection
description: "Look up pipeline ROW inspection by functional location. Returns encroachment findings and marker status."
inputParameters:
- name: functional_location
in: body
type: string
description: "SAP functional location for the pipeline segment."
call: sap.get-row-records
with:
functional_location: "{{functional_location}}"
outputParameters:
- name: encroachments
type: number
mapping: "$.d.EncroachmentCount"
- name: vegetation_status
type: string
mapping: "$.d.VegetationCondition"
- name: markers_ok
type: boolean
mapping: "$.d.AllMarkersIntact"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: row-inspections
path: "/A_InspectionRecord"
inputParameters:
- name: functional_location
in: query
operations:
- name: get-row-records
method: GET
Looks up a SAP purchase order by number and returns structured header status, vendor name, total value, and open line items for procurement and supply chain queries.
naftiko: "0.5"
info:
label: "SAP Purchase Order Status Lookup"
description: "Looks up a SAP purchase order by number and returns structured header status, vendor name, total value, and open line items for procurement and supply chain queries."
tags:
- procurement
- erp
- sap
- supply-chain
capability:
exposes:
- type: mcp
namespace: procurement-lookup
port: 8080
tools:
- name: get-purchase-order
description: "Look up a SAP purchase order by PO number. Returns header status, vendor name, total value, currency, and delivery status. Use to verify procurement status for upstream or downstream supply chain queries."
inputParameters:
- name: po_number
in: body
type: string
description: "SAP purchase order number (10-digit, e.g., 4500099876)."
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: currency
type: string
mapping: "$.d.TransactionCurrency"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
outputRawFormat: xml
Checks catalyst inventory levels in SAP for refinery process units, returning available quantity, reorder point status, and expected catalyst life remaining.
naftiko: "0.5"
info:
label: "SAP Refinery Catalyst Inventory Check"
description: "Checks catalyst inventory levels in SAP for refinery process units, returning available quantity, reorder point status, and expected catalyst life remaining."
tags:
- refining
- inventory
- sap
capability:
exposes:
- type: mcp
namespace: catalyst-inventory
port: 8080
tools:
- name: check-catalyst-inventory
description: "Look up catalyst inventory by material number and plant. Returns available stock, reorder status, and remaining catalyst life."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number for the catalyst."
- name: plant_code
in: body
type: string
description: "SAP plant code for the refinery."
call: sap.get-catalyst-stock
with:
material_number: "{{material_number}}"
plant_code: "{{plant_code}}"
outputParameters:
- name: available_qty
type: number
mapping: "$.d.AvailableStock"
- name: reorder_needed
type: boolean
mapping: "$.d.BelowReorderPoint"
- name: catalyst_life_days
type: number
mapping: "$.d.RemainingLifeDays"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock
path: "/A_MaterialStock"
inputParameters:
- name: material_number
in: query
- name: plant_code
in: query
operations:
- name: get-catalyst-stock
method: GET
Retrieves energy consumption data from SAP for refinery process units including steam, electricity, and fuel gas usage, and pushes to Power BI for energy efficiency tracking.
naftiko: "0.5"
info:
label: "SAP Refinery Energy Consumption Report"
description: "Retrieves energy consumption data from SAP for refinery process units including steam, electricity, and fuel gas usage, and pushes to Power BI for energy efficiency tracking."
tags:
- refining
- environmental
- sap
- power-bi
capability:
exposes:
- type: mcp
namespace: energy-consumption
port: 8080
tools:
- name: generate-energy-report
description: "Given a plant code and date range, pull energy consumption from SAP and push to Power BI for efficiency tracking."
inputParameters:
- name: plant_code
in: body
type: string
description: "SAP plant code for the refinery."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: get-consumption
type: call
call: sap.get-energy-consumption
with:
plant_code: "{{plant_code}}"
date_from: "{{date_from}}"
- name: push-to-dashboard
type: call
call: powerbi.push-rows
with:
dataset_id: "refinery-energy-consumption"
rows: "{{get-consumption.results}}"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: energy
path: "/A_UtilityConsumption"
operations:
- name: get-energy-consumption
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/refinery-energy-consumption/rows"
operations:
- name: push-rows
method: POST
Pulls daily refinery throughput data from SAP for a given plant, aggregates volumes by crude unit, and publishes a summary to a Power BI dataset for executive dashboards.
naftiko: "0.5"
info:
label: "SAP Refinery Throughput Report"
description: "Pulls daily refinery throughput data from SAP for a given plant, aggregates volumes by crude unit, and publishes a summary to a Power BI dataset for executive dashboards."
tags:
- refining
- reporting
- sap
- power-bi
capability:
exposes:
- type: mcp
namespace: refinery-throughput
port: 8080
tools:
- name: generate-throughput-report
description: "Given a SAP plant code and date range, pull throughput data, aggregate by unit, and push to Power BI for the refinery performance dashboard."
inputParameters:
- name: plant_code
in: body
type: string
description: "SAP plant code for the refinery (e.g., BEAUMONT-REF)."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
- name: date_to
in: body
type: string
description: "End date in YYYY-MM-DD format."
steps:
- name: get-throughput
type: call
call: sap.get-throughput-data
with:
plant_code: "{{plant_code}}"
date_from: "{{date_from}}"
date_to: "{{date_to}}"
- name: push-to-powerbi
type: call
call: powerbi.push-rows
with:
dataset_id: "refinery-throughput-daily"
rows: "{{get-throughput.results}}"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PP_PRODUCTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: throughput
path: "/A_ProductionOutput"
inputParameters:
- name: plant_code
in: query
- name: date_from
in: query
- name: date_to
in: query
operations:
- name: get-throughput-data
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/refinery-throughput-daily/rows"
operations:
- name: push-rows
method: POST
Retrieves underground storage tank leak detection test results from SAP for retail fuel stations, returning test date, pass/fail status, and regulatory compliance flag.
naftiko: "0.5"
info:
label: "SAP Retail Station Underground Tank Compliance"
description: "Retrieves underground storage tank leak detection test results from SAP for retail fuel stations, returning test date, pass/fail status, and regulatory compliance flag."
tags:
- downstream
- environmental
- sap
- compliance
capability:
exposes:
- type: mcp
namespace: ust-compliance
port: 8080
tools:
- name: get-ust-compliance
description: "Look up underground tank compliance status by retail station. Returns test results and regulatory status."
inputParameters:
- name: station_id
in: body
type: string
description: "SAP functional location for the retail station."
call: sap.get-ust-tests
with:
station_id: "{{station_id}}"
outputParameters:
- name: last_test_date
type: string
mapping: "$.d.LastTestDate"
- name: test_result
type: string
mapping: "$.d.TestResult"
- name: compliant
type: boolean
mapping: "$.d.RegulatoryCompliant"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/EHS_MONITORING_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: ust-tests
path: "/A_TankCompliance(Station='{{station_id}}')"
inputParameters:
- name: station_id
in: path
operations:
- name: get-ust-tests
method: GET
Retrieves the latest tank gauge reading from SAP for a specified storage tank, returning product level, temperature, API gravity, and available capacity.
naftiko: "0.5"
info:
label: "SAP Tank Farm Gauge Reading"
description: "Retrieves the latest tank gauge reading from SAP for a specified storage tank, returning product level, temperature, API gravity, and available capacity."
tags:
- downstream
- inventory
- sap
capability:
exposes:
- type: mcp
namespace: tank-gauge
port: 8080
tools:
- name: get-tank-reading
description: "Look up latest tank gauge reading by tank ID. Returns current level, temperature, API gravity, and available capacity in barrels."
inputParameters:
- name: tank_id
in: body
type: string
description: "SAP equipment ID for the storage tank."
call: sap.get-gauge-reading
with:
tank_id: "{{tank_id}}"
outputParameters:
- name: level_feet
type: number
mapping: "$.d.CurrentLevel"
- name: temperature_f
type: number
mapping: "$.d.Temperature"
- name: api_gravity
type: number
mapping: "$.d.APIGravity"
- name: available_capacity_bbl
type: number
mapping: "$.d.AvailableCapacity"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_MEASUREMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: measurements
path: "/A_MeasurementDocument(Equipment='{{tank_id}}')"
inputParameters:
- name: tank_id
in: path
operations:
- name: get-gauge-reading
method: GET
Reconciles tank gauge readings with bill of lading quantities in SAP for marine terminal loadings, identifying discrepancies and logging results in Snowflake for loss control.
naftiko: "0.5"
info:
label: "SAP Tank-to-Ship Transfer Reconciliation"
description: "Reconciles tank gauge readings with bill of lading quantities in SAP for marine terminal loadings, identifying discrepancies and logging results in Snowflake for loss control."
tags:
- downstream
- trading
- sap
- snowflake
capability:
exposes:
- type: mcp
namespace: transfer-recon
port: 8080
tools:
- name: reconcile-transfer
description: "Given a shipment ID, pull tank gauge and bill of lading data from SAP, calculate variance, and log in Snowflake."
inputParameters:
- name: shipment_id
in: body
type: string
description: "SAP shipment document number."
steps:
- name: get-transfer-data
type: call
call: sap.get-transfer-records
with:
shipment_id: "{{shipment_id}}"
- name: log-reconciliation
type: call
call: snowflake.insert-recon-record
with:
shipment_id: "{{shipment_id}}"
tank_volume: "{{get-transfer-data.tank_volume}}"
bol_volume: "{{get-transfer-data.bol_volume}}"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/SD_SHIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: transfers
path: "/A_Shipment('{{shipment_id}}')"
inputParameters:
- name: shipment_id
in: path
operations:
- name: get-transfer-records
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: reconciliation
path: "/statements"
operations:
- name: insert-recon-record
method: POST
Pulls turnaround project cost actuals from SAP Project Systems, compares to budget, and posts a variance summary to the refinery management Teams channel.
naftiko: "0.5"
info:
label: "SAP Turnaround Cost Tracking"
description: "Pulls turnaround project cost actuals from SAP Project Systems, compares to budget, and posts a variance summary to the refinery management Teams channel."
tags:
- refining
- finance
- sap
- msteams
- maintenance
capability:
exposes:
- type: mcp
namespace: ta-cost-tracking
port: 8080
tools:
- name: track-turnaround-costs
description: "Given a SAP project number for a turnaround, pull cost actuals vs budget and post variance to Teams."
inputParameters:
- name: project_number
in: body
type: string
description: "SAP Project Systems project number."
steps:
- name: get-costs
type: call
call: sap.get-project-costs
with:
project_number: "{{project_number}}"
- name: post-variance
type: call
call: msteams.send-message
with:
channel: "refinery-management"
text: "TA Cost Update | Project: {{project_number}} | Actual: ${{get-costs.actual_cost}} | Budget: ${{get-costs.planned_cost}} | Variance: {{get-costs.variance_pct}}%"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PS_PROJECT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: project-costs
path: "/A_ProjectCost('{{project_number}}')"
inputParameters:
- name: project_number
in: path
operations:
- name: get-project-costs
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/refinery/channels/management/messages"
operations:
- name: send-message
method: POST
Retrieves the payment status of a vendor invoice from SAP Accounts Payable, returning payment date, amount, clearing document, and payment method.
naftiko: "0.5"
info:
label: "SAP Vendor Payment Status Lookup"
description: "Retrieves the payment status of a vendor invoice from SAP Accounts Payable, returning payment date, amount, clearing document, and payment method."
tags:
- procurement
- sap
- finance
capability:
exposes:
- type: mcp
namespace: vendor-payment
port: 8080
tools:
- name: get-payment-status
description: "Look up vendor payment status by invoice number. Returns payment date, amount, clearing document number, and payment method."
inputParameters:
- name: invoice_number
in: body
type: string
description: "SAP vendor invoice number."
call: sap.get-payment
with:
invoice_number: "{{invoice_number}}"
outputParameters:
- name: payment_date
type: string
mapping: "$.d.ClearingDate"
- name: amount
type: number
mapping: "$.d.AmountInCompanyCodeCurrency"
- name: clearing_document
type: string
mapping: "$.d.ClearingDocumentNumber"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/FI_AP_INVOICE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: invoices
path: "/A_SupplierInvoice('{{invoice_number}}')"
inputParameters:
- name: invoice_number
in: path
operations:
- name: get-payment
method: GET
Retrieves wastewater effluent quality data from SAP Environmental Health and Safety, returning pH, total suspended solids, and oil and grease levels against permit limits.
naftiko: "0.5"
info:
label: "SAP Wastewater Treatment Compliance Check"
description: "Retrieves wastewater effluent quality data from SAP Environmental Health and Safety, returning pH, total suspended solids, and oil and grease levels against permit limits."
tags:
- environmental
- refining
- sap
- compliance
capability:
exposes:
- type: mcp
namespace: wastewater-compliance
port: 8080
tools:
- name: check-effluent-quality
description: "Look up wastewater treatment effluent quality by outfall ID. Returns measured values and compliance status against permit limits."
inputParameters:
- name: outfall_id
in: body
type: string
description: "SAP outfall monitoring point ID."
call: sap.get-effluent-data
with:
outfall_id: "{{outfall_id}}"
outputParameters:
- name: ph
type: number
mapping: "$.d.PHValue"
- name: tss_mgl
type: number
mapping: "$.d.TotalSuspendedSolids"
- name: oil_grease_mgl
type: number
mapping: "$.d.OilAndGrease"
- name: compliant
type: boolean
mapping: "$.d.WithinPermitLimits"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/EHS_MONITORING_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: effluent
path: "/A_EffluentMonitoring('{{outfall_id}}')"
inputParameters:
- name: outfall_id
in: path
operations:
- name: get-effluent-data
method: GET
Retrieves daily production allocation data for a well from SAP, returning oil, gas, and water volumes allocated to the well based on separator test results.
naftiko: "0.5"
info:
label: "SAP Well Production Daily Allocation"
description: "Retrieves daily production allocation data for a well from SAP, returning oil, gas, and water volumes allocated to the well based on separator test results."
tags:
- upstream
- production
- sap
capability:
exposes:
- type: mcp
namespace: well-allocation
port: 8080
tools:
- name: get-well-allocation
description: "Look up daily production allocation for a well by functional location and date. Returns oil, gas, and water volumes."
inputParameters:
- name: functional_location
in: body
type: string
description: "SAP functional location for the well."
- name: allocation_date
in: body
type: string
description: "Allocation date in YYYY-MM-DD format."
call: sap.get-allocation
with:
functional_location: "{{functional_location}}"
allocation_date: "{{allocation_date}}"
outputParameters:
- name: oil_bbl
type: number
mapping: "$.d.OilVolume"
- name: gas_mcf
type: number
mapping: "$.d.GasVolume"
- name: water_bbl
type: number
mapping: "$.d.WaterVolume"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/OG_PRODUCTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: allocations
path: "/A_WellAllocation"
inputParameters:
- name: functional_location
in: query
- name: allocation_date
in: query
operations:
- name: get-allocation
method: GET
Retrieves the latest wellhead pressure readings from SAP for a given well, returning tubing pressure, casing pressure, and flow line pressure values.
naftiko: "0.5"
info:
label: "SAP Wellhead Pressure Reading"
description: "Retrieves the latest wellhead pressure readings from SAP for a given well, returning tubing pressure, casing pressure, and flow line pressure values."
tags:
- upstream
- production
- sap
capability:
exposes:
- type: mcp
namespace: wellhead-pressure
port: 8080
tools:
- name: get-wellhead-pressure
description: "Look up wellhead pressure by functional location. Returns tubing, casing, and flow line pressure readings."
inputParameters:
- name: functional_location
in: body
type: string
description: "SAP functional location for the well."
call: sap.get-pressure-reading
with:
functional_location: "{{functional_location}}"
outputParameters:
- name: tubing_pressure_psi
type: number
mapping: "$.d.TubingPressure"
- name: casing_pressure_psi
type: number
mapping: "$.d.CasingPressure"
- name: flowline_pressure_psi
type: number
mapping: "$.d.FlowLinePressure"
consumes:
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/OG_WELL_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: pressure-readings
path: "/A_WellMeasurement(FunctionalLocation='{{functional_location}}')"
inputParameters:
- name: functional_location
in: path
operations:
- name: get-pressure-reading
method: GET
Queries ServiceNow for environmental permits approaching renewal deadlines, generates a compliance report in Snowflake, and alerts the environmental affairs team via Teams.
naftiko: "0.5"
info:
label: "ServiceNow Environmental Permit Tracker"
description: "Queries ServiceNow for environmental permits approaching renewal deadlines, generates a compliance report in Snowflake, and alerts the environmental affairs team via Teams."
tags:
- environmental
- compliance
- servicenow
- snowflake
- msteams
capability:
exposes:
- type: mcp
namespace: env-permit
port: 8080
tools:
- name: track-env-permits
description: "Given a lookahead window in days, find environmental permits nearing expiry in ServiceNow, log to Snowflake, and alert the environmental team in Teams."
inputParameters:
- name: days_lookahead
in: body
type: number
description: "Number of days to look ahead for permit expirations."
steps:
- name: query-permits
type: call
call: servicenow.query-permits
with:
days_lookahead: "{{days_lookahead}}"
- name: log-report
type: call
call: snowflake.insert-permit-report
with:
permits: "{{query-permits.records}}"
report_date: "{{days_lookahead}}"
- name: alert-team
type: call
call: msteams.send-message
with:
channel: "environmental-affairs"
text: "Environmental permit alert | {{query-permits.total_count}} permits expiring within {{days_lookahead}} days | Report logged to Snowflake"
consumes:
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: permits
path: "/table/u_environmental_permit"
operations:
- name: query-permits
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: permit-reports
path: "/statements"
operations:
- name: insert-permit-report
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/environmental/channels/affairs/messages"
operations:
- name: send-message
method: POST
Queries ServiceNow CMDB for IT assets nearing end-of-life, generates a replacement plan in Confluence, and opens procurement requisitions in SAP Ariba for critical infrastructure.
naftiko: "0.5"
info:
label: "ServiceNow IT Asset Lifecycle Audit"
description: "Queries ServiceNow CMDB for IT assets nearing end-of-life, generates a replacement plan in Confluence, and opens procurement requisitions in SAP Ariba for critical infrastructure."
tags:
- it-operations
- servicenow
- confluence
- sap-ariba
capability:
exposes:
- type: mcp
namespace: asset-lifecycle
port: 8080
tools:
- name: audit-asset-lifecycle
description: "Given an asset category and EOL threshold in months, find aging assets in ServiceNow, create a Confluence replacement plan, and raise Ariba requisitions."
inputParameters:
- name: asset_category
in: body
type: string
description: "Asset category to audit (e.g., server, network, storage)."
- name: eol_months
in: body
type: number
description: "Months until end-of-life to flag assets."
steps:
- name: find-aging-assets
type: call
call: servicenow.query-assets
with:
category: "{{asset_category}}"
eol_months: "{{eol_months}}"
- name: create-replacement-plan
type: call
call: confluence.create-page
with:
space: "IT-LIFECYCLE"
title: "Replacement Plan - {{asset_category}} - Q1 2026"
body: "{{find-aging-assets.summary}}"
- name: create-requisition
type: call
call: ariba.create-requisition
with:
items: "{{find-aging-assets.critical_assets}}"
category: "{{asset_category}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: cmdb-assets
path: "/table/cmdb_ci"
operations:
- name: query-assets
method: GET
- type: http
namespace: confluence
baseUri: "https://exxon.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: ariba
baseUri: "https://exxon.ariba.com/api/procurement"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: requisitions
path: "/requisitions"
operations:
- name: create-requisition
method: POST
Retrieves the current status of a ServiceNow change request and posts a detailed summary to the IT governance Teams channel for CAB preparation.
naftiko: "0.5"
info:
label: "ServiceNow IT Change Request Status Check"
description: "Retrieves the current status of a ServiceNow change request and posts a detailed summary to the IT governance Teams channel for CAB preparation."
tags:
- itsm
- change-management
- servicenow
- msteams
capability:
exposes:
- type: mcp
namespace: it-governance
port: 8080
tools:
- name: get-change-request-status
description: "Given a ServiceNow change request number, return its state, approval status, scheduled window, and implementation plan, then post a summary to the IT governance Teams channel."
inputParameters:
- name: change_number
in: body
type: string
description: "ServiceNow change request number (e.g., CHG0098765)."
steps:
- name: get-change
type: call
call: servicenow.get-change
with:
number: "{{change_number}}"
- name: post-summary
type: call
call: msteams.send-message
with:
channel: "it-governance"
text: "Change {{change_number}}: {{get-change.state}} | Approval: {{get-change.approval}} | Window: {{get-change.start_date}} to {{get-change.end_date}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
inputParameters:
- name: number
in: query
operations:
- name: get-change
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/it/channels/governance/messages"
operations:
- name: send-message
method: POST
Initiates a Management of Change (MOC) workflow in ServiceNow for process safety modifications, routing through hazard review, engineering approval, and HSE sign-off with Teams notifications at each stage.
naftiko: "0.5"
info:
label: "ServiceNow Management of Change Workflow"
description: "Initiates a Management of Change (MOC) workflow in ServiceNow for process safety modifications, routing through hazard review, engineering approval, and HSE sign-off with Teams notifications at each stage."
tags:
- safety
- servicenow
- msteams
- compliance
- refining
capability:
exposes:
- type: mcp
namespace: moc-workflow
port: 8080
tools:
- name: initiate-moc
description: "Given a change description and facility, create a MOC record in ServiceNow, trigger review workflow, and notify stakeholders via Teams."
inputParameters:
- name: change_description
in: body
type: string
description: "Description of the proposed process change."
- name: facility
in: body
type: string
description: "Facility where the change will be implemented."
- name: change_type
in: body
type: string
description: "Type: temporary, permanent, emergency."
steps:
- name: create-moc
type: call
call: servicenow.create-moc
with:
description: "{{change_description}}"
facility: "{{facility}}"
type: "{{change_type}}"
- name: notify-reviewers
type: call
call: msteams.send-message
with:
channel: "process-safety"
text: "New MOC submitted | {{change_type}} | Facility: {{facility}} | MOC#: {{create-moc.number}} | Review required"
consumes:
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: moc
path: "/table/u_management_of_change"
operations:
- name: create-moc
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/safety/channels/process/messages"
operations:
- name: send-message
method: POST
When a process safety event is reported, creates a ServiceNow investigation record, assigns an investigation team from Workday, logs initial details in Snowflake, and notifies HSE leadership via Teams.
naftiko: "0.5"
info:
label: "ServiceNow Process Safety Event Investigation"
description: "When a process safety event is reported, creates a ServiceNow investigation record, assigns an investigation team from Workday, logs initial details in Snowflake, and notifies HSE leadership via Teams."
tags:
- safety
- servicenow
- workday
- snowflake
- msteams
capability:
exposes:
- type: mcp
namespace: pse-investigation
port: 8080
tools:
- name: initiate-pse-investigation
description: "Given event details and severity, create a ServiceNow investigation, assign team from Workday, log to Snowflake, and alert HSE leadership."
inputParameters:
- name: event_description
in: body
type: string
description: "Description of the process safety event."
- name: facility
in: body
type: string
description: "Facility where the event occurred."
- name: severity
in: body
type: string
description: "Event severity: tier-1, tier-2, tier-3."
steps:
- name: create-investigation
type: call
call: servicenow.create-investigation
with:
description: "{{event_description}}"
facility: "{{facility}}"
severity: "{{severity}}"
- name: assign-team
type: call
call: workday.get-investigation-team
with:
facility: "{{facility}}"
severity: "{{severity}}"
- name: log-event
type: call
call: snowflake.insert-pse-record
with:
investigation_id: "{{create-investigation.sys_id}}"
facility: "{{facility}}"
severity: "{{severity}}"
- name: alert-leadership
type: call
call: msteams.send-message
with:
channel: "hse-leadership"
text: "PSE Alert | {{severity}} | Facility: {{facility}} | Investigation: {{create-investigation.number}} | Team lead: {{assign-team.lead_name}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: investigations
path: "/table/u_pse_investigation"
operations:
- name: create-investigation
method: POST
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: teams
path: "/workers"
operations:
- name: get-investigation-team
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: pse-records
path: "/statements"
operations:
- name: insert-pse-record
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/hse/channels/leadership/messages"
operations:
- name: send-message
method: POST
Manages unplanned refinery unit outages by creating a ServiceNow major incident, notifying impacted stakeholders via Teams, and updating the production planning team with revised throughput estimates from SAP.
naftiko: "0.5"
info:
label: "ServiceNow Refinery Outage Management"
description: "Manages unplanned refinery unit outages by creating a ServiceNow major incident, notifying impacted stakeholders via Teams, and updating the production planning team with revised throughput estimates from SAP."
tags:
- refining
- servicenow
- msteams
- sap
- production
capability:
exposes:
- type: mcp
namespace: refinery-outage
port: 8080
tools:
- name: manage-refinery-outage
description: "Given a refinery unit and outage type, create a major incident in ServiceNow, notify stakeholders in Teams, and pull revised throughput from SAP."
inputParameters:
- name: unit_id
in: body
type: string
description: "Refinery unit identifier."
- name: outage_type
in: body
type: string
description: "Type of outage: unplanned, emergency, weather."
- name: estimated_duration_hrs
in: body
type: number
description: "Estimated outage duration in hours."
steps:
- name: create-major-incident
type: call
call: servicenow.create-major-incident
with:
unit_id: "{{unit_id}}"
outage_type: "{{outage_type}}"
duration: "{{estimated_duration_hrs}}"
- name: get-throughput-impact
type: call
call: sap.get-unit-throughput
with:
unit_id: "{{unit_id}}"
- name: notify-stakeholders
type: call
call: msteams.send-message
with:
channel: "refinery-management"
text: "OUTAGE ALERT | Unit: {{unit_id}} | Type: {{outage_type}} | Est. duration: {{estimated_duration_hrs}}h | Throughput impact: {{get-throughput-impact.daily_bbl}} bbl/d | INC: {{create-major-incident.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: major-incidents
path: "/table/incident"
operations:
- name: create-major-incident
method: POST
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PP_PRODUCTION_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: throughput
path: "/A_ProductionOutput"
operations:
- name: get-unit-throughput
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/refinery/channels/management/messages"
operations:
- name: send-message
method: POST
Queries Snowflake for carbon capture and storage project data including CO2 injection volumes, storage capacity utilization, and monitoring well readings, then pushes to Power BI.
naftiko: "0.5"
info:
label: "Snowflake Carbon Capture Project Dashboard"
description: "Queries Snowflake for carbon capture and storage project data including CO2 injection volumes, storage capacity utilization, and monitoring well readings, then pushes to Power BI."
tags:
- environmental
- upstream
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: carbon-capture
port: 8080
tools:
- name: generate-ccs-dashboard
description: "Given a CCS project ID and date range, query Snowflake for injection and monitoring data, then push to Power BI."
inputParameters:
- name: project_id
in: body
type: string
description: "Carbon capture project identifier."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: query-ccs-data
type: call
call: snowflake.query-ccs-metrics
with:
project_id: "{{project_id}}"
date_from: "{{date_from}}"
- name: push-dashboard
type: call
call: powerbi.push-rows
with:
dataset_id: "carbon-capture-monitoring"
rows: "{{query-ccs-data.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: ccs-metrics
path: "/statements"
operations:
- name: query-ccs-metrics
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/carbon-capture-monitoring/rows"
operations:
- name: push-rows
method: POST
Queries Snowflake for downstream product margins by refinery and product slate, calculates crack spreads and net margins, and pushes results to Power BI for commercial decision support.
naftiko: "0.5"
info:
label: "Snowflake Downstream Margin Analysis"
description: "Queries Snowflake for downstream product margins by refinery and product slate, calculates crack spreads and net margins, and pushes results to Power BI for commercial decision support."
tags:
- downstream
- trading
- snowflake
- power-bi
- finance
capability:
exposes:
- type: mcp
namespace: margin-analysis
port: 8080
tools:
- name: analyze-downstream-margins
description: "Given a refinery and date range, query Snowflake for product margins, calculate crack spreads, and push to Power BI."
inputParameters:
- name: refinery_code
in: body
type: string
description: "Refinery code for the margin analysis."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: query-margins
type: call
call: snowflake.query-product-margins
with:
refinery_code: "{{refinery_code}}"
date_from: "{{date_from}}"
- name: push-results
type: call
call: powerbi.push-rows
with:
dataset_id: "downstream-margins"
rows: "{{query-margins.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: margins
path: "/statements"
operations:
- name: query-product-margins
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/downstream-margins/rows"
operations:
- name: push-rows
method: POST
Queries Snowflake for drilling cost data by well and formation, calculates cost-per-foot metrics, and pushes results to Power BI for drilling efficiency benchmarking.
naftiko: "0.5"
info:
label: "Snowflake Drilling Cost Per Foot Analysis"
description: "Queries Snowflake for drilling cost data by well and formation, calculates cost-per-foot metrics, and pushes results to Power BI for drilling efficiency benchmarking."
tags:
- upstream
- drilling
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: drilling-cost
port: 8080
tools:
- name: analyze-drilling-cost
description: "Given a basin and date range, query Snowflake for drilling costs, calculate cost-per-foot by formation, and push to Power BI."
inputParameters:
- name: basin
in: body
type: string
description: "Basin name (e.g., Permian, Guyana)."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
- name: date_to
in: body
type: string
description: "End date in YYYY-MM-DD format."
steps:
- name: query-costs
type: call
call: snowflake.query-drilling-costs
with:
basin: "{{basin}}"
date_from: "{{date_from}}"
date_to: "{{date_to}}"
- name: push-to-dashboard
type: call
call: powerbi.push-rows
with:
dataset_id: "drilling-cost-per-foot"
rows: "{{query-costs.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: drilling-costs
path: "/statements"
operations:
- name: query-drilling-costs
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/drilling-cost-per-foot/rows"
operations:
- name: push-rows
method: POST
Queries Snowflake for greenhouse gas emissions data across upstream and refining operations, aggregates by facility, and publishes to Power BI for environmental reporting dashboards.
naftiko: "0.5"
info:
label: "Snowflake Emissions Monitoring Report"
description: "Queries Snowflake for greenhouse gas emissions data across upstream and refining operations, aggregates by facility, and publishes to Power BI for environmental reporting dashboards."
tags:
- environmental
- reporting
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: emissions-report
port: 8080
tools:
- name: generate-emissions-report
description: "Given a reporting period and facility type, query Snowflake for GHG emissions data, aggregate by facility, and push to Power BI."
inputParameters:
- name: period
in: body
type: string
description: "Reporting period (e.g., 2026-Q1)."
- name: facility_type
in: body
type: string
description: "Facility type: upstream, refining, chemical, all."
steps:
- name: query-emissions
type: call
call: snowflake.query-emissions
with:
period: "{{period}}"
facility_type: "{{facility_type}}"
- name: push-to-dashboard
type: call
call: powerbi.push-rows
with:
dataset_id: "ghg-emissions-quarterly"
rows: "{{query-emissions.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: emissions
path: "/statements"
operations:
- name: query-emissions
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/ghg-emissions-quarterly/rows"
operations:
- name: push-rows
method: POST
Queries Snowflake for current energy trading positions across crude, natural gas, and refined products, aggregates exposure by desk, and pushes to Power BI for risk monitoring.
naftiko: "0.5"
info:
label: "Snowflake Energy Trading Position Report"
description: "Queries Snowflake for current energy trading positions across crude, natural gas, and refined products, aggregates exposure by desk, and pushes to Power BI for risk monitoring."
tags:
- trading
- risk-management
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: trading-positions
port: 8080
tools:
- name: generate-position-report
description: "Given a trading desk and valuation date, query Snowflake for open positions, aggregate by commodity, and push to Power BI."
inputParameters:
- name: desk
in: body
type: string
description: "Trading desk identifier (e.g., crude-americas, gas-europe)."
- name: valuation_date
in: body
type: string
description: "Valuation date in YYYY-MM-DD format."
steps:
- name: query-positions
type: call
call: snowflake.query-trading-positions
with:
desk: "{{desk}}"
valuation_date: "{{valuation_date}}"
- name: push-to-dashboard
type: call
call: powerbi.push-rows
with:
dataset_id: "trading-positions-daily"
rows: "{{query-positions.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: positions
path: "/statements"
operations:
- name: query-trading-positions
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/trading-positions-daily/rows"
operations:
- name: push-rows
method: POST
Queries Snowflake for methane leak detection and repair (LDAR) survey results, identifies active leaks requiring remediation, and creates work orders in SAP for repair.
naftiko: "0.5"
info:
label: "Snowflake Methane Leak Detection Report"
description: "Queries Snowflake for methane leak detection and repair (LDAR) survey results, identifies active leaks requiring remediation, and creates work orders in SAP for repair."
tags:
- environmental
- upstream
- snowflake
- sap
- compliance
capability:
exposes:
- type: mcp
namespace: methane-ldar
port: 8080
tools:
- name: process-ldar-results
description: "Given a facility and survey date, query Snowflake for LDAR results and create SAP work orders for detected leaks."
inputParameters:
- name: facility_id
in: body
type: string
description: "Facility identifier for the LDAR survey."
- name: survey_date
in: body
type: string
description: "Survey date in YYYY-MM-DD format."
steps:
- name: query-leaks
type: call
call: snowflake.query-ldar-results
with:
facility_id: "{{facility_id}}"
survey_date: "{{survey_date}}"
- name: create-repair-orders
type: call
call: sap.create-pm-work-orders
with:
leaks: "{{query-leaks.active_leaks}}"
facility: "{{facility_id}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: ldar
path: "/statements"
operations:
- name: query-ldar-results
method: POST
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: work-orders
path: "/A_MaintenanceOrder"
operations:
- name: create-pm-work-orders
method: POST
Queries Snowflake for pipeline flow rate telemetry, detects statistical anomalies against baseline thresholds, and creates a ServiceNow incident for the pipeline operations team.
naftiko: "0.5"
info:
label: "Snowflake Pipeline Flow Rate Anomaly Detector"
description: "Queries Snowflake for pipeline flow rate telemetry, detects statistical anomalies against baseline thresholds, and creates a ServiceNow incident for the pipeline operations team."
tags:
- upstream
- pipeline
- snowflake
- servicenow
- safety
capability:
exposes:
- type: mcp
namespace: pipeline-anomaly
port: 8080
tools:
- name: detect-flow-anomaly
description: "Given a pipeline segment ID and time window, query Snowflake for flow rate data, detect anomalies, and raise a ServiceNow incident if thresholds are breached."
inputParameters:
- name: pipeline_segment_id
in: body
type: string
description: "Unique identifier for the pipeline segment."
- name: hours_lookback
in: body
type: number
description: "Number of hours to look back for anomaly detection."
steps:
- name: query-flow-data
type: call
call: snowflake.query-flow-rates
with:
pipeline_segment_id: "{{pipeline_segment_id}}"
hours_lookback: "{{hours_lookback}}"
- name: raise-incident
type: call
call: servicenow.create-incident
with:
short_description: "Pipeline flow anomaly on segment {{pipeline_segment_id}}"
description: "Anomaly detected: {{query-flow-data.anomaly_summary}}"
urgency: "2"
category: "pipeline_operations"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: flow-rates
path: "/statements"
operations:
- name: query-flow-rates
method: POST
- type: http
namespace: servicenow
baseUri: "https://exxon.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
Runs a refinery yield optimization query in Snowflake that compares actual versus target product yields across distillation units, returning variance metrics and improvement recommendations.
naftiko: "0.5"
info:
label: "Snowflake Refinery Yield Optimization Report"
description: "Runs a refinery yield optimization query in Snowflake that compares actual versus target product yields across distillation units, returning variance metrics and improvement recommendations."
tags:
- downstream
- analytics
- snowflake
- refinery
capability:
exposes:
- type: mcp
namespace: refinery-yield
port: 8080
tools:
- name: get-yield-optimization-report
description: "Generate a refinery yield optimization report comparing actual vs. target yields by distillation unit."
inputParameters:
- name: plant_code
in: body
type: string
description: "SAP plant code for the refinery."
- name: report_date
in: body
type: string
description: "Report date in YYYY-MM-DD format."
call: "snowflake.execute-query"
with:
statement: "SELECT unit_id, product_grade, actual_yield_pct, target_yield_pct, variance_pct FROM refinery_ops.yield_summary WHERE plant_code='{{plant_code}}' AND report_date='{{report_date}}'"
outputParameters:
- name: yield_data
type: array
mapping: "$.data"
- name: row_count
type: number
mapping: "$.resultSetMetaData.numRows"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxonmobil.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-query
method: POST
Queries Snowflake for historical well production data, performs decline curve analysis calculations, and pushes EUR estimates to Power BI for reserve forecasting.
naftiko: "0.5"
info:
label: "Snowflake Reservoir Decline Curve Analysis"
description: "Queries Snowflake for historical well production data, performs decline curve analysis calculations, and pushes EUR estimates to Power BI for reserve forecasting."
tags:
- upstream
- production
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: decline-curve
port: 8080
tools:
- name: run-decline-analysis
description: "Given a well ID and production history window, query Snowflake for production data, calculate decline parameters, and push EUR estimates to Power BI."
inputParameters:
- name: well_id
in: body
type: string
description: "Unique well identifier."
- name: months_history
in: body
type: number
description: "Number of months of production history to analyze."
steps:
- name: query-production
type: call
call: snowflake.query-well-production
with:
well_id: "{{well_id}}"
months_history: "{{months_history}}"
- name: push-forecasts
type: call
call: powerbi.push-rows
with:
dataset_id: "decline-curve-eur"
rows: "{{query-production.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: production
path: "/statements"
operations:
- name: query-well-production
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/decline-curve-eur/rows"
operations:
- name: push-rows
method: POST
Queries Snowflake for drilling rig utilization data across basins, benchmarks performance against targets, and pushes results to Power BI for operational planning.
naftiko: "0.5"
info:
label: "Snowflake Rig Utilization Benchmarking"
description: "Queries Snowflake for drilling rig utilization data across basins, benchmarks performance against targets, and pushes results to Power BI for operational planning."
tags:
- upstream
- drilling
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: rig-utilization
port: 8080
tools:
- name: benchmark-rig-utilization
description: "Given a basin and quarter, query rig utilization from Snowflake and push benchmarking data to Power BI."
inputParameters:
- name: basin
in: body
type: string
description: "Basin name for benchmarking."
- name: quarter
in: body
type: string
description: "Quarter in format YYYY-QN."
steps:
- name: query-utilization
type: call
call: snowflake.query-rig-utilization
with:
basin: "{{basin}}"
quarter: "{{quarter}}"
- name: push-benchmarks
type: call
call: powerbi.push-rows
with:
dataset_id: "rig-utilization-benchmark"
rows: "{{query-utilization.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: rig-data
path: "/statements"
operations:
- name: query-rig-utilization
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/rig-utilization-benchmark/rows"
operations:
- name: push-rows
method: POST
Queries Snowflake for seismic survey metadata, returning survey coverage, acquisition dates, and processing status for exploration data management.
naftiko: "0.5"
info:
label: "Snowflake Seismic Survey Data Catalog"
description: "Queries Snowflake for seismic survey metadata, returning survey coverage, acquisition dates, and processing status for exploration data management."
tags:
- upstream
- exploration
- snowflake
capability:
exposes:
- type: mcp
namespace: seismic-catalog
port: 8080
tools:
- name: search-seismic-surveys
description: "Search seismic survey catalog by basin and vintage year. Returns survey names, coverage areas, and processing status."
inputParameters:
- name: basin
in: body
type: string
description: "Basin name for the survey search."
- name: vintage_year
in: body
type: number
description: "Acquisition year filter."
call: snowflake.query-seismic-catalog
with:
basin: "{{basin}}"
vintage_year: "{{vintage_year}}"
outputParameters:
- name: surveys
type: string
mapping: "$.data"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: seismic
path: "/statements"
operations:
- name: query-seismic-catalog
method: POST
Queries Snowflake for trading counterparty credit exposure data, aggregates by counterparty and commodity, and generates a risk report in Power BI for the credit risk team.
naftiko: "0.5"
info:
label: "Snowflake Trading Counterparty Exposure Report"
description: "Queries Snowflake for trading counterparty credit exposure data, aggregates by counterparty and commodity, and generates a risk report in Power BI for the credit risk team."
tags:
- trading
- risk-management
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: counterparty-exposure
port: 8080
tools:
- name: generate-exposure-report
description: "Given a valuation date and exposure threshold, query Snowflake for counterparty positions and push to Power BI."
inputParameters:
- name: valuation_date
in: body
type: string
description: "Valuation date in YYYY-MM-DD format."
- name: threshold_usd
in: body
type: number
description: "Minimum exposure in USD to include."
steps:
- name: query-exposure
type: call
call: snowflake.query-counterparty-exposure
with:
valuation_date: "{{valuation_date}}"
threshold_usd: "{{threshold_usd}}"
- name: push-report
type: call
call: powerbi.push-rows
with:
dataset_id: "counterparty-exposure"
rows: "{{query-exposure.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: exposure
path: "/statements"
operations:
- name: query-counterparty-exposure
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/counterparty-exposure/rows"
operations:
- name: push-rows
method: POST
Runs automated data quality checks on Snowflake upstream production data tables, logs metrics to Datadog, and creates Jira remediation tasks when thresholds are breached.
naftiko: "0.5"
info:
label: "Snowflake Upstream Data Quality Monitor"
description: "Runs automated data quality checks on Snowflake upstream production data tables, logs metrics to Datadog, and creates Jira remediation tasks when thresholds are breached."
tags:
- data-engineering
- data-quality
- snowflake
- datadog
- jira
- oil-gas
capability:
exposes:
- type: mcp
namespace: data-quality-ops
port: 8080
tools:
- name: run-upstream-data-check
description: "Given a Snowflake table name and acceptable null rate threshold, execute a row count and null check, submit a Datadog metric, and open a Jira remediation task if quality thresholds are breached."
inputParameters:
- name: table_name
in: body
type: string
description: "Fully qualified Snowflake table name (e.g., UPSTREAM.PUBLIC.WELL_PRODUCTION)."
- name: null_threshold
in: body
type: number
description: "Maximum acceptable null rate (0.0–1.0) before raising a Jira issue."
steps:
- name: run-dq-query
type: call
call: snowflake.execute-dq-check
with:
table_name: "{{table_name}}"
- name: post-metric
type: call
call: datadog.submit-metric
with:
metric: "exxon.snowflake.null_rate"
points: "{{run-dq-query.null_rate}}"
tags: "table:{{table_name}}"
- name: create-remediation-task
type: call
call: jira.create-issue
with:
project_key: "DATA"
issuetype: "Task"
summary: "Data quality breach: {{table_name}} null_rate={{run-dq-query.null_rate}}"
description: "Table {{table_name}} exceeded null threshold {{null_threshold}}. Actual: {{run-dq-query.null_rate}}. Row count: {{run-dq-query.row_count}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-dq-check
method: POST
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: metrics
path: "/series"
operations:
- name: submit-metric
method: POST
- type: http
namespace: jira
baseUri: "https://exxon.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
Queries Snowflake for produced water disposal well injection volumes and pressures, checks against permit limits, and creates a ServiceNow alert if approaching regulatory thresholds.
naftiko: "0.5"
info:
label: "Snowflake Water Disposal Well Monitoring"
description: "Queries Snowflake for produced water disposal well injection volumes and pressures, checks against permit limits, and creates a ServiceNow alert if approaching regulatory thresholds."
tags:
- upstream
- environmental
- snowflake
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: water-disposal
port: 8080
tools:
- name: monitor-disposal-well
description: "Given a disposal well ID, query injection data from Snowflake, check permit limits, and alert via ServiceNow if nearing thresholds."
inputParameters:
- name: well_id
in: body
type: string
description: "Disposal well identifier."
steps:
- name: query-injection-data
type: call
call: snowflake.query-injection-volumes
with:
well_id: "{{well_id}}"
- name: create-alert
type: call
call: servicenow.create-alert
with:
well_id: "{{well_id}}"
current_volume: "{{query-injection-data.daily_volume}}"
permit_limit: "{{query-injection-data.permit_limit}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: injection-data
path: "/statements"
operations:
- name: query-injection-volumes
method: POST
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: alerts
path: "/table/u_environmental_alert"
operations:
- name: create-alert
method: POST
Triggers a Terraform Cloud workspace run to provision or update oil-and-gas data infrastructure, and notifies the platform engineering team via Teams on completion.
naftiko: "0.5"
info:
label: "Terraform Cloud Infrastructure Provisioning"
description: "Triggers a Terraform Cloud workspace run to provision or update oil-and-gas data infrastructure, and notifies the platform engineering team via Teams on completion."
tags:
- cloud
- infrastructure
- terraform
- msteams
- devops
- oil-gas
capability:
exposes:
- type: mcp
namespace: cloud-provisioning
port: 8080
tools:
- name: trigger-infra-provision
description: "Given a Terraform Cloud workspace ID and change description, queue a new plan-and-apply run and notify the platform-engineering Teams channel with the run ID."
inputParameters:
- name: workspace_id
in: body
type: string
description: "Terraform Cloud workspace ID (e.g., ws-XXXXXXXXX)."
- name: change_description
in: body
type: string
description: "Reason for the Terraform run (e.g., 'Add Permian Basin data subnet')."
steps:
- name: queue-run
type: call
call: terraform.create-run
with:
workspace_id: "{{workspace_id}}"
message: "{{change_description}}"
- name: notify-platform
type: call
call: msteams.send-message
with:
channel: "platform-engineering"
text: "Terraform run queued: {{queue-run.run_id}} | Workspace: {{workspace_id}} | Change: {{change_description}}"
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: create-run
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/engineering/channels/platform/messages"
operations:
- name: send-message
method: POST
Provisions edge computing infrastructure for well pad SCADA systems using Terraform Cloud, registers new devices in ServiceNow CMDB, and notifies the OT team via Teams.
naftiko: "0.5"
info:
label: "Terraform Well Pad Edge Infrastructure"
description: "Provisions edge computing infrastructure for well pad SCADA systems using Terraform Cloud, registers new devices in ServiceNow CMDB, and notifies the OT team via Teams."
tags:
- upstream
- ot
- terraform
- servicenow
- msteams
capability:
exposes:
- type: mcp
namespace: wellpad-infra
port: 8080
tools:
- name: provision-wellpad-edge
description: "Given a well pad location and device count, run Terraform to provision edge infra, register in ServiceNow CMDB, and notify OT team."
inputParameters:
- name: well_pad_id
in: body
type: string
description: "Well pad identifier for the deployment."
- name: device_count
in: body
type: number
description: "Number of edge devices to provision."
steps:
- name: run-terraform
type: call
call: terraform.create-run
with:
workspace: "wellpad-edge-infra"
variables: "well_pad_id={{well_pad_id}},device_count={{device_count}}"
- name: register-devices
type: call
call: servicenow.create-ci
with:
well_pad_id: "{{well_pad_id}}"
device_count: "{{device_count}}"
- name: notify-ot
type: call
call: msteams.send-message
with:
channel: "ot-infrastructure"
text: "Edge infra provisioned | Well pad: {{well_pad_id}} | Devices: {{device_count}} | Terraform run: {{run-terraform.run_id}}"
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: create-run
method: POST
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: ci
path: "/table/cmdb_ci"
operations:
- name: create-ci
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/ot/channels/infrastructure/messages"
operations:
- name: send-message
method: POST
When a downhole sensor reports anomalous readings, creates a SAP PM corrective maintenance work order for the well, assigns a field technician from Workday, and sends a priority alert to the operations team via Teams.
naftiko: "0.5"
info:
label: "Well Maintenance Work Order Creation"
description: "When a downhole sensor reports anomalous readings, creates a SAP PM corrective maintenance work order for the well, assigns a field technician from Workday, and sends a priority alert to the operations team via Teams."
tags:
- oil-gas
- maintenance
- sap
- workday
- msteams
- ot
capability:
exposes:
- type: mcp
namespace: well-maintenance
port: 8080
tools:
- name: create-well-work-order
description: "Given a well functional location, anomaly description, and priority level, create a SAP PM work order, look up an available field technician in Workday, and notify the production operations channel in Teams."
inputParameters:
- name: functional_location
in: body
type: string
description: "SAP functional location for the well (e.g., PERMIAN-WELL-042)."
- name: anomaly_description
in: body
type: string
description: "Description of the sensor anomaly or failure condition."
- name: priority
in: body
type: string
description: "Work order priority: VH (very high), HI (high), ME (medium), LO (low)."
steps:
- name: get-technician
type: call
call: workday.get-available-technician
with:
functional_location: "{{functional_location}}"
- name: create-work-order
type: call
call: sap.create-pm-work-order
with:
functional_location: "{{functional_location}}"
short_text: "{{anomaly_description}}"
priority: "{{priority}}"
person_responsible: "{{get-technician.personnel_number}}"
- name: notify-operations
type: call
call: msteams.send-message
with:
channel: "production-operations"
text: "Work order {{create-work-order.order_number}} created | Priority: {{priority}} | Well: {{functional_location}} | Technician: {{get-technician.full_name}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: technicians
path: "/workers"
inputParameters:
- name: functional_location
in: query
operations:
- name: get-available-technician
method: GET
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: pm-work-orders
path: "/A_MaintenanceOrder"
operations:
- name: create-pm-work-order
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/operations/channels/production/messages"
operations:
- name: send-message
method: POST
Queries Workday for field workers who have not completed benefits enrollment, sends personalized reminders via Teams, and logs outreach in ServiceNow for HR tracking.
naftiko: "0.5"
info:
label: "Workday Benefits Enrollment Reminder for Field Workers"
description: "Queries Workday for field workers who have not completed benefits enrollment, sends personalized reminders via Teams, and logs outreach in ServiceNow for HR tracking."
tags:
- hr
- workday
- msteams
- servicenow
capability:
exposes:
- type: mcp
namespace: benefits-reminder
port: 8080
tools:
- name: send-enrollment-reminders
description: "Given an enrollment window, find field workers missing benefits enrollment in Workday, send Teams reminders, and log in ServiceNow."
inputParameters:
- name: enrollment_period
in: body
type: string
description: "Enrollment period identifier (e.g., 2026-open-enrollment)."
steps:
- name: find-pending
type: call
call: workday.get-pending-enrollments
with:
period: "{{enrollment_period}}"
- name: send-reminders
type: call
call: msteams.send-message
with:
channel: "field-hr"
text: "Benefits enrollment reminder | {{find-pending.count}} field workers pending | Period: {{enrollment_period}}"
- name: log-outreach
type: call
call: servicenow.create-hr-task
with:
description: "Benefits enrollment outreach for {{find-pending.count}} field workers"
period: "{{enrollment_period}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: enrollments
path: "/benefits/enrollments"
operations:
- name: get-pending-enrollments
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/hr/channels/field/messages"
operations:
- name: send-message
method: POST
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: hr-tasks
path: "/table/u_hr_task"
operations:
- name: create-hr-task
method: POST
Verifies that field contractors in Workday have valid safety certifications, drug test results, and site access clearances before allowing well site entry, notifying supervisors of any gaps.
naftiko: "0.5"
info:
label: "Workday Contractor Compliance Verification"
description: "Verifies that field contractors in Workday have valid safety certifications, drug test results, and site access clearances before allowing well site entry, notifying supervisors of any gaps."
tags:
- safety
- compliance
- workday
- msteams
- upstream
capability:
exposes:
- type: mcp
namespace: contractor-compliance
port: 8080
tools:
- name: verify-contractor
description: "Given a contractor worker ID, check safety certs, drug test, and site access in Workday. Notify supervisor via Teams if non-compliant."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday contingent worker ID."
- name: site_code
in: body
type: string
description: "Well site code requiring access."
steps:
- name: check-certifications
type: call
call: workday.get-worker-certifications
with:
worker_id: "{{worker_id}}"
- name: check-clearance
type: call
call: workday.get-site-access
with:
worker_id: "{{worker_id}}"
site_code: "{{site_code}}"
- name: notify-supervisor
type: call
call: msteams.send-message
with:
channel: "field-supervisors"
text: "Contractor compliance check | Worker: {{worker_id}} | Site: {{site_code}} | Certs valid: {{check-certifications.all_valid}} | Access cleared: {{check-clearance.cleared}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: certifications
path: "/workers/certifications"
inputParameters:
- name: worker_id
in: query
operations:
- name: get-worker-certifications
method: GET
- name: site-access
path: "/workers/site-access"
inputParameters:
- name: worker_id
in: query
- name: site_code
in: query
operations:
- name: get-site-access
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/field/channels/supervisors/messages"
operations:
- name: send-message
method: POST
Queries Workday for available field crew members with required certifications, matches them to pending SAP work orders, and posts the optimized schedule to the field operations Teams channel.
naftiko: "0.5"
info:
label: "Workday Field Crew Scheduling Optimizer"
description: "Queries Workday for available field crew members with required certifications, matches them to pending SAP work orders, and posts the optimized schedule to the field operations Teams channel."
tags:
- upstream
- workday
- sap
- msteams
- maintenance
capability:
exposes:
- type: mcp
namespace: crew-scheduling
port: 8080
tools:
- name: optimize-crew-schedule
description: "Given a location and date, find available certified crew in Workday, match to SAP work orders, and post schedule to Teams."
inputParameters:
- name: location
in: body
type: string
description: "Field location code (e.g., PERMIAN-BASIN-NORTH)."
- name: schedule_date
in: body
type: string
description: "Date to schedule in YYYY-MM-DD format."
steps:
- name: get-available-crew
type: call
call: workday.get-available-workers
with:
location: "{{location}}"
date: "{{schedule_date}}"
- name: get-pending-orders
type: call
call: sap.get-open-work-orders
with:
location: "{{location}}"
date: "{{schedule_date}}"
- name: post-schedule
type: call
call: msteams.send-message
with:
channel: "field-operations"
text: "Crew Schedule {{schedule_date}} | Location: {{location}} | Available crew: {{get-available-crew.count}} | Pending WOs: {{get-pending-orders.count}}"
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"
operations:
- name: get-available-workers
method: GET
- type: http
namespace: sap
baseUri: "https://exxon-s4.sap.com/sap/opu/odata/sap/PM_ORDER_CREATE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: work-orders
path: "/A_MaintenanceOrder"
operations:
- name: get-open-work-orders
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/field/channels/operations/messages"
operations:
- name: send-message
method: POST
Pulls headcount and hours worked data from Workday, combines with incident records from ServiceNow, calculates TRIR and DART rates, and pushes to Power BI for safety performance tracking.
naftiko: "0.5"
info:
label: "Workday HSE Incident Rate Dashboard"
description: "Pulls headcount and hours worked data from Workday, combines with incident records from ServiceNow, calculates TRIR and DART rates, and pushes to Power BI for safety performance tracking."
tags:
- safety
- workday
- servicenow
- power-bi
capability:
exposes:
- type: mcp
namespace: hse-rates
port: 8080
tools:
- name: calculate-hse-rates
description: "Given a business unit and period, pull Workday hours and ServiceNow incidents, calculate TRIR/DART, and push to Power BI."
inputParameters:
- name: business_unit
in: body
type: string
description: "Business unit code (e.g., upstream, refining, chemical)."
- name: period
in: body
type: string
description: "Reporting period (e.g., 2026-Q1)."
steps:
- name: get-hours
type: call
call: workday.get-hours-worked
with:
business_unit: "{{business_unit}}"
period: "{{period}}"
- name: get-incidents
type: call
call: servicenow.query-hse-incidents
with:
business_unit: "{{business_unit}}"
period: "{{period}}"
- name: push-rates
type: call
call: powerbi.push-rows
with:
dataset_id: "hse-incident-rates"
rows: "{{get-incidents.summary}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: hours
path: "/time-tracking/hours"
operations:
- name: get-hours-worked
method: GET
- type: http
namespace: servicenow
baseUri: "https://exxon.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: hse-incidents
path: "/table/u_hse_incident"
operations:
- name: query-hse-incidents
method: GET
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: datasets
path: "/datasets/hse-incident-rates/rows"
operations:
- name: push-rows
method: POST
Exports active employee headcount by department and cost center from Workday, writes a snapshot to Snowflake, and triggers a Power BI workforce planning dashboard refresh.
naftiko: "0.5"
info:
label: "Workday Payroll Headcount Snapshot"
description: "Exports active employee headcount by department and cost center from Workday, writes a snapshot to Snowflake, and triggers a Power BI workforce planning dashboard refresh."
tags:
- hr
- finance
- workday
- snowflake
- power-bi
- headcount
- reporting
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: snapshot-headcount
description: "Fetch active employee headcount from Workday, write a snapshot row to Snowflake, and trigger a Power BI workforce report refresh. Use monthly for headcount and cost planning."
inputParameters:
- name: snapshot_date
in: body
type: string
description: "Snapshot date in ISO 8601 format (YYYY-MM-DD)."
steps:
- name: export-workers
type: call
call: workday.export-workers
with:
status: "active"
- name: write-snapshot
type: call
call: snowflake.insert-snapshot
with:
snapshot_date: "{{snapshot_date}}"
records: "{{export-workers.rows}}"
- name: refresh-report
type: call
call: powerbi.trigger-refresh
with:
dataset_id: "$secrets.powerbi_workforce_dataset_id"
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"
inputParameters:
- name: status
in: query
operations:
- name: export-workers
method: GET
- type: http
namespace: snowflake
baseUri: "https://exxon.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: headcount-table
path: "/statements"
operations:
- name: insert-snapshot
method: POST
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
When a new position requisition is submitted in Workday, creates a ServiceNow approval task for the HRBP, and notifies the Talent Acquisition team via Teams.
naftiko: "0.5"
info:
label: "Workday Position Requisition Approval Routing"
description: "When a new position requisition is submitted in Workday, creates a ServiceNow approval task for the HRBP, and notifies the Talent Acquisition team via Teams."
tags:
- hr
- recruiting
- workday
- servicenow
- msteams
- approval
capability:
exposes:
- type: mcp
namespace: talent-ops
port: 8080
tools:
- name: route-position-requisition
description: "Given a Workday position requisition ID, fetch its details, create a ServiceNow approval task for the HRBP, and notify the Talent Acquisition Teams channel."
inputParameters:
- name: requisition_id
in: body
type: string
description: "Workday position requisition ID (e.g., REQ-009876)."
steps:
- name: get-requisition
type: call
call: workday.get-position-requisition
with:
requisition_id: "{{requisition_id}}"
- name: create-approval-task
type: call
call: servicenow.create-task
with:
short_description: "Position requisition: {{requisition_id}} — {{get-requisition.job_title}}"
assignment_group: "HRBP_Team"
description: "Department: {{get-requisition.department}}. Manager: {{get-requisition.manager_name}}"
- name: notify-ta-team
type: call
call: msteams.send-message
with:
channel: "talent-acquisition"
text: "New requisition: {{get-requisition.job_title}} in {{get-requisition.department}}. Approval task: {{create-approval-task.number}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: position-requisitions
path: "/positionRequisitions/{{requisition_id}}"
inputParameters:
- name: requisition_id
in: path
operations:
- name: get-position-requisition
method: GET
- type: http
namespace: servicenow
baseUri: "https://exxon.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
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/hr/channels/talent-acquisition/messages"
operations:
- name: send-message
method: POST
When an employee's position changes in Workday, updates their Salesforce user profile and Microsoft 365 group membership, and notifies their new manager via Teams.
naftiko: "0.5"
info:
label: "Workday Role Change Access Propagation"
description: "When an employee's position changes in Workday, updates their Salesforce user profile and Microsoft 365 group membership, and notifies their new manager via Teams."
tags:
- hr
- identity
- workday
- salesforce
- microsoft-365
- msteams
- role-change
capability:
exposes:
- type: mcp
namespace: access-provisioning
port: 8080
tools:
- name: propagate-role-change
description: "Given a Workday employee ID and new job profile, update the Salesforce user record, adjust Microsoft 365 group membership, and notify the new manager via Teams."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "Workday worker ID of the employee with a role change."
- name: new_job_profile
in: body
type: string
description: "New Workday job profile code or title."
steps:
- name: get-worker
type: call
call: workday.get-worker
with:
worker_id: "{{workday_employee_id}}"
- name: update-sf-user
type: call
call: salesforce.patch-user
with:
email: "{{get-worker.email}}"
Title: "{{new_job_profile}}"
Department: "{{get-worker.department}}"
- name: notify-manager
type: call
call: msteams.send-message
with:
recipient_upn: "{{get-worker.manager_email}}"
text: "Role change completed for {{get-worker.full_name}}: now {{new_job_profile}}. Salesforce updated."
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: salesforce
baseUri: "https://exxon.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User"
operations:
- name: patch-user
method: PATCH
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Checks Workday learning records for a worker to verify completion of required HSE safety training modules, and flags overdue certifications to the safety coordinator via Teams.
naftiko: "0.5"
info:
label: "Workday Safety Training Compliance Check"
description: "Checks Workday learning records for a worker to verify completion of required HSE safety training modules, and flags overdue certifications to the safety coordinator via Teams."
tags:
- safety
- training
- workday
- msteams
- compliance
capability:
exposes:
- type: mcp
namespace: safety-training
port: 8080
tools:
- name: check-safety-training
description: "Given a worker ID, verify all required HSE training modules are complete in Workday. If any are overdue, notify the safety coordinator in Teams."
inputParameters:
- name: worker_id
in: body
type: string
description: "Workday worker ID to check training compliance for."
steps:
- name: get-training-status
type: call
call: workday.get-learning-records
with:
worker_id: "{{worker_id}}"
- name: notify-overdue
type: call
call: msteams.send-message
with:
channel: "hse-compliance"
text: "Safety training check for {{worker_id}} | Overdue modules: {{get-training-status.overdue_count}} | Details: {{get-training-status.overdue_modules}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: learning
path: "/learning/records"
inputParameters:
- name: worker_id
in: query
operations:
- name: get-learning-records
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/hse/channels/compliance/messages"
operations:
- name: send-message
method: POST
Retrieves succession pipeline data from Workday for critical operational roles, identifies gaps, and posts a readiness summary to the HR leadership Teams channel.
naftiko: "0.5"
info:
label: "Workday Succession Planning for Critical Roles"
description: "Retrieves succession pipeline data from Workday for critical operational roles, identifies gaps, and posts a readiness summary to the HR leadership Teams channel."
tags:
- hr
- workday
- msteams
capability:
exposes:
- type: mcp
namespace: succession-planning
port: 8080
tools:
- name: review-succession-pipeline
description: "Given a business unit, pull succession data from Workday for critical roles and post readiness summary to Teams."
inputParameters:
- name: business_unit
in: body
type: string
description: "Business unit to review (e.g., upstream, refining)."
steps:
- name: get-succession-data
type: call
call: workday.get-succession-plans
with:
business_unit: "{{business_unit}}"
- name: post-summary
type: call
call: msteams.send-message
with:
channel: "hr-leadership"
text: "Succession Pipeline | {{business_unit}} | Critical roles: {{get-succession-data.total_roles}} | Ready now: {{get-succession-data.ready_now}} | Gaps: {{get-succession-data.gap_count}}"
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: succession
path: "/talent/succession-plans"
operations:
- name: get-succession-plans
method: GET
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msteams_token"
resources:
- name: channel-messages
path: "/teams/hr/channels/leadership/messages"
operations:
- name: send-message
method: POST