Shell Capabilities
Naftiko 0.5 capability definitions for Shell - 100 capabilities showing integration workflows and service orchestrations.
Accepts a regulatory document URL, summarizes it with Anthropic Claude, and creates a Jira task for the legal team to review the summary and action items.
naftiko: "0.5"
info:
label: "AI-Assisted Document Summarization for Regulatory Filings"
description: "Accepts a regulatory document URL, summarizes it with Anthropic Claude, and creates a Jira task for the legal team to review the summary and action items."
tags:
- ai
- legal
- compliance
- anthropic
- jira
- document-processing
capability:
exposes:
- type: mcp
namespace: legal-ai
port: 8080
tools:
- name: summarize-regulatory-document
description: "Given a URL to a regulatory filing or environmental report, use Anthropic Claude to extract a structured summary and action items, then create a Jira task for the legal team."
inputParameters:
- name: document_url
in: body
type: string
description: "Public URL to the regulatory document (PDF)."
- name: document_title
in: body
type: string
description: "Human-readable title of the regulatory document."
- name: jira_project_key
in: body
type: string
description: "Jira project key for the legal review task."
steps:
- name: summarize-document
type: call
call: "anthropic.summarize-document"
with:
documentUrl: "{{document_url}}"
documentTitle: "{{document_title}}"
- name: create-legal-task
type: call
call: "jira-legal.create-issue"
with:
project_key: "{{jira_project_key}}"
issuetype: "Task"
summary: "Regulatory review: {{document_title}}"
description: "Summary:\n{{summarize-document.summary}}\n\nAction Items:\n{{summarize-document.actionItems}}\n\nDocument: {{document_url}}"
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: summarize-document
method: POST
- type: http
namespace: jira-legal
baseUri: "https://shell.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Detects Azure spending anomalies for Shell cloud subscriptions, generates an AI summary with OpenAI, and creates a ServiceNow cost-review request with the summary.
naftiko: "0.5"
info:
label: "Azure Cloud Cost Anomaly Response"
description: "Detects Azure spending anomalies for Shell cloud subscriptions, generates an AI summary with OpenAI, and creates a ServiceNow cost-review request with the summary."
tags:
- cloud
- cost-management
- azure
- openai
- servicenow
- ai
- monitoring
capability:
exposes:
- type: mcp
namespace: cloud-cost-ops
port: 8080
tools:
- name: respond-to-cost-anomaly
description: "Given an Azure subscription ID and cost threshold, query Azure Cost Management for anomalies, summarize with OpenAI, and create a ServiceNow financial review request."
inputParameters:
- name: subscription_id
in: body
type: string
description: "Azure subscription ID to check for spending anomalies."
- name: threshold_usd
in: body
type: number
description: "Monthly budget threshold in USD above which to flag an anomaly."
- name: billing_period
in: body
type: string
description: "Billing period in YYYY-MM format."
steps:
- name: get-cost-data
type: call
call: "azure-cost.query-costs"
with:
subscriptionId: "{{subscription_id}}"
billingPeriod: "{{billing_period}}"
- name: summarize-anomaly
type: call
call: "openai.summarize-cost"
with:
costData: "{{get-cost-data.rows}}"
threshold: "{{threshold_usd}}"
- name: create-review-request
type: call
call: "snow-finance.create-request"
with:
short_description: "Azure cost anomaly: {{subscription_id}} ({{billing_period}})"
description: "{{summarize-anomaly.summary}}\n\nTotal: {{get-cost-data.totalCost}} USD vs threshold {{threshold_usd}} USD"
category: "cloud_cost_review"
consumes:
- type: http
namespace: azure-cost
baseUri: "https://management.azure.com"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: cost-queries
path: "/subscriptions/{{subscriptionId}}/providers/Microsoft.CostManagement/query"
inputParameters:
- name: subscriptionId
in: path
- name: billingPeriod
in: query
operations:
- name: query-costs
method: POST
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_token"
resources:
- name: chat-completions
path: "/chat/completions"
operations:
- name: summarize-cost
method: POST
- type: http
namespace: snow-finance
baseUri: "https://shell.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
Fetches current energy commodity prices from Bloomberg for Brent crude, 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 Brent crude, 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."
inputParameters:
- name: ticker
in: body
type: string
description: "Bloomberg ticker symbol (e.g., CO1 for Brent 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"
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
Creates and updates Confluence pages for refinery turnaround planning, pulling scope from SAP PM and resources from Workday.
naftiko: "0.5"
info:
label: "Confluence Turnaround Planning Knowledge Base"
description: "Creates and updates Confluence pages for refinery turnaround planning, pulling scope from SAP PM and resources from Workday."
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 scope and Workday resources, then update Confluence."
inputParameters:
- name: project_id
in: body
type: string
description: "Turnaround project identifier."
- name: plant_code
in: body
type: string
description: "SAP plant code."
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}}"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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://shell.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 Shell endpoint, creates a ServiceNow security incident, isolates the host, and alerts the security operations centre in Microsoft Teams.
naftiko: "0.5"
info:
label: "CrowdStrike Endpoint Threat Response"
description: "When CrowdStrike detects a threat on a Shell endpoint, creates a ServiceNow security incident, isolates the host, and alerts the security operations centre in Microsoft Teams."
tags:
- security
- endpoint
- crowdstrike
- servicenow
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: soc-ops
port: 8080
tools:
- name: respond-to-endpoint-threat
description: "Given a CrowdStrike detection ID, fetch the alert details, create a ServiceNow security incident, isolate the host via CrowdStrike, and alert the SOC Teams channel."
inputParameters:
- name: detection_id
in: body
type: string
description: "CrowdStrike Falcon detection ID."
- name: soc_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the Shell SOC."
steps:
- name: get-detection
type: call
call: "crowdstrike.get-detection"
with:
detectionId: "{{detection_id}}"
- name: create-sec-incident
type: call
call: "snow-soc.create-incident"
with:
short_description: "Endpoint threat: {{get-detection.behavior.scenario}} on {{get-detection.device.hostname}}"
severity: "1"
description: "Detection ID: {{detection_id}}\nHost: {{get-detection.device.hostname}}\nUser: {{get-detection.behavior.user_name}}\nSeverity: {{get-detection.max_severity_displayname}}"
- name: isolate-host
type: call
call: "crowdstrike-action.contain-host"
with:
deviceId: "{{get-detection.device.device_id}}"
- name: alert-soc
type: call
call: "msteams-soc.send-channel-message"
with:
channelId: "{{soc_channel_id}}"
text: "ENDPOINT THREAT: {{get-detection.device.hostname}} isolated | Detection: {{detection_id}} | Incident: {{create-sec-incident.number}} | Severity: {{get-detection.max_severity_displayname}}"
consumes:
- type: http
namespace: crowdstrike
baseUri: "https://api.crowdstrike.com"
authentication:
type: bearer
token: "$secrets.crowdstrike_token"
resources:
- name: detections
path: "/detects/entities/detect/v2"
inputParameters:
- name: detectionId
in: query
operations:
- name: get-detection
method: GET
- type: http
namespace: snow-soc
baseUri: "https://shell.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: security-incidents
path: "/table/sn_si_incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: crowdstrike-action
baseUri: "https://api.crowdstrike.com"
authentication:
type: bearer
token: "$secrets.crowdstrike_token"
resources:
- name: device-actions
path: "/devices/entities/devices-actions/v2"
operations:
- name: contain-host
method: POST
- type: http
namespace: msteams-soc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
Pulls compressor station telemetry from Datadog 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 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."
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}}"
- 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://shell-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
When Datadog detects a refinery process sensor anomaly, creates a ServiceNow HSSE incident, creates a SAP PM inspection work order, and alerts the plant operations team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Datadog Refinery Sensor Alert Response"
description: "When Datadog detects a refinery process sensor anomaly, creates a ServiceNow HSSE incident, creates a SAP PM inspection work order, and alerts the plant operations team in Microsoft Teams."
tags:
- operations
- hsse
- manufacturing
- datadog
- servicenow
- sap-pm
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: refinery-ops
port: 8080
tools:
- name: respond-to-refinery-alert
description: "Given a Datadog monitor ID for a refinery sensor anomaly and the affected SAP equipment number, create a ServiceNow HSSE incident, a SAP PM inspection work order, and alert the plant ops Teams channel."
inputParameters:
- name: monitor_id
in: body
type: string
description: "Datadog monitor ID for the refinery sensor alert."
- name: equipment_number
in: body
type: string
description: "SAP equipment number for the affected asset."
- name: plant_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the plant operations team."
steps:
- name: get-alert
type: call
call: "datadog-refinery.get-monitor"
with:
monitorId: "{{monitor_id}}"
- name: create-hsse-incident
type: call
call: "snow-refinery.create-incident"
with:
short_description: "Refinery sensor anomaly: {{get-alert.name}} on equipment {{equipment_number}}"
urgency: "1"
category: "process_safety"
description: "Monitor: {{monitor_id}}\nEquipment: {{equipment_number}}\nAlert: {{get-alert.query}}"
- name: create-inspection-order
type: call
call: "sap-inspection.create-work-order"
with:
equipment: "{{equipment_number}}"
description: "Inspection following Datadog sensor alert: {{get-alert.name}}"
orderType: "PM02"
priority: "1"
- name: alert-plant-ops
type: call
call: "msteams-plant.send-channel-message"
with:
channelId: "{{plant_channel_id}}"
text: "REFINERY ALERT: {{get-alert.name}} on equipment {{equipment_number}} | Incident: {{create-hsse-incident.number}} | PM Work Order: {{create-inspection-order.WorkOrder}}"
consumes:
- type: http
namespace: datadog-refinery
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/{{monitorId}}"
inputParameters:
- name: monitorId
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: snow-refinery
baseUri: "https://shell.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: sap-inspection
baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: inspection-orders
path: "/MaintenanceOrder"
operations:
- name: create-work-order
method: POST
- type: http
namespace: msteams-plant
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
When a new hire record is created in SAP SuccessFactors, opens a ServiceNow onboarding task, provisions Microsoft Entra ID, and sends a Teams welcome message.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire record is created in SAP SuccessFactors, opens a ServiceNow onboarding task, provisions Microsoft Entra ID, and sends a Teams welcome message."
tags:
- hr
- onboarding
- sap-successfactors
- servicenow
- microsoft-entra
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Given a SuccessFactors employee ID and start date, open a ServiceNow onboarding task, provision an Entra ID account, and send a Teams welcome message."
inputParameters:
- name: employee_id
in: body
type: string
description: "SuccessFactors employee ID for the new hire."
- name: start_date
in: body
type: string
description: "Employee start date in ISO 8601 format."
steps:
- name: get-employee
type: call
call: "successfactors.get-employee"
with:
employeeId: "{{employee_id}}"
- name: create-onboarding-task
type: call
call: "servicenow.create-task"
with:
short_description: "New hire onboarding: {{get-employee.displayName}}"
category: "hr_onboarding"
assignment_group: "IT_Onboarding"
- name: provision-entra
type: call
call: "entra.create-user"
with:
displayName: "{{get-employee.displayName}}"
userPrincipalName: "{{get-employee.workEmail}}"
department: "{{get-employee.department}}"
- name: send-welcome
type: call
call: "msteams-onboard.send-message"
with:
recipient_upn: "{{get-employee.workEmail}}"
text: "Welcome to Shell, {{get-employee.firstName}}! Your onboarding ticket is {{create-onboarding-task.number}}. Your start date is {{start_date}}."
consumes:
- type: http
namespace: successfactors
baseUri: "https://api4.successfactors.com/odata/v2"
authentication:
type: bearer
token: "$secrets.sf_token"
resources:
- name: employees
path: "/PerPerson('{{employeeId}}')"
inputParameters:
- name: employeeId
in: path
operations:
- name: get-employee
method: GET
- type: http
namespace: servicenow
baseUri: "https://shell.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: create-task
method: POST
- type: http
namespace: entra
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: msteams-onboard
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
When an environmental exceedance is detected in Datadog sensor monitoring, creates a ServiceNow environmental incident and notifies the HSSE team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Environmental Compliance Incident Reporting"
description: "When an environmental exceedance is detected in Datadog sensor monitoring, creates a ServiceNow environmental incident and notifies the HSSE team via Microsoft Teams."
tags:
- safety
- hsse
- compliance
- datadog
- servicenow
- microsoft-teams
- environmental
capability:
exposes:
- type: mcp
namespace: hsse-ops
port: 8080
tools:
- name: report-environmental-incident
description: "Given a Datadog monitor ID for an environmental sensor exceedance, create a ServiceNow HSSE incident and notify the safety team in Microsoft Teams."
inputParameters:
- name: monitor_id
in: body
type: string
description: "Datadog monitor ID that detected the environmental exceedance."
- name: sensor_location
in: body
type: string
description: "Physical location identifier of the sensor that triggered the alert."
- name: hsse_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the HSSE team."
steps:
- name: get-monitor
type: call
call: "datadog.get-monitor"
with:
monitorId: "{{monitor_id}}"
- name: create-hsse-incident
type: call
call: "snow-hsse.create-incident"
with:
short_description: "Environmental exceedance at {{sensor_location}}: {{get-monitor.name}}"
urgency: "1"
category: "environmental"
description: "Monitor: {{monitor_id}}\nLocation: {{sensor_location}}\nQuery: {{get-monitor.query}}\nThreshold exceeded at: {{get-monitor.lastTriggeredTs}}"
- name: notify-hsse-team
type: call
call: "msteams-hsse.send-channel-message"
with:
channelId: "{{hsse_channel_id}}"
text: "ENVIRONMENTAL ALERT: Exceedance at {{sensor_location}} | {{get-monitor.name}} | Incident: {{create-hsse-incident.number}}"
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/{{monitorId}}"
inputParameters:
- name: monitorId
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: snow-hsse
baseUri: "https://shell.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-hsse
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
Triggers a GitHub Actions workflow to deploy subsea control system firmware, verifies status, and logs in ServiceNow for change management.
naftiko: "0.5"
info:
label: "GitHub Actions Subsea Control System Deployment"
description: "Triggers a GitHub Actions workflow to deploy subsea control system firmware, verifies status, and logs in ServiceNow for change management."
tags:
- upstream
- devops
- github
- servicenow
- ot
capability:
exposes:
- type: mcp
namespace: subsea-deploy
port: 8080
tools:
- name: deploy-subsea-firmware
description: "Given a firmware version and target system, trigger GitHub deployment and log in ServiceNow."
inputParameters:
- name: firmware_version
in: body
type: string
description: "Firmware version to deploy."
- name: target_system
in: body
type: string
description: "Target subsea control system."
- 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: "shell/subsea-controls"
workflow: "deploy.yml"
ref: "{{firmware_version}}"
- name: log-deployment
type: call
call: servicenow.update-change-request
with:
change_request_id: "{{change_request_id}}"
status: "implemented"
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflows
path: "/repos/shell/subsea-controls/actions/workflows/deploy.yml/dispatches"
operations:
- name: trigger-workflow
method: POST
- type: http
namespace: servicenow
baseUri: "https://shell.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 for a Shell digital platform, creates a ServiceNow incident and alerts the DevOps team via Microsoft Teams.
naftiko: "0.5"
info:
label: "GitHub Pipeline Failure to ServiceNow Incident"
description: "On a GitHub Actions pipeline failure for a Shell digital platform, creates a ServiceNow incident and alerts the DevOps team via Microsoft Teams."
tags:
- devops
- cicd
- github
- servicenow
- microsoft-teams
- incident-response
capability:
exposes:
- type: mcp
namespace: devops-ops
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub workflow run ID and repo, fetch failure details, create a ServiceNow incident for the DevOps team, and alert the channel in Microsoft Teams."
inputParameters:
- name: github_repo
in: body
type: string
description: "GitHub repository in owner/repo format."
- name: run_id
in: body
type: integer
description: "GitHub Actions workflow run ID that failed."
- name: teams_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the DevOps alert."
steps:
- name: get-run
type: call
call: "github.get-workflow-run"
with:
repo: "{{github_repo}}"
runId: "{{run_id}}"
- name: create-incident
type: call
call: "snow-devops.create-incident"
with:
short_description: "Pipeline failure: {{get-run.name}} on {{get-run.head_branch}}"
urgency: "2"
description: "Repo: {{github_repo}}\nRun: {{run_id}}\nBranch: {{get-run.head_branch}}\nCommit: {{get-run.head_sha}}\nTriggered by: {{get-run.actor.login}}"
- name: alert-teams
type: call
call: "msteams-devops.send-channel-message"
with:
channelId: "{{teams_channel_id}}"
text: "Pipeline failure: {{github_repo}} ({{get-run.head_branch}}) | Incident: {{create-incident.number}} | Run: {{run_id}}"
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/{{runId}}"
inputParameters:
- name: repo
in: path
- name: runId
in: path
operations:
- name: get-workflow-run
method: GET
- type: http
namespace: snow-devops
baseUri: "https://shell.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-devops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
Exports active employee headcount from SAP SuccessFactors by department and cost center and pushes the snapshot to Power BI for workforce planning dashboards.
naftiko: "0.5"
info:
label: "Headcount Snapshot for Workforce Planning"
description: "Exports active employee headcount from SAP SuccessFactors by department and cost center and pushes the snapshot to Power BI for workforce planning dashboards."
tags:
- hr
- finance
- reporting
- sap-successfactors
- power-bi
- workforce-planning
capability:
exposes:
- type: mcp
namespace: workforce-reporting
port: 8080
tools:
- name: publish-headcount-snapshot
description: "Export active headcount by department and cost center from SuccessFactors and push the dataset to Power BI for workforce planning and budget review."
inputParameters:
- name: powerbi_dataset_id
in: body
type: string
description: "Power BI dataset ID to push headcount rows into."
- name: powerbi_table_name
in: body
type: string
description: "Table name in the Power BI dataset, e.g. Headcount."
steps:
- name: get-headcount
type: call
call: "sf-hc.get-headcount"
- name: push-dataset
type: call
call: "powerbi-hc.push-rows"
with:
datasetId: "{{powerbi_dataset_id}}"
tableName: "{{powerbi_table_name}}"
rows: "{{get-headcount.results}}"
consumes:
- type: http
namespace: sf-hc
baseUri: "https://api4.successfactors.com/odata/v2"
authentication:
type: bearer
token: "$secrets.sf_token"
resources:
- name: emp-jobs
path: "/EmpJob"
operations:
- name: get-headcount
method: GET
- type: http
namespace: powerbi-hc
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-rows
path: "/datasets/{{datasetId}}/tables/{{tableName}}/rows"
inputParameters:
- name: datasetId
in: path
- name: tableName
in: path
operations:
- name: push-rows
method: POST
Pulls active subsea project issues from Jira, aggregates status, and posts a daily digest to the deepwater operations Teams channel.
naftiko: "0.5"
info:
label: "Jira Subsea Project Status Digest"
description: "Pulls active subsea project issues from Jira, aggregates status, and posts a daily digest to the deepwater operations Teams channel."
tags:
- upstream
- jira
- msteams
capability:
exposes:
- type: mcp
namespace: subsea-digest
port: 8080
tools:
- name: generate-subsea-digest
description: "Given a Jira project key, compile a status digest and post to Teams."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key for subsea operations."
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: "deepwater-operations"
text: "Subsea Digest | Active: {{get-issues.in_progress_count}} | Blocked: {{get-issues.blocked_count}}"
consumes:
- type: http
namespace: jira
baseUri: "https://shell.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/deepwater/channels/operations/messages"
operations:
- name: send-message
method: POST
Retrieves LinkedIn Campaign Manager performance metrics for Shell's brand campaigns, compares against targets in Salesforce, and posts a weekly digest to Microsoft Teams.
naftiko: "0.5"
info:
label: "LinkedIn Campaign Performance Digest"
description: "Retrieves LinkedIn Campaign Manager performance metrics for Shell's brand campaigns, compares against targets in Salesforce, and posts a weekly digest to Microsoft Teams."
tags:
- marketing
- social
- linkedin
- salesforce
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: marketing-reporting
port: 8080
tools:
- name: digest-linkedin-campaign-performance
description: "Fetch impressions, clicks, and spend from LinkedIn Campaign Manager for a campaign, compare to Salesforce targets, and post a performance digest to the marketing Teams channel."
inputParameters:
- name: linkedin_campaign_id
in: body
type: string
description: "LinkedIn Campaign Manager campaign ID."
- name: salesforce_campaign_id
in: body
type: string
description: "Salesforce campaign ID holding target KPIs."
- name: teams_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the marketing team digest."
steps:
- name: get-linkedin-stats
type: call
call: "linkedin.get-campaign-stats"
with:
campaignId: "{{linkedin_campaign_id}}"
- name: get-sf-targets
type: call
call: "salesforce-mkt.get-campaign"
with:
campaignId: "{{salesforce_campaign_id}}"
- name: post-digest
type: call
call: "msteams-mkt.send-channel-message"
with:
channelId: "{{teams_channel_id}}"
text: "LinkedIn Campaign Digest: Impressions={{get-linkedin-stats.impressions}} (target {{get-sf-targets.expectedImpressions}}) | Clicks={{get-linkedin-stats.clicks}} | Spend=${{get-linkedin-stats.spend}}"
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: campaign-stats
path: "/adAnalyticsV2"
inputParameters:
- name: campaignId
in: query
operations:
- name: get-campaign-stats
method: GET
- type: http
namespace: salesforce-mkt
baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: campaigns
path: "/sobjects/Campaign/{{campaignId}}"
inputParameters:
- name: campaignId
in: path
operations:
- name: get-campaign
method: GET
- type: http
namespace: msteams-mkt
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
Queries OSIsoft PI (via REST) for upstream production metrics, loads the data into Snowflake, and triggers a Power BI dataset refresh for the operations dashboard.
naftiko: "0.5"
info:
label: "Oil Production Metrics Dashboard Refresh"
description: "Queries OSIsoft PI (via REST) for upstream production metrics, loads the data into Snowflake, and triggers a Power BI dataset refresh for the operations dashboard."
tags:
- operations
- data
- osisoft-pi
- snowflake
- power-bi
- reporting
capability:
exposes:
- type: mcp
namespace: production-reporting
port: 8080
tools:
- name: refresh-production-dashboard
description: "Fetch upstream production metrics (oil, gas, water injection rates) from OSIsoft PI Web API, load into Snowflake, and trigger a Power BI dataset refresh. Use for daily operations dashboard updates."
inputParameters:
- name: pi_server_url
in: body
type: string
description: "OSIsoft PI Web API base URL for the production asset server."
- name: asset_path
in: body
type: string
description: "PI asset database path for the production element, e.g. \\\\Server\\Field\\Well."
- name: snowflake_table
in: body
type: string
description: "Fully qualified Snowflake table to insert production data."
- name: powerbi_dataset_id
in: body
type: string
description: "Power BI dataset ID to refresh after data load."
steps:
- name: get-pi-data
type: call
call: "osipi.get-element-data"
with:
assetPath: "{{asset_path}}"
- name: load-snowflake
type: call
call: "snowflake-prod.insert-rows"
with:
tableName: "{{snowflake_table}}"
rows: "{{get-pi-data.items}}"
- name: refresh-powerbi
type: call
call: "powerbi.trigger-refresh"
with:
datasetId: "{{powerbi_dataset_id}}"
consumes:
- type: http
namespace: osipi
baseUri: "https://pi-server.shell.com/piwebapi"
authentication:
type: basic
username: "$secrets.pi_user"
password: "$secrets.pi_password"
resources:
- name: element-data
path: "/assetdatabases"
inputParameters:
- name: assetPath
in: query
operations:
- name: get-element-data
method: GET
- type: http
namespace: snowflake-prod
baseUri: "https://shell.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: table-rows
path: "/statements"
operations:
- name: insert-rows
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/{{datasetId}}/refreshes"
inputParameters:
- name: datasetId
in: path
operations:
- name: trigger-refresh
method: POST
When an employee termination is recorded in SAP SuccessFactors, deactivates the Okta account, revokes all active sessions, and confirms in Microsoft Teams.
naftiko: "0.5"
info:
label: "Okta Employee Deprovisioning on Termination"
description: "When an employee termination is recorded in SAP SuccessFactors, deactivates the Okta account, revokes all active sessions, and confirms in Microsoft Teams."
tags:
- hr
- identity
- security
- sap-successfactors
- okta
- offboarding
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: offboarding-security
port: 8080
tools:
- name: deprovision-terminated-employee
description: "Given a SuccessFactors employee ID and Okta user ID, verify termination, deactivate Okta user, clear all sessions, and confirm via Teams."
inputParameters:
- name: employee_id
in: body
type: string
description: "SuccessFactors employee ID for the terminated employee."
- name: okta_user_id
in: body
type: string
description: "Okta user ID to deactivate."
- name: hr_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the HR deprovisioning confirmation."
steps:
- name: verify-termination
type: call
call: "sf-term.get-employee-status"
with:
employeeId: "{{employee_id}}"
- name: deactivate-okta
type: call
call: "okta.deactivate-user"
with:
userId: "{{okta_user_id}}"
- name: clear-sessions
type: call
call: "okta-sessions.clear-user-sessions"
with:
userId: "{{okta_user_id}}"
- name: confirm-teams
type: call
call: "msteams-offboard.send-channel-message"
with:
channelId: "{{hr_channel_id}}"
text: "Deprovisioning complete for employee {{employee_id}}. Okta account deactivated and sessions cleared."
consumes:
- type: http
namespace: sf-term
baseUri: "https://api4.successfactors.com/odata/v2"
authentication:
type: bearer
token: "$secrets.sf_token"
resources:
- name: employment-records
path: "/EmpEmployment(personIdExternal='{{employeeId}}')"
inputParameters:
- name: employeeId
in: path
operations:
- name: get-employee-status
method: GET
- type: http
namespace: okta
baseUri: "https://shell.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: user-deactivate
path: "/users/{{userId}}/lifecycle/deactivate"
inputParameters:
- name: userId
in: path
operations:
- name: deactivate-user
method: POST
- type: http
namespace: okta-sessions
baseUri: "https://shell.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: user-sessions
path: "/users/{{userId}}/sessions"
inputParameters:
- name: userId
in: path
operations:
- name: clear-user-sessions
method: DELETE
- type: http
namespace: msteams-offboard
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
Performs quarterly privileged access review for OT systems by pulling Okta assignments, cross-referencing Workday, and logging findings in ServiceNow.
naftiko: "0.5"
info:
label: "Okta Privileged Access Review for OT Systems"
description: "Performs quarterly privileged access review for OT systems by pulling Okta assignments, cross-referencing Workday, and logging findings 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 in Workday, and log 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://shell.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://shell.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
Generates a weekly upstream field performance report from Snowflake and publishes it to Power BI, then sends a summary notification to the asset management team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Power BI Upstream Performance Report"
description: "Generates a weekly upstream field performance report from Snowflake and publishes it to Power BI, then sends a summary notification to the asset management team in Microsoft Teams."
tags:
- operations
- reporting
- snowflake
- power-bi
- microsoft-teams
- upstream
capability:
exposes:
- type: mcp
namespace: upstream-reporting
port: 8080
tools:
- name: publish-upstream-performance-report
description: "Execute a Snowflake query for upstream field KPIs (production efficiency, uptime, deferment), push to Power BI, and notify the asset management Teams channel."
inputParameters:
- name: field_name
in: body
type: string
description: "Upstream field name to generate the report for."
- name: report_week
in: body
type: string
description: "Report week ending date in YYYY-MM-DD format."
- name: powerbi_dataset_id
in: body
type: string
description: "Power BI dataset ID for the upstream performance report."
- name: teams_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for asset management notification."
steps:
- name: get-field-kpis
type: call
call: "snowflake-upstream.query-field-kpis"
with:
fieldName: "{{field_name}}"
weekEnding: "{{report_week}}"
- name: push-powerbi
type: call
call: "powerbi-upstream.push-rows"
with:
datasetId: "{{powerbi_dataset_id}}"
tableName: "UpstreamPerformance"
rows: "{{get-field-kpis.rows}}"
- name: notify-asset-mgmt
type: call
call: "msteams-upstream.send-channel-message"
with:
channelId: "{{teams_channel_id}}"
text: "Weekly upstream performance report published for {{field_name}} (week ending {{report_week}}). Production efficiency: {{get-field-kpis.productionEfficiency}}%"
consumes:
- type: http
namespace: snowflake-upstream
baseUri: "https://shell.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: field-kpi-queries
path: "/statements"
operations:
- name: query-field-kpis
method: POST
- type: http
namespace: powerbi-upstream
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-rows
path: "/datasets/{{datasetId}}/tables/{{tableName}}/rows"
inputParameters:
- name: datasetId
in: path
- name: tableName
in: path
operations:
- name: push-rows
method: POST
- type: http
namespace: msteams-upstream
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
Aggregates project milestone data from Jira for Shell's renewable energy portfolio and publishes a weekly status digest to Power BI and a Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Renewable Energy Project Status Digest"
description: "Aggregates project milestone data from Jira for Shell's renewable energy portfolio and publishes a weekly status digest to Power BI and a Microsoft Teams channel."
tags:
- operations
- project-management
- renewables
- jira
- power-bi
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: renewables-reporting
port: 8080
tools:
- name: publish-renewables-status-digest
description: "Query Jira for open milestones and overdue tasks in the renewable energy project portfolio, push a status summary to Power BI, and notify the project leadership Teams channel."
inputParameters:
- name: jira_project_keys
in: body
type: string
description: "Comma-separated Jira project keys for the renewables portfolio, e.g. WIND,SOLAR,HYDRO."
- name: powerbi_dataset_id
in: body
type: string
description: "Power BI dataset ID for the renewable portfolio status."
- name: leadership_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for leadership notification."
steps:
- name: get-project-status
type: call
call: "jira-renewables.search-issues"
with:
jql: "project in ({{jira_project_keys}}) AND issuetype = Epic AND status != Done"
- name: push-powerbi
type: call
call: "powerbi-renewables.push-rows"
with:
datasetId: "{{powerbi_dataset_id}}"
tableName: "RenewablesPortfolio"
rows: "{{get-project-status.issues}}"
- name: notify-leadership
type: call
call: "msteams-renewables.send-channel-message"
with:
channelId: "{{leadership_channel_id}}"
text: "Renewables Portfolio Digest: {{get-project-status.total}} active epics across {{jira_project_keys}}. Power BI report updated."
consumes:
- type: http
namespace: jira-renewables
baseUri: "https://shell.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issue-search
path: "/issue/search"
inputParameters:
- name: jql
in: query
operations:
- name: search-issues
method: GET
- type: http
namespace: powerbi-renewables
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-rows
path: "/datasets/{{datasetId}}/tables/{{tableName}}/rows"
inputParameters:
- name: datasetId
in: path
- name: tableName
in: path
operations:
- name: push-rows
method: POST
- type: http
namespace: msteams-renewables
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
Enriches a Salesforce energy customer account with financial data from ZoomInfo and upstream contract details from SAP, then updates the account record.
naftiko: "0.5"
info:
label: "Salesforce Customer Account Enrichment"
description: "Enriches a Salesforce energy customer account with financial data from ZoomInfo and upstream contract details from SAP, then updates the account record."
tags:
- crm
- sales
- salesforce
- zoominfo
- sap-s4hana
- data-enrichment
capability:
exposes:
- type: mcp
namespace: crm-enrichment
port: 8080
tools:
- name: enrich-energy-customer
description: "Given a Salesforce account ID and SAP customer number, fetch firmographic data from ZoomInfo, pull contract details from SAP S/4HANA, and update the Salesforce account with enriched fields."
inputParameters:
- name: salesforce_account_id
in: body
type: string
description: "Salesforce account ID to enrich."
- name: sap_customer_number
in: body
type: string
description: "SAP customer number for the same account."
steps:
- name: get-sf-account
type: call
call: "salesforce.get-account"
with:
accountId: "{{salesforce_account_id}}"
- name: enrich-zoominfo
type: call
call: "zoominfo.search-company"
with:
companyName: "{{get-sf-account.Name}}"
website: "{{get-sf-account.Website}}"
- name: get-sap-contracts
type: call
call: "sap-contracts.get-customer-contracts"
with:
customerNumber: "{{sap_customer_number}}"
- name: update-account
type: call
call: "salesforce-update.update-account"
with:
accountId: "{{salesforce_account_id}}"
employeeCount: "{{enrich-zoominfo.employeeCount}}"
revenue: "{{enrich-zoominfo.revenue}}"
activeContracts: "{{get-sap-contracts.count}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{accountId}}"
inputParameters:
- name: accountId
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: zoominfo
baseUri: "https://api.zoominfo.com/search"
authentication:
type: bearer
token: "$secrets.zoominfo_token"
resources:
- name: companies
path: "/company"
operations:
- name: search-company
method: POST
- type: http
namespace: sap-contracts
baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/API_SALES_CONTRACT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: customer-contracts
path: "/A_SalesContract"
inputParameters:
- name: customerNumber
in: query
operations:
- name: get-customer-contracts
method: GET
- type: http
namespace: salesforce-update
baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: account-update
path: "/sobjects/Account/{{accountId}}"
inputParameters:
- name: accountId
in: path
operations:
- name: update-account
method: PATCH
Queries Salesforce for energy supply contracts approaching renewal, creates follow-up tasks, and sends a digest to the commercial operations Teams channel.
naftiko: "0.5"
info:
label: "Salesforce Energy Contract Renewal Tracker"
description: "Queries Salesforce for energy supply contracts approaching renewal, creates follow-up tasks, and sends a digest to the commercial operations Teams channel."
tags:
- trading
- salesforce
- msteams
- downstream
capability:
exposes:
- type: mcp
namespace: contract-renewal
port: 8080
tools:
- name: track-contract-renewals
description: "Find contracts approaching renewal in Salesforce, 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."
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"
consumes:
- type: http
namespace: salesforce
baseUri: "https://shell.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
When a Salesforce energy sales opportunity closes as won, creates a corresponding SAP S/4HANA sales order and writes the order number back to Salesforce.
naftiko: "0.5"
info:
label: "Salesforce Opportunity to SAP Sales Order"
description: "When a Salesforce energy sales opportunity closes as won, creates a corresponding SAP S/4HANA sales order and writes the order number back to Salesforce."
tags:
- sales
- crm
- erp
- salesforce
- sap-s4hana
- order-management
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: create-sales-order-from-opportunity
description: "Given a Closed Won Salesforce opportunity ID, fetch the opportunity, create a SAP S/4HANA sales order, and write the SAP order number back to the Salesforce opportunity record."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID with Stage = Closed Won."
steps:
- name: get-opportunity
type: call
call: "salesforce-opp.get-opportunity"
with:
opportunityId: "{{opportunity_id}}"
- name: create-so
type: call
call: "sap-sd.create-sales-order"
with:
soldToParty: "{{get-opportunity.AccountId}}"
orderValue: "{{get-opportunity.Amount}}"
currency: "{{get-opportunity.CurrencyIsoCode}}"
orderType: "OR"
- name: update-opportunity
type: call
call: "salesforce-sf-update.update-opportunity"
with:
opportunityId: "{{opportunity_id}}"
sapSalesOrderNumber: "{{create-so.SalesOrder}}"
consumes:
- type: http
namespace: salesforce-opp
baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunityId}}"
inputParameters:
- name: opportunityId
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: sap-sd
baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/API_SALES_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: sales-orders
path: "/A_SalesOrder"
operations:
- name: create-sales-order
method: POST
- type: http
namespace: salesforce-sf-update
baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunity-update
path: "/sobjects/Opportunity/{{opportunityId}}"
inputParameters:
- name: opportunityId
in: path
operations:
- name: update-opportunity
method: PATCH
Queries SAP Ariba for energy supply contracts expiring within a configurable window and sends expiry reminders to contract owners via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Expiry Notification"
description: "Queries SAP Ariba for energy supply contracts expiring within a configurable window and sends expiry reminders to contract owners via Microsoft Teams."
tags:
- procurement
- contract-management
- sap-ariba
- microsoft-teams
- monitoring
capability:
exposes:
- type: mcp
namespace: contract-monitoring
port: 8080
tools:
- name: notify-expiring-contracts
description: "Query Ariba for energy supply contracts expiring within a given number of days and send a Teams renewal reminder to each contract owner."
inputParameters:
- name: days_to_expiry
in: body
type: integer
description: "Days ahead to look for expiring Ariba contracts."
steps:
- name: get-expiring-contracts
type: call
call: "ariba-contracts.get-expiring-contracts"
with:
daysToExpiry: "{{days_to_expiry}}"
- name: notify-owner
type: call
call: "msteams-contract.send-message"
with:
recipient_upn: "{{get-expiring-contracts.ownerEmail}}"
text: "Ariba contract {{get-expiring-contracts.contractId}} with {{get-expiring-contracts.supplierName}} expires on {{get-expiring-contracts.expiryDate}}. Please initiate renewal."
consumes:
- type: http
namespace: ariba-contracts
baseUri: "https://openapi.ariba.com/api/contract-management/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: contracts
path: "/contracts"
inputParameters:
- name: daysToExpiry
in: query
operations:
- name: get-expiring-contracts
method: GET
- type: http
namespace: msteams-contract
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Pulls contract spend data from SAP Ariba for a commodity category, compares against SAP budget, and logs variance to Snowflake.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Spend Analysis"
description: "Pulls contract spend data from SAP Ariba for a commodity category, compares against SAP budget, and logs variance to 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."
inputParameters:
- name: commodity_category
in: body
type: string
description: "Commodity category code."
- 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://shell.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://shell-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://shell.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: variance
path: "/statements"
operations:
- name: insert-variance
method: POST
Initiates a new supplier onboarding request in SAP Ariba, creates a Jira task for the procurement team to complete supplier validation, and sends welcome instructions via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Ariba Supplier Onboarding"
description: "Initiates a new supplier onboarding request in SAP Ariba, creates a Jira task for the procurement team to complete supplier validation, and sends welcome instructions via Microsoft Teams."
tags:
- procurement
- supplier-management
- sap-ariba
- jira
- microsoft-teams
- onboarding
capability:
exposes:
- type: mcp
namespace: supplier-onboarding
port: 8080
tools:
- name: onboard-supplier
description: "Given a supplier name and contact email, initiate an Ariba supplier onboarding registration, create a Jira validation task, and send instructions to the supplier contact via Teams."
inputParameters:
- name: supplier_name
in: body
type: string
description: "Legal name of the supplier to onboard."
- name: supplier_contact_email
in: body
type: string
description: "Primary contact email for the supplier."
- name: commodity_category
in: body
type: string
description: "SAP Ariba commodity category code for this supplier."
steps:
- name: create-ariba-registration
type: call
call: "ariba.create-supplier-registration"
with:
supplierName: "{{supplier_name}}"
contactEmail: "{{supplier_contact_email}}"
commodityCode: "{{commodity_category}}"
- name: create-validation-task
type: call
call: "jira.create-issue"
with:
project_key: "PROC"
issuetype: "Task"
summary: "Supplier validation: {{supplier_name}}"
description: "Ariba registration ID: {{create-ariba-registration.registrationId}}\nContact: {{supplier_contact_email}}\nCategory: {{commodity_category}}"
- name: notify-supplier
type: call
call: "msteams-supplier.send-message"
with:
recipient_upn: "{{supplier_contact_email}}"
text: "Welcome to Shell's supplier portal. Your registration ID is {{create-ariba-registration.registrationId}}. Please complete your profile at {{create-ariba-registration.portalUrl}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/supplier-registration/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: supplier-registrations
path: "/registrations"
operations:
- name: create-supplier-registration
method: POST
- type: http
namespace: jira
baseUri: "https://shell.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: msteams-supplier
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves biofuels feedstock procurement data from SAP, returning supplier, feedstock type, volume, and sustainability certification status.
naftiko: "0.5"
info:
label: "SAP Biofuels Feedstock Procurement Tracker"
description: "Retrieves biofuels feedstock procurement data from SAP, returning supplier, feedstock type, volume, and sustainability certification status."
tags:
- downstream
- renewable-energy
- sap
- procurement
capability:
exposes:
- type: mcp
namespace: biofuels-procurement
port: 8080
tools:
- name: get-biofuels-procurement
description: "Look up biofuels feedstock by purchase order. Returns supplier, feedstock type, volume, and cert status."
inputParameters:
- name: po_number
in: body
type: string
description: "SAP purchase order number."
call: sap.get-biofuels-po
with:
po_number: "{{po_number}}"
outputParameters:
- name: supplier
type: string
mapping: "$.d.SupplierName"
- name: feedstock_type
type: string
mapping: "$.d.FeedstockType"
- name: volume_mt
type: number
mapping: "$.d.TotalQuantity"
- name: iscc_certified
type: boolean
mapping: "$.d.ISCCCertified"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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-biofuels-po
method: GET
Retrieves batch quality inspection results from SAP QM for chemical plant batches, returning conformance status and disposition.
naftiko: "0.5"
info:
label: "SAP Chemical Plant Batch Quality Check"
description: "Retrieves batch quality inspection results from SAP QM for chemical plant batches, returning 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."
inputParameters:
- name: batch_number
in: body
type: string
description: "SAP batch number."
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"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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
Retrieves pending expense reports from SAP Concur for energy project travel, applies a policy check, and notifies approvers via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Concur Travel Expense Report Approval"
description: "Retrieves pending expense reports from SAP Concur for energy project travel, applies a policy check, and notifies approvers via Microsoft Teams."
tags:
- finance
- travel
- expense-management
- sap-concur
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: expense-approval
port: 8080
tools:
- name: approve-expense-report
description: "Given a Concur expense report ID and approver UPN, fetch the report, post the approval, and notify the submitter in Teams. Use for automating energy project expense approval chains."
inputParameters:
- name: report_id
in: body
type: string
description: "SAP Concur expense report ID."
- name: approver_upn
in: body
type: string
description: "UPN of the manager approving the report."
- name: decision
in: body
type: string
description: "Approval action: 'approve' or 'send_back'."
steps:
- name: get-report
type: call
call: "concur.get-expense-report"
with:
reportId: "{{report_id}}"
- name: post-decision
type: call
call: "concur.approve-report"
with:
reportId: "{{report_id}}"
action: "{{decision}}"
- name: notify-submitter
type: call
call: "msteams-expense.send-message"
with:
recipient_upn: "{{get-report.ownerEmail}}"
text: "Your expense report {{report_id}} ({{get-report.name}}, {{get-report.total}}) has been {{decision}}d by {{approver_upn}}."
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/reportdigests/{{reportId}}"
inputParameters:
- name: reportId
in: path
operations:
- name: get-expense-report
method: GET
- name: expense-approvals
path: "/expense/reports/{{reportId}}/approve"
inputParameters:
- name: reportId
in: path
operations:
- name: approve-report
method: POST
- type: http
namespace: msteams-expense
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Retrieves corrosion inhibitor injection rates from SAP for pipeline segments, returning current dosage, target rate, and compliance.
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."
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 equipment number."
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://shell-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 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 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 specs."
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://shell-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."
inputParameters:
- name: terminal_id
in: body
type: string
description: "SAP plant code for the storage terminal."
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://shell-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 spare parts availability from SAP for deepwater drilling rigs, returning stock levels, warehouse location, and lead times.
naftiko: "0.5"
info:
label: "SAP Deepwater Rig Spare Parts Lookup"
description: "Retrieves spare parts availability from SAP for deepwater drilling rigs, returning stock levels, warehouse location, and lead times."
tags:
- upstream
- inventory
- sap
- maintenance
capability:
exposes:
- type: mcp
namespace: rig-spares
port: 8080
tools:
- name: lookup-spare-parts
description: "Look up spare parts by material number and rig plant code. Returns stock, location, and lead time."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number for the spare part."
- name: rig_code
in: body
type: string
description: "SAP plant code for the deepwater rig."
call: sap.get-spare-stock
with:
material_number: "{{material_number}}"
rig_code: "{{rig_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://shell-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"
operations:
- name: get-spare-stock
method: GET
Retrieves demurrage claim data from SAP for marine terminal operations, returning vessel wait times, rates, and claim amounts.
naftiko: "0.5"
info:
label: "SAP Demurrage Claim Tracker"
description: "Retrieves demurrage claim data from SAP for marine terminal operations, returning vessel wait times, rates, and claim amounts."
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 wait time, rate, and claim amount."
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://shell-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, 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, 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."
inputParameters:
- name: delivery_number
in: body
type: string
description: "SAP delivery document number."
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"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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
Retrieves EV charging station operational status from SAP, returning charger availability, utilization rate, and fault codes for Shell Recharge network management.
naftiko: "0.5"
info:
label: "SAP EV Charging Station Status Lookup"
description: "Retrieves EV charging station operational status from SAP, returning charger availability, utilization rate, and fault codes for Shell Recharge network management."
tags:
- downstream
- renewable-energy
- sap
capability:
exposes:
- type: mcp
namespace: ev-charging
port: 8080
tools:
- name: get-charger-status
description: "Look up EV charging station status by site ID. Returns charger availability, utilization, and active faults."
inputParameters:
- name: site_id
in: body
type: string
description: "Shell Recharge site identifier."
call: sap.get-charger-status
with:
site_id: "{{site_id}}"
outputParameters:
- name: available_chargers
type: number
mapping: "$.d.AvailableCount"
- name: utilization_pct
type: number
mapping: "$.d.UtilizationRate"
- name: active_faults
type: number
mapping: "$.d.FaultCount"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/PM_EQUIPMENT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: chargers
path: "/A_Equipment(Site='{{site_id}}')"
inputParameters:
- name: site_id
in: path
operations:
- name: get-charger-status
method: GET
When a contingent worker is approved in SAP Fieldglass for a Shell project, provisions an Okta guest account and opens a ServiceNow access request.
naftiko: "0.5"
info:
label: "SAP Fieldglass Contractor Onboarding"
description: "When a contingent worker is approved in SAP Fieldglass for a Shell project, provisions an Okta guest account and opens a ServiceNow access request."
tags:
- hr
- contingent-workforce
- sap-fieldglass
- okta
- servicenow
- onboarding
capability:
exposes:
- type: mcp
namespace: contractor-onboarding
port: 8080
tools:
- name: onboard-contractor
description: "Given a Fieldglass work order ID, fetch the approved contractor details, provision an Okta guest account, and open a ServiceNow access request for project systems."
inputParameters:
- name: work_order_id
in: body
type: string
description: "SAP Fieldglass work order ID for the approved contractor."
steps:
- name: get-work-order
type: call
call: "fieldglass.get-work-order"
with:
workOrderId: "{{work_order_id}}"
- name: provision-okta-guest
type: call
call: "okta-guest.create-user"
with:
firstName: "{{get-work-order.workerFirstName}}"
lastName: "{{get-work-order.workerLastName}}"
email: "{{get-work-order.workerEmail}}"
- name: create-access-request
type: call
call: "snow-access.create-request"
with:
short_description: "Contractor access request: {{get-work-order.workerName}}"
category: "contractor_access"
description: "Fieldglass work order: {{work_order_id}}\nProject: {{get-work-order.projectName}}\nOkta user: {{provision-okta-guest.userId}}"
consumes:
- type: http
namespace: fieldglass
baseUri: "https://www.fieldglass.net/api/v1"
authentication:
type: bearer
token: "$secrets.fieldglass_token"
resources:
- name: work-orders
path: "/workorders/{{workOrderId}}"
inputParameters:
- name: workOrderId
in: path
operations:
- name: get-work-order
method: GET
- type: http
namespace: okta-guest
baseUri: "https://shell.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: snow-access
baseUri: "https://shell.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: requests
path: "/table/sc_request"
operations:
- name: create-request
method: POST
Retrieves flare gas recovery rates from SAP for a given refinery unit, returning recovery percentage, flare volume, and compliance status.
naftiko: "0.5"
info:
label: "SAP Flare Gas Recovery Monitoring"
description: "Retrieves flare gas recovery rates from SAP for a given refinery unit, returning recovery percentage, flare volume, and compliance status."
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 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://shell-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.
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."
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."
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"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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"
operations:
- name: get-rack-price
method: GET
Retrieves NGL recovery data from SAP for a gas processing plant, returning volumes by product and recovery efficiency.
naftiko: "0.5"
info:
label: "SAP Gas Plant NGL Recovery Report"
description: "Retrieves NGL recovery data from SAP for a gas processing plant, returning volumes by product and recovery efficiency."
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."
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://shell-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"
operations:
- name: get-ngl-data
method: GET
Checks the period-close status for a given SAP S/4HANA company code and fiscal period, and notifies the finance team in Microsoft Teams with the open/closed status of each accounting area.
naftiko: "0.5"
info:
label: "SAP GL Period-Close Status Check"
description: "Checks the period-close status for a given SAP S/4HANA company code and fiscal period, and notifies the finance team in Microsoft Teams with the open/closed status of each accounting area."
tags:
- finance
- erp
- sap-s4hana
- microsoft-teams
- period-close
capability:
exposes:
- type: mcp
namespace: period-close
port: 8080
tools:
- name: check-period-close-status
description: "Given a SAP company code and fiscal period, retrieve the period-close status from S/4HANA and post a status summary to the finance Microsoft Teams channel."
inputParameters:
- name: company_code
in: body
type: string
description: "SAP company code, e.g. GB01 for Shell UK."
- name: fiscal_year
in: body
type: string
description: "Fiscal year in YYYY format."
- name: fiscal_period
in: body
type: string
description: "Fiscal period number, e.g. 03 for March."
- name: finance_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the finance team."
steps:
- name: get-period-status
type: call
call: "sap-close.get-period-close-status"
with:
CompanyCode: "{{company_code}}"
FiscalYear: "{{fiscal_year}}"
FiscalPeriod: "{{fiscal_period}}"
- name: notify-finance
type: call
call: "msteams-finance.send-channel-message"
with:
channelId: "{{finance_channel_id}}"
text: "Period close status for {{company_code}} {{fiscal_year}}/{{fiscal_period}}: FI={{get-period-status.fiStatus}} | CO={{get-period-status.coStatus}} | MM={{get-period-status.mmStatus}}"
consumes:
- type: http
namespace: sap-close
baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/API_FISCALYEARVARIANT_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: period-close-status
path: "/A_FiscalYearVariant"
inputParameters:
- name: CompanyCode
in: query
- name: FiscalYear
in: query
- name: FiscalPeriod
in: query
operations:
- name: get-period-close-status
method: GET
- type: http
namespace: msteams-finance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
Retrieves heat exchanger performance data from SAP, calculating fouling factor trends and flagging units needing cleaning.
naftiko: "0.5"
info:
label: "SAP Heat Exchanger Fouling Monitor"
description: "Retrieves heat exchanger performance data from SAP, calculating fouling factor trends and flagging units needing cleaning."
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."
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://shell-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 inventory levels at Shell hydrogen fueling stations from SAP, returning current stock, delivery schedule, and station status.
naftiko: "0.5"
info:
label: "SAP Hydrogen Fueling Station Inventory"
description: "Retrieves hydrogen inventory levels at Shell hydrogen fueling stations from SAP, returning current stock, delivery schedule, and station status."
tags:
- downstream
- renewable-energy
- sap
capability:
exposes:
- type: mcp
namespace: h2-station
port: 8080
tools:
- name: get-h2-station-inventory
description: "Look up hydrogen fueling station inventory by site ID. Returns stock level, next delivery, and station status."
inputParameters:
- name: site_id
in: body
type: string
description: "Shell hydrogen station site identifier."
call: sap.get-h2-inventory
with:
site_id: "{{site_id}}"
outputParameters:
- name: current_kg
type: number
mapping: "$.d.CurrentStock"
- name: next_delivery
type: string
mapping: "$.d.NextDeliveryDate"
- name: station_status
type: string
mapping: "$.d.OperationalStatus"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: h2-inventory
path: "/A_MaterialStock(Plant='{{site_id}}')"
inputParameters:
- name: site_id
in: path
operations:
- name: get-h2-inventory
method: GET
Retrieves intercompany crude oil transfer pricing from SAP, returning base price, quality adjustment, and transportation differential.
naftiko: "0.5"
info:
label: "SAP Intercompany Crude Transfer Pricing"
description: "Retrieves intercompany crude oil transfer pricing from SAP, returning base price, quality adjustment, and transportation differential."
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."
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://shell-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"
operations:
- name: get-transfer-price
method: GET
Retrieves production volumes from SAP and calculates royalty payments for mineral rights owners, posting results to Snowflake.
naftiko: "0.5"
info:
label: "SAP Lease Royalty Payment Calculation"
description: "Retrieves production volumes from SAP and calculates royalty payments for mineral rights owners, posting results to Snowflake."
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}}"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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://shell.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, and vessel assignment.
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, and vessel assignment."
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 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"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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 Shell lubricant product order fulfillment in SAP, returning order status, shipped quantities, and delivery confirmation.
naftiko: "0.5"
info:
label: "SAP Lubricants Order Fulfillment Tracker"
description: "Tracks Shell lubricant product order fulfillment in SAP, returning order status, shipped quantities, and delivery confirmation."
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 status, shipped quantities, and delivery dates."
inputParameters:
- name: sales_order
in: body
type: string
description: "SAP sales order number."
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://shell-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, and loading window.
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, and loading window."
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. Returns vessel names, cargo types, and windows."
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://shell-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"
operations:
- name: get-vessel-schedule
method: GET
Monitors material stock levels in SAP and triggers reorder alerts when inventory falls below the safety stock threshold for refinery and terminal consumables.
naftiko: "0.5"
info:
label: "SAP Material Inventory Reorder Alert"
description: "Monitors material stock levels in SAP and triggers reorder alerts when inventory falls below the safety stock threshold for refinery and terminal consumables."
tags:
- inventory
- sap
- supply-chain
- alerting
capability:
exposes:
- type: mcp
namespace: material-reorder
port: 8080
tools:
- name: check-reorder-status
description: "Check material inventory levels against safety stock thresholds and return items needing reorder."
inputParameters:
- name: plant_code
in: body
type: string
description: "SAP plant code for the facility."
- name: storage_location
in: body
type: string
description: "SAP storage location identifier."
call: "sap.get-stock-levels"
with:
plant_code: "{{plant_code}}"
storage_location: "{{storage_location}}"
outputParameters:
- name: below_threshold_items
type: array
mapping: "$.d.results"
- name: total_alerts
type: number
mapping: "$.d.__count"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/MM_STOCK_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: stock-levels
path: "/A_MaterialStock?$filter=Plant eq '{{plant_code}}' and StorageLocation eq '{{storage_location}}' and AvailableStock lt SafetyStock"
inputParameters:
- name: plant_code
in: query
- name: storage_location
in: query
operations:
- name: get-stock-levels
method: GET
Retrieves the material safety data sheet for a given chemical material number from SAP EHS, returning hazard classifications, handling instructions, and PPE requirements.
naftiko: "0.5"
info:
label: "SAP Material Safety Data Sheet Lookup"
description: "Retrieves the material safety data sheet for a given chemical material number from SAP EHS, returning hazard classifications, handling instructions, and PPE requirements."
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, and PPE requirements."
inputParameters:
- name: material_number
in: body
type: string
description: "SAP material number for the chemical."
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://shell-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 natural gas pipeline nomination balances from SAP, returning nominated vs actual flow volumes and imbalance quantity.
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 and imbalance quantity."
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, and imbalance volumes."
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://shell-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
Creates preventive maintenance work orders in SAP for FPSO vessel equipment, scheduling critical rotating equipment inspections and hull integrity checks.
naftiko: "0.5"
info:
label: "SAP Offshore FPSO Maintenance Scheduler"
description: "Creates preventive maintenance work orders in SAP for FPSO vessel equipment, scheduling critical rotating equipment inspections and hull integrity checks."
tags:
- upstream
- maintenance
- sap
- safety
capability:
exposes:
- type: mcp
namespace: fpso-maintenance
port: 8080
tools:
- name: schedule-fpso-pm
description: "Given an FPSO functional location and PM type, create a work order in SAP and notify the offshore team via Teams."
inputParameters:
- name: fpso_location
in: body
type: string
description: "SAP functional location for the FPSO."
- name: pm_type
in: body
type: string
description: "PM type: rotating-equipment, hull-integrity, process-safety."
steps:
- name: create-work-order
type: call
call: sap.create-pm-work-order
with:
functional_location: "{{fpso_location}}"
short_text: "Scheduled {{pm_type}} for FPSO {{fpso_location}}"
- name: notify-team
type: call
call: msteams.send-message
with:
channel: "offshore-operations"
text: "FPSO PM scheduled | {{fpso_location}} | Type: {{pm_type}} | WO: {{create-work-order.order_number}}"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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/offshore/channels/operations/messages"
operations:
- name: send-message
method: POST
Retrieves pipeline integrity inspection records from SAP, returning last inspection date, wall thickness, corrosion rate, and next scheduled inspection.
naftiko: "0.5"
info:
label: "SAP Pipeline Integrity Inspection Tracker"
description: "Retrieves pipeline integrity inspection records from SAP, returning last inspection date, wall thickness, 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 by functional location. Returns inspection history and corrosion data."
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"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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"
operations:
- name: get-inspection-records
method: GET
Converts a ServiceNow equipment breakdown incident into a SAP PM work order, assigns a field technician, and notifies the maintenance team in Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Plant Maintenance Work Order Creation"
description: "Converts a ServiceNow equipment breakdown incident into a SAP PM work order, assigns a field technician, and notifies the maintenance team in Microsoft Teams."
tags:
- manufacturing
- maintenance
- sap-pm
- servicenow
- microsoft-teams
- hsse
capability:
exposes:
- type: mcp
namespace: maintenance-ops
port: 8080
tools:
- name: create-pm-work-order
description: "Given a ServiceNow breakdown incident number and SAP equipment number, create a SAP PM corrective maintenance work order and notify the maintenance team in Teams."
inputParameters:
- name: incident_number
in: body
type: string
description: "ServiceNow incident number for the equipment breakdown."
- name: equipment_number
in: body
type: string
description: "SAP PM equipment number requiring maintenance."
- name: teams_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the maintenance team."
steps:
- name: get-incident
type: call
call: "snow-maint.get-incident"
with:
number: "{{incident_number}}"
- name: create-work-order
type: call
call: "sap-pm.create-work-order"
with:
equipment: "{{equipment_number}}"
description: "{{get-incident.short_description}}"
priority: "{{get-incident.priority}}"
orderType: "PM01"
- name: notify-maintenance
type: call
call: "msteams-maint.send-channel-message"
with:
channelId: "{{teams_channel_id}}"
text: "SAP PM work order {{create-work-order.WorkOrder}} created for equipment {{equipment_number}} | Incident: {{incident_number}} | Priority: {{get-incident.priority}}"
consumes:
- type: http
namespace: snow-maint
baseUri: "https://shell.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: number
in: query
operations:
- name: get-incident
method: GET
- type: http
namespace: sap-pm
baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/API_MAINTENANCEORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: maintenance-orders
path: "/MaintenanceOrder"
operations:
- name: create-work-order
method: POST
- type: http
namespace: msteams-maint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
Checks catalyst inventory levels in SAP for refinery process units, returning available quantity, reorder status, and remaining catalyst life.
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 status, and remaining catalyst life."
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 stock, reorder status, and remaining 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."
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://shell-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"
operations:
- name: get-catalyst-stock
method: GET
Retrieves energy consumption data from SAP for refinery units including steam, electricity, and fuel gas, and pushes to Power BI.
naftiko: "0.5"
info:
label: "SAP Refinery Energy Consumption Report"
description: "Retrieves energy consumption data from SAP for refinery units including steam, electricity, and fuel gas, and pushes to Power BI."
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."
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://shell-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."
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."
- 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://shell-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-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 fuel inventory levels at Shell retail stations from SAP, returning stock by grade, tank capacity, and days of supply remaining.
naftiko: "0.5"
info:
label: "SAP Retail Station Fuel Inventory"
description: "Retrieves fuel inventory levels at Shell retail stations from SAP, returning stock by grade, tank capacity, and days of supply remaining."
tags:
- downstream
- inventory
- sap
capability:
exposes:
- type: mcp
namespace: retail-fuel
port: 8080
tools:
- name: get-station-inventory
description: "Look up retail station fuel inventory by station ID. Returns stock by grade and days of supply."
inputParameters:
- name: station_id
in: body
type: string
description: "Shell retail station identifier."
call: sap.get-fuel-inventory
with:
station_id: "{{station_id}}"
outputParameters:
- name: regular_gallons
type: number
mapping: "$.d.RegularStock"
- name: premium_gallons
type: number
mapping: "$.d.PremiumStock"
- name: diesel_gallons
type: number
mapping: "$.d.DieselStock"
- name: days_of_supply
type: number
mapping: "$.d.DaysOfSupply"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-s4.sap.com/sap/opu/odata/sap/MM_INVENTORY_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: fuel-inventory
path: "/A_MaterialStock(Plant='{{station_id}}')"
inputParameters:
- name: station_id
in: path
operations:
- name: get-fuel-inventory
method: GET
Retrieves a pending purchase order from SAP S/4HANA for review, posts an approval decision, and notifies the procurement manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP S/4HANA Purchase Order Approval"
description: "Retrieves a pending purchase order from SAP S/4HANA for review, posts an approval decision, and notifies the procurement manager via Microsoft Teams."
tags:
- procurement
- erp
- sap-s4hana
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: approve-purchase-order
description: "Given a SAP purchase order number and approval decision, post the decision to SAP S/4HANA and notify the procurement manager in Microsoft Teams. Use for automating the PO approval loop."
inputParameters:
- name: po_number
in: body
type: string
description: "SAP purchase order number, e.g. 4500001234."
- name: decision
in: body
type: string
description: "Approval decision: 'approve' or 'reject'."
- name: approver_upn
in: body
type: string
description: "UPN of the approver for Teams notification."
steps:
- name: get-po
type: call
call: "sap-mm.get-po"
with:
poNumber: "{{po_number}}"
- name: post-approval
type: call
call: "sap-mm.approve-po"
with:
poNumber: "{{po_number}}"
decision: "{{decision}}"
- name: notify-approver
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{approver_upn}}"
text: "PO {{po_number}} ({{get-po.supplierName}}, {{get-po.totalAmount}}) has been {{decision}}d. SAP document: {{post-approval.documentNumber}}"
consumes:
- type: http
namespace: sap-mm
baseUri: "https://shell-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('{{poNumber}}')"
inputParameters:
- name: poNumber
in: path
operations:
- name: get-po
method: GET
- name: approve-po
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Enrolls employees in mandatory safety and compliance training in SAP SuccessFactors Learning and sends calendar invites via Microsoft 365.
naftiko: "0.5"
info:
label: "SAP SuccessFactors Learning Compliance Enrollment"
description: "Enrolls employees in mandatory safety and compliance training in SAP SuccessFactors Learning and sends calendar invites via Microsoft 365."
tags:
- hr
- learning
- compliance
- sap-successfactors
- microsoft-365
- hsse
capability:
exposes:
- type: mcp
namespace: compliance-learning
port: 8080
tools:
- name: enroll-compliance-training
description: "Given an employee ID and mandatory compliance course ID, enroll the employee in SuccessFactors Learning and send an Outlook calendar invite for the training date."
inputParameters:
- name: employee_id
in: body
type: string
description: "SuccessFactors employee ID."
- name: course_id
in: body
type: string
description: "SuccessFactors Learning compliance course ID."
- name: training_date
in: body
type: string
description: "Training session date in ISO 8601 format."
steps:
- name: enroll-user
type: call
call: "sf-learning.enroll-user"
with:
userId: "{{employee_id}}"
courseId: "{{course_id}}"
- name: get-employee-email
type: call
call: "sf-emails.get-email"
with:
employeeId: "{{employee_id}}"
- name: send-calendar-invite
type: call
call: "m365.create-calendar-event"
with:
recipientEmail: "{{get-employee-email.email}}"
subject: "Mandatory Safety Training: {{enroll-user.courseTitle}}"
startDate: "{{training_date}}"
consumes:
- type: http
namespace: sf-learning
baseUri: "https://api4.successfactors.com/learning/odatav4/public"
authentication:
type: bearer
token: "$secrets.sf_token"
resources:
- name: enrollments
path: "/enrollments"
operations:
- name: enroll-user
method: POST
- type: http
namespace: sf-emails
baseUri: "https://api4.successfactors.com/odata/v2"
authentication:
type: bearer
token: "$secrets.sf_token"
resources:
- name: employee-emails
path: "/PerEmail(personIdExternal='{{employeeId}}')"
inputParameters:
- name: employeeId
in: path
operations:
- name: get-email
method: GET
- type: http
namespace: m365
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: calendar-events
path: "/users/{{recipientEmail}}/events"
inputParameters:
- name: recipientEmail
in: path
operations:
- name: create-calendar-event
method: POST
Checks the status of a SAP SuccessFactors EC Payroll run for a given payroll area and notifies the HR payroll team via Microsoft Teams when complete or on error.
naftiko: "0.5"
info:
label: "SAP SuccessFactors Payroll Run Monitoring"
description: "Checks the status of a SAP SuccessFactors EC Payroll run for a given payroll area and notifies the HR payroll team via Microsoft Teams when complete or on error."
tags:
- hr
- payroll
- sap-successfactors
- microsoft-teams
- monitoring
capability:
exposes:
- type: mcp
namespace: payroll-monitoring
port: 8080
tools:
- name: monitor-payroll-run
description: "Given a payroll area and pay period, fetch the SAP payroll run status from SuccessFactors EC Payroll and notify the HR team channel in Microsoft Teams."
inputParameters:
- name: payroll_area
in: body
type: string
description: "SAP payroll area code, e.g. GB for UK monthly payroll."
- name: pay_period
in: body
type: string
description: "Pay period in YYYYMM format, e.g. 202603."
- name: hr_channel_id
in: body
type: string
description: "Microsoft Teams channel ID for the HR payroll notification."
steps:
- name: get-payroll-status
type: call
call: "sf-payroll.get-payroll-run"
with:
payrollArea: "{{payroll_area}}"
payPeriod: "{{pay_period}}"
- name: notify-hr
type: call
call: "msteams-payroll.send-channel-message"
with:
channelId: "{{hr_channel_id}}"
text: "Payroll run {{payroll_area}}/{{pay_period}}: Status={{get-payroll-status.status}}, Employees={{get-payroll-status.employeeCount}}, Errors={{get-payroll-status.errorCount}}"
consumes:
- type: http
namespace: sf-payroll
baseUri: "https://api4.successfactors.com/odata/v2"
authentication:
type: bearer
token: "$secrets.sf_token"
resources:
- name: payroll-runs
path: "/PayrollRun"
inputParameters:
- name: payrollArea
in: query
- name: payPeriod
in: query
operations:
- name: get-payroll-run
method: GET
- type: http
namespace: msteams-payroll
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{teamId}}/channels/{{channelId}}/messages"
inputParameters:
- name: channelId
in: path
operations:
- name: send-channel-message
method: POST
Processes an employee role change in SAP SuccessFactors, updates Okta group memberships for the new role, and logs the change in a Jira HR ticket.
naftiko: "0.5"
info:
label: "SAP SuccessFactors Role Change Processing"
description: "Processes an employee role change in SAP SuccessFactors, updates Okta group memberships for the new role, and logs the change in a Jira HR ticket."
tags:
- hr
- identity
- sap-successfactors
- okta
- jira
- role-change
capability:
exposes:
- type: mcp
namespace: role-change-ops
port: 8080
tools:
- name: process-role-change
description: "Given a SuccessFactors employee ID, new job code, and Okta user ID, update the employee's job code in SuccessFactors, sync Okta group memberships, and log the change in Jira HR."
inputParameters:
- name: employee_id
in: body
type: string
description: "SuccessFactors employee ID undergoing the role change."
- name: new_job_code
in: body
type: string
description: "New job code to assign in SuccessFactors."
- name: okta_user_id
in: body
type: string
description: "Okta user ID to update group memberships for."
steps:
- name: update-job-code
type: call
call: "sf-role.update-employee-job"
with:
employeeId: "{{employee_id}}"
jobCode: "{{new_job_code}}"
- name: update-okta-groups
type: call
call: "okta-groups.update-user-groups"
with:
userId: "{{okta_user_id}}"
newRole: "{{new_job_code}}"
- name: log-change
type: call
call: "jira-role.create-issue"
with:
project_key: "HR"
issuetype: "Task"
summary: "Role change processed: {{employee_id}} to {{new_job_code}}"
description: "Employee: {{employee_id}}\nNew job code: {{new_job_code}}\nOkta user: {{okta_user_id}}\nOkta groups updated: {{update-okta-groups.groupsUpdated}}"
consumes:
- type: http
namespace: sf-role
baseUri: "https://api4.successfactors.com/odata/v2"
authentication:
type: bearer
token: "$secrets.sf_token"
resources:
- name: employee-jobs
path: "/EmpJob(employeeId='{{employeeId}}')"
inputParameters:
- name: employeeId
in: path
operations:
- name: update-employee-job
method: PATCH
- type: http
namespace: okta-groups
baseUri: "https://shell.okta.com/api/v1"
authentication:
type: apikey
key: "Authorization"
value: "$secrets.okta_token"
placement: header
resources:
- name: user-group-membership
path: "/users/{{userId}}/groups"
inputParameters:
- name: userId
in: path
operations:
- name: update-user-groups
method: PUT
- type: http
namespace: jira-role
baseUri: "https://shell.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Retrieves safety certification and compliance training records from SAP SuccessFactors for offshore and refinery personnel, flagging expired or soon-to-expire certifications.
naftiko: "0.5"
info:
label: "SAP SuccessFactors Safety Certification Tracker"
description: "Retrieves safety certification and compliance training records from SAP SuccessFactors for offshore and refinery personnel, flagging expired or soon-to-expire certifications."
tags:
- hse
- compliance
- sap
- workforce
capability:
exposes:
- type: mcp
namespace: safety-certifications
port: 8080
tools:
- name: get-safety-certifications
description: "Look up safety certification status for an employee by person ID in SAP SuccessFactors."
inputParameters:
- name: person_id
in: body
type: string
description: "SAP SuccessFactors person ID."
- name: certification_type
in: body
type: string
description: "Certification type code, e.g. H2S, BOSIET, HUET."
call: "successfactors.get-certifications"
with:
person_id: "{{person_id}}"
certification_type: "{{certification_type}}"
outputParameters:
- name: certification_status
type: string
mapping: "$.d.results[0].status"
- name: expiry_date
type: string
mapping: "$.d.results[0].expirationDate"
- name: days_until_expiry
type: number
mapping: "$.d.results[0].daysUntilExpiry"
consumes:
- type: http
namespace: successfactors
baseUri: "https://api.successfactors.com/odata/v2"
authentication:
type: bearer
token: "$secrets.successfactors_token"
resources:
- name: certifications
path: "/Certification?$filter=userId eq '{{person_id}}' and certificationType eq '{{certification_type}}'"
inputParameters:
- name: person_id
in: query
- name: certification_type
in: query
operations:
- name: get-certifications
method: GET
Retrieves the latest tank gauge reading from SAP for a specified storage tank, returning product level, temperature, 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, 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, and available capacity."
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_c
type: number
mapping: "$.d.Temperature"
- name: available_capacity_bbl
type: number
mapping: "$.d.AvailableCapacity"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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, logging results in Snowflake.
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, logging results in Snowflake."
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 BOL 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://shell-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://shell.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, compares to budget, and posts variance summary to Teams.
naftiko: "0.5"
info:
label: "SAP Turnaround Cost Tracking"
description: "Pulls turnaround project cost actuals from SAP, compares to budget, and posts variance summary to Teams."
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, 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 | 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://shell-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, and clearing document number.
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, and clearing document number."
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, and clearing document."
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://shell-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 EHS, 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 EHS, 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 effluent quality by outfall ID. Returns measured values and compliance status."
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: compliant
type: boolean
mapping: "$.d.WithinPermitLimits"
consumes:
- type: http
namespace: sap
baseUri: "https://shell-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.
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."
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."
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://shell-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"
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.
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."
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://shell-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 team."
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}}"
- 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"
consumes:
- type: http
namespace: servicenow
baseUri: "https://shell.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://shell.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, creates a Confluence replacement plan, and opens Ariba procurement requisitions.
naftiko: "0.5"
info:
label: "ServiceNow IT Asset Lifecycle Audit"
description: "Queries ServiceNow CMDB for IT assets nearing end-of-life, creates a Confluence replacement plan, and opens Ariba procurement requisitions."
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, find aging assets, create Confluence plan, and raise Ariba requisitions."
inputParameters:
- name: asset_category
in: body
type: string
description: "Asset category to audit."
- name: eol_months
in: body
type: number
description: "Months until end-of-life to flag."
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}}"
body: "{{find-aging-assets.summary}}"
- name: create-requisition
type: call
call: ariba.create-requisition
with:
items: "{{find-aging-assets.critical_assets}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://shell.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://shell.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://shell.ariba.com/api/procurement"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: requisitions
path: "/requisitions"
operations:
- name: create-requisition
method: POST
Initiates a Management of Change workflow in ServiceNow for process safety modifications, routing through hazard review and HSE sign-off with Teams notifications.
naftiko: "0.5"
info:
label: "ServiceNow Management of Change Workflow"
description: "Initiates a Management of Change workflow in ServiceNow for process safety modifications, routing through hazard review and HSE sign-off with Teams notifications."
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 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}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://shell.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
Creates a ServiceNow investigation record for process safety events, assigns an investigation team from Workday, logs details in Snowflake, and notifies HSE leadership via Teams.
naftiko: "0.5"
info:
label: "ServiceNow Process Safety Event Investigation"
description: "Creates a ServiceNow investigation record for process safety events, assigns an investigation team from Workday, logs 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, 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}}"
- name: log-event
type: call
call: snowflake.insert-pse-record
with:
investigation_id: "{{create-investigation.sys_id}}"
facility: "{{facility}}"
- name: alert-leadership
type: call
call: msteams.send-message
with:
channel: "hse-leadership"
text: "PSE Alert | {{severity}} | Facility: {{facility}} | Investigation: {{create-investigation.number}}"
consumes:
- type: http
namespace: servicenow
baseUri: "https://shell.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://shell.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 stakeholders via Teams, and pulling revised throughput from SAP.
naftiko: "0.5"
info:
label: "ServiceNow Refinery Outage Management"
description: "Manages unplanned refinery unit outages by creating a ServiceNow major incident, notifying stakeholders via Teams, and pulling revised throughput 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, notify stakeholders, and pull revised throughput."
inputParameters:
- name: unit_id
in: body
type: string
description: "Refinery unit identifier."
- name: outage_type
in: body
type: string
description: "Type: 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}}"
- 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 | Unit: {{unit_id}} | Type: {{outage_type}} | Est: {{estimated_duration_hrs}}h | Impact: {{get-throughput-impact.daily_bbl}} bbl/d"
consumes:
- type: http
namespace: servicenow
baseUri: "https://shell.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-major-incident
method: POST
- type: http
namespace: sap
baseUri: "https://shell-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
Retrieves a draft energy trading contract from Salesforce, routes it for legal sign-off via DocuSign, and updates the Salesforce opportunity status on completion.
naftiko: "0.5"
info:
label: "Shell Energy Trading Contract Approval"
description: "Retrieves a draft energy trading contract from Salesforce, routes it for legal sign-off via DocuSign, and updates the Salesforce opportunity status on completion."
tags:
- sales
- contract-management
- salesforce
- docusign
- trading
- approval
capability:
exposes:
- type: mcp
namespace: contract-approval
port: 8080
tools:
- name: route-trading-contract
description: "Given a Salesforce opportunity ID and contract document URL, create a DocuSign envelope for legal signature and update the Salesforce opportunity stage to Pending Legal Sign-Off."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "Salesforce opportunity ID for the trading contract."
- name: contract_document_url
in: body
type: string
description: "URL to the contract PDF document to route for signature."
- name: signer_email
in: body
type: string
description: "Email address of the legal signatory."
steps:
- name: get-opportunity
type: call
call: "salesforce-contract.get-opportunity"
with:
opportunityId: "{{opportunity_id}}"
- name: create-envelope
type: call
call: "docusign.create-envelope"
with:
documentUrl: "{{contract_document_url}}"
signerEmail: "{{signer_email}}"
subject: "Contract approval: {{get-opportunity.Name}}"
- name: update-opportunity-stage
type: call
call: "salesforce-stage.update-opportunity"
with:
opportunityId: "{{opportunity_id}}"
stageName: "Pending Legal Sign-Off"
docusignEnvelopeId: "{{create-envelope.envelopeId}}"
consumes:
- type: http
namespace: salesforce-contract
baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunityId}}"
inputParameters:
- name: opportunityId
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: docusign
baseUri: "https://www.docusign.net/restapi/v2.1"
authentication:
type: bearer
token: "$secrets.docusign_token"
resources:
- name: envelopes
path: "/accounts/$secrets.docusign_account_id/envelopes"
operations:
- name: create-envelope
method: POST
- type: http
namespace: salesforce-stage
baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunity-stage
path: "/sobjects/Opportunity/{{opportunityId}}"
inputParameters:
- name: opportunityId
in: path
operations:
- name: update-opportunity
method: PATCH
When a Qualtrics NPS survey response is received from a Shell energy customer, updates the Salesforce account NPS score and creates a Jira follow-up task for the account team.
naftiko: "0.5"
info:
label: "Shell NPS Survey Response Processing"
description: "When a Qualtrics NPS survey response is received from a Shell energy customer, updates the Salesforce account NPS score and creates a Jira follow-up task for the account team."
tags:
- crm
- customer-success
- qualtrics
- salesforce
- jira
- nps
capability:
exposes:
- type: mcp
namespace: nps-ops
port: 8080
tools:
- name: process-nps-response
description: "Given a Qualtrics response ID and Salesforce account ID, fetch the NPS score, update the Salesforce account, and create a Jira task if the score is detractor (0-6)."
inputParameters:
- name: qualtrics_survey_id
in: body
type: string
description: "Qualtrics survey ID."
- name: qualtrics_response_id
in: body
type: string
description: "Qualtrics survey response ID."
- name: salesforce_account_id
in: body
type: string
description: "Salesforce account ID to update with the NPS score."
steps:
- name: get-response
type: call
call: "qualtrics.get-response"
with:
surveyId: "{{qualtrics_survey_id}}"
responseId: "{{qualtrics_response_id}}"
- name: update-sf-nps
type: call
call: "salesforce-nps.update-account"
with:
accountId: "{{salesforce_account_id}}"
npsScore: "{{get-response.npsScore}}"
npsVerbatim: "{{get-response.verbatim}}"
- name: create-followup-task
type: call
call: "jira-nps.create-issue"
with:
project_key: "CS"
issuetype: "Task"
summary: "NPS detractor follow-up: {{salesforce_account_id}} (score {{get-response.npsScore}})"
description: "Account: {{salesforce_account_id}}\nScore: {{get-response.npsScore}}\nFeedback: {{get-response.verbatim}}\nSurvey response: {{qualtrics_response_id}}"
consumes:
- type: http
namespace: qualtrics
baseUri: "https://shell.qualtrics.com/API/v3"
authentication:
type: apikey
key: "X-API-TOKEN"
value: "$secrets.qualtrics_token"
placement: header
resources:
- name: survey-responses
path: "/surveys/{{surveyId}}/responses/{{responseId}}"
inputParameters:
- name: surveyId
in: path
- name: responseId
in: path
operations:
- name: get-response
method: GET
- type: http
namespace: salesforce-nps
baseUri: "https://shell.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: account-nps
path: "/sobjects/Account/{{accountId}}"
inputParameters:
- name: accountId
in: path
operations:
- name: update-account
method: PATCH
- type: http
namespace: jira-nps
baseUri: "https://shell.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Queries Snowflake for carbon capture and storage project data including CO2 injection volumes and storage capacity utilization, 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 and storage capacity utilization, 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 data and 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://shell.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 Shell's carbon credit portfolio including voluntary and compliance credits, tracks vintage and registry, and pushes to Power BI.
naftiko: "0.5"
info:
label: "Snowflake Carbon Credit Portfolio Tracker"
description: "Queries Snowflake for Shell's carbon credit portfolio including voluntary and compliance credits, tracks vintage and registry, and pushes to Power BI."
tags:
- environmental
- trading
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: carbon-credits
port: 8080
tools:
- name: track-carbon-portfolio
description: "Given a credit type and date range, query carbon credit positions from Snowflake and push to Power BI."
inputParameters:
- name: credit_type
in: body
type: string
description: "Credit type: voluntary, eu-ets, uk-ets, all."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: query-credits
type: call
call: snowflake.query-carbon-credits
with:
credit_type: "{{credit_type}}"
date_from: "{{date_from}}"
- name: push-dashboard
type: call
call: powerbi.push-rows
with:
dataset_id: "carbon-credit-portfolio"
rows: "{{query-credits.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://shell.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: carbon-credits
path: "/statements"
operations:
- name: query-carbon-credits
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-credit-portfolio/rows"
operations:
- name: push-rows
method: POST
Queries Snowflake for downstream product margins by refinery and product slate, calculates crack spreads, and pushes to Power BI.
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 pushes to Power BI."
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 product margins from Snowflake and push to Power BI."
inputParameters:
- name: refinery_code
in: body
type: string
description: "Refinery code (e.g., Pernis, Scotford)."
- 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://shell.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.
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."
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 drilling costs from Snowflake and push to Power BI."
inputParameters:
- name: basin
in: body
type: string
description: "Basin name (e.g., North Sea, Prelude, Nigeria)."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: query-costs
type: call
call: snowflake.query-drilling-costs
with:
basin: "{{basin}}"
date_from: "{{date_from}}"
- 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://shell.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.
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."
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 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://shell.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, LNG, and power, 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, LNG, and power, 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 and push to Power BI."
inputParameters:
- name: desk
in: body
type: string
description: "Trading desk identifier (e.g., crude-europe, lng-asia, power-uk)."
- 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://shell.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 LNG fleet utilization data across Shell's shipping portfolio, calculates vessel utilization rates, and pushes to Power BI for commercial planning.
naftiko: "0.5"
info:
label: "Snowflake LNG Fleet Utilization Report"
description: "Queries Snowflake for LNG fleet utilization data across Shell's shipping portfolio, calculates vessel utilization rates, and pushes to Power BI for commercial planning."
tags:
- trading
- logistics
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: lng-fleet
port: 8080
tools:
- name: generate-fleet-report
description: "Given a fleet segment and date range, query Snowflake for vessel utilization and push to Power BI."
inputParameters:
- name: fleet_segment
in: body
type: string
description: "Fleet segment: conventional, q-flex, q-max."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: query-utilization
type: call
call: snowflake.query-fleet-utilization
with:
fleet_segment: "{{fleet_segment}}"
date_from: "{{date_from}}"
- name: push-report
type: call
call: powerbi.push-rows
with:
dataset_id: "lng-fleet-utilization"
rows: "{{query-utilization.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://shell.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: fleet
path: "/statements"
operations:
- name: query-fleet-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/lng-fleet-utilization/rows"
operations:
- name: push-rows
method: POST
Queries Snowflake for methane LDAR survey results, identifies active leaks, and creates work orders in SAP for repair.
naftiko: "0.5"
info:
label: "Snowflake Methane Leak Detection Report"
description: "Queries Snowflake for methane LDAR survey results, identifies active leaks, 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://shell.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://shell-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"
consumes:
- type: http
namespace: snowflake
baseUri: "https://shell.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://shell.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
Queries Snowflake for power trading profit and loss data across Shell Energy Trading markets, aggregates by region, and pushes to Power BI.
naftiko: "0.5"
info:
label: "Snowflake Power Trading P&L Report"
description: "Queries Snowflake for power trading profit and loss data across Shell Energy Trading markets, aggregates by region, and pushes to Power BI."
tags:
- trading
- finance
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: power-trading-pnl
port: 8080
tools:
- name: generate-pnl-report
description: "Given a trading region and date, query power trading P&L from Snowflake and push to Power BI."
inputParameters:
- name: region
in: body
type: string
description: "Trading region (e.g., europe, north-america, apac)."
- name: trade_date
in: body
type: string
description: "Trade date in YYYY-MM-DD format."
steps:
- name: query-pnl
type: call
call: snowflake.query-power-pnl
with:
region: "{{region}}"
trade_date: "{{trade_date}}"
- name: push-report
type: call
call: powerbi.push-rows
with:
dataset_id: "power-trading-pnl"
rows: "{{query-pnl.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://shell.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: pnl
path: "/statements"
operations:
- name: query-power-pnl
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/power-trading-pnl/rows"
operations:
- name: push-rows
method: POST
Queries Snowflake for historical well production data, performs decline curve analysis, and pushes EUR estimates to Power BI.
naftiko: "0.5"
info:
label: "Snowflake Reservoir Decline Curve Analysis"
description: "Queries Snowflake for historical well production data, performs decline curve analysis, and pushes EUR estimates to Power BI."
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 history window, query production data 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: "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://shell.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 to benchmark drilling rig utilization rates across Shell operating regions, returning utilization percentages, non-productive time, and peer comparisons.
naftiko: "0.5"
info:
label: "Snowflake Rig Utilization Benchmarking"
description: "Queries Snowflake to benchmark drilling rig utilization rates across Shell operating regions, returning utilization percentages, non-productive time, and peer comparisons."
tags:
- upstream
- drilling
- analytics
- snowflake
capability:
exposes:
- type: mcp
namespace: rig-benchmarking
port: 8080
tools:
- name: get-rig-utilization-benchmark
description: "Run a rig utilization benchmarking query across operating regions in Snowflake."
inputParameters:
- name: region
in: body
type: string
description: "Operating region code, e.g. NAM, EUR, APAC."
- name: period
in: body
type: string
description: "Reporting period in YYYY-MM format."
call: "snowflake.execute-query"
with:
statement: "SELECT rig_id, region, utilization_pct, npt_hours, benchmark_pct FROM drilling_ops.rig_utilization WHERE region='{{region}}' AND period='{{period}}' ORDER BY utilization_pct DESC"
outputParameters:
- name: rig_data
type: array
mapping: "$.data"
- name: row_count
type: number
mapping: "$.resultSetMetaData.numRows"
consumes:
- type: http
namespace: snowflake
baseUri: "https://shell.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 solar farm generation data, compares actual output vs nameplate capacity, and pushes performance ratios to Power BI.
naftiko: "0.5"
info:
label: "Snowflake Solar Farm Performance Tracker"
description: "Queries Snowflake for solar farm generation data, compares actual output vs nameplate capacity, and pushes performance ratios to Power BI."
tags:
- renewable-energy
- production
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: solar-performance
port: 8080
tools:
- name: track-solar-performance
description: "Given a solar farm ID and date range, query generation data and push performance metrics to Power BI."
inputParameters:
- name: solar_farm_id
in: body
type: string
description: "Solar farm project identifier."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: query-generation
type: call
call: snowflake.query-solar-generation
with:
solar_farm_id: "{{solar_farm_id}}"
date_from: "{{date_from}}"
- name: push-performance
type: call
call: powerbi.push-rows
with:
dataset_id: "solar-farm-performance"
rows: "{{query-generation.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://shell.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: solar-data
path: "/statements"
operations:
- name: query-solar-generation
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/solar-farm-performance/rows"
operations:
- name: push-rows
method: POST
Monitors Snowflake data pipeline execution for energy trading analytics and creates a ServiceNow incident when pipeline jobs fail or produce stale data.
naftiko: "0.5"
info:
label: "Snowflake Trading Analytics Pipeline Monitor"
description: "Monitors Snowflake data pipeline execution for energy trading analytics and creates a ServiceNow incident when pipeline jobs fail or produce stale data."
tags:
- data
- analytics
- trading
- snowflake
- servicenow
- monitoring
capability:
exposes:
- type: mcp
namespace: trading-analytics
port: 8080
tools:
- name: monitor-trading-pipeline
description: "Query Snowflake for the latest pipeline run status for energy trading data, and if the data is stale or the job failed, create a ServiceNow data incident."
inputParameters:
- name: pipeline_name
in: body
type: string
description: "Name of the Snowflake trading data pipeline to check."
- name: max_staleness_hours
in: body
type: integer
description: "Maximum acceptable data age in hours before raising an incident."
steps:
- name: check-pipeline-status
type: call
call: "snowflake-trading.check-pipeline-status"
with:
pipelineName: "{{pipeline_name}}"
- name: create-data-incident
type: call
call: "snow-trading.create-incident"
with:
short_description: "Trading pipeline stale or failed: {{pipeline_name}}"
urgency: "2"
description: "Pipeline: {{pipeline_name}}\nLast run: {{check-pipeline-status.lastRunTime}}\nStatus: {{check-pipeline-status.status}}\nStaleness threshold: {{max_staleness_hours}} hours"
consumes:
- type: http
namespace: snowflake-trading
baseUri: "https://shell.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: pipeline-status
path: "/statements"
inputParameters:
- name: pipelineName
in: query
operations:
- name: check-pipeline-status
method: POST
- type: http
namespace: snow-trading
baseUri: "https://shell.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.snow_user"
password: "$secrets.snow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Queries Snowflake for trading counterparty credit exposure, aggregates by counterparty and commodity, and pushes risk report to Power BI.
naftiko: "0.5"
info:
label: "Snowflake Trading Counterparty Exposure Report"
description: "Queries Snowflake for trading counterparty credit exposure, aggregates by counterparty and commodity, and pushes risk report to Power BI."
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 threshold, query counterparty exposure from Snowflake 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://shell.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
Queries Snowflake for produced water disposal well injection data, checks against permit limits, and creates ServiceNow alert if nearing thresholds.
naftiko: "0.5"
info:
label: "Snowflake Water Disposal Well Monitoring"
description: "Queries Snowflake for produced water disposal well injection data, checks against permit limits, and creates ServiceNow alert if nearing 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 and alert via ServiceNow if nearing limits."
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}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://shell.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://shell.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
Queries Snowflake for offshore and onshore wind farm generation data, compares actual output to forecasted capacity, and pushes to Power BI for renewable energy portfolio tracking.
naftiko: "0.5"
info:
label: "Snowflake Wind Farm Generation Dashboard"
description: "Queries Snowflake for offshore and onshore wind farm generation data, compares actual output to forecasted capacity, and pushes to Power BI for renewable energy portfolio tracking."
tags:
- renewable-energy
- production
- snowflake
- power-bi
capability:
exposes:
- type: mcp
namespace: wind-generation
port: 8080
tools:
- name: generate-wind-dashboard
description: "Given a wind farm ID and date range, query generation data from Snowflake and push to Power BI."
inputParameters:
- name: wind_farm_id
in: body
type: string
description: "Wind farm project identifier."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
steps:
- name: query-generation
type: call
call: snowflake.query-wind-generation
with:
wind_farm_id: "{{wind_farm_id}}"
date_from: "{{date_from}}"
- name: push-dashboard
type: call
call: powerbi.push-rows
with:
dataset_id: "wind-farm-generation"
rows: "{{query-generation.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://shell.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: wind-data
path: "/statements"
operations:
- name: query-wind-generation
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/wind-farm-generation/rows"
operations:
- name: push-rows
method: POST
Triggers a Terraform Cloud workspace run to provision Azure infrastructure for a Shell digital project and logs the result in a Jira ticket.
naftiko: "0.5"
info:
label: "Terraform Cloud Infrastructure Provisioning for Azure"
description: "Triggers a Terraform Cloud workspace run to provision Azure infrastructure for a Shell digital project and logs the result in a Jira ticket."
tags:
- cloud
- infrastructure
- terraform
- azure
- jira
- devops
capability:
exposes:
- type: mcp
namespace: infra-provisioning
port: 8080
tools:
- name: provision-azure-infrastructure
description: "Given a Terraform Cloud workspace ID and Jira ticket key, trigger a Terraform run to provision Azure infrastructure and update the Jira ticket with the run result."
inputParameters:
- name: terraform_workspace_id
in: body
type: string
description: "Terraform Cloud workspace ID to run."
- name: jira_ticket_key
in: body
type: string
description: "Jira ticket key to update with the provisioning result."
- name: run_message
in: body
type: string
description: "Message to associate with the Terraform run."
steps:
- name: trigger-run
type: call
call: "terraform.create-run"
with:
workspaceId: "{{terraform_workspace_id}}"
message: "{{run_message}}"
- name: update-jira
type: call
call: "jira-infra.add-comment"
with:
issueKey: "{{jira_ticket_key}}"
comment: "Terraform run triggered. Run ID: {{trigger-run.runId}} | Status: {{trigger-run.status}} | Workspace: {{terraform_workspace_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: jira-infra
baseUri: "https://shell.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issue-comments
path: "/issue/{{issueKey}}/comment"
inputParameters:
- name: issueKey
in: path
operations:
- name: add-comment
method: POST
Provisions edge computing infrastructure for LNG terminal monitoring using Terraform Cloud, registers in ServiceNow CMDB, and notifies the OT team.
naftiko: "0.5"
info:
label: "Terraform Cloud LNG Terminal Edge Infrastructure"
description: "Provisions edge computing infrastructure for LNG terminal monitoring using Terraform Cloud, registers in ServiceNow CMDB, and notifies the OT team."
tags:
- downstream
- ot
- terraform
- servicenow
- msteams
capability:
exposes:
- type: mcp
namespace: lng-edge-infra
port: 8080
tools:
- name: provision-lng-edge
description: "Given a terminal ID and device count, run Terraform to provision edge infra, register in ServiceNow, and notify OT team."
inputParameters:
- name: terminal_id
in: body
type: string
description: "LNG terminal identifier."
- name: device_count
in: body
type: number
description: "Number of edge devices."
steps:
- name: run-terraform
type: call
call: terraform.create-run
with:
workspace: "lng-terminal-edge"
variables: "terminal_id={{terminal_id}},device_count={{device_count}}"
- name: register-devices
type: call
call: servicenow.create-ci
with:
terminal_id: "{{terminal_id}}"
device_count: "{{device_count}}"
- name: notify-ot
type: call
call: msteams.send-message
with:
channel: "ot-infrastructure"
text: "LNG edge infra provisioned | Terminal: {{terminal_id}} | Devices: {{device_count}}"
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://shell.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
Verifies that field contractors in Workday have valid safety certifications and site access clearances before allowing facility entry, notifying supervisors of gaps via Teams.
naftiko: "0.5"
info:
label: "Workday Contractor Compliance Verification"
description: "Verifies that field contractors in Workday have valid safety certifications and site access clearances before allowing facility entry, notifying supervisors of gaps via Teams."
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 and site code, check safety certs and site access in Workday and 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: "Facility 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 | 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"
operations:
- name: get-worker-certifications
method: GET
- name: site-access
path: "/workers/site-access"
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 certified crew, matches 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 certified crew, matches 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 crew, match to SAP work orders, and post schedule."
inputParameters:
- name: location
in: body
type: string
description: "Field location code."
- name: schedule_date
in: body
type: string
description: "Date 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}}"
- name: post-schedule
type: call
call: msteams.send-message
with:
channel: "field-operations"
text: "Crew Schedule {{schedule_date}} | Location: {{location}} | Crew: {{get-available-crew.count}} | 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://shell-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 data from Workday, combines with ServiceNow incident records, calculates TRIR and DART rates, and pushes to Power BI.
naftiko: "0.5"
info:
label: "Workday HSE Incident Rate Dashboard"
description: "Pulls headcount data from Workday, combines with ServiceNow incident records, calculates TRIR and DART rates, and pushes to Power BI."
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, ServiceNow incidents, calculate safety rates, and push to Power BI."
inputParameters:
- name: business_unit
in: body
type: string
description: "Business unit code."
- 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://shell.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
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}}"
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"
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 and posts 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 and posts 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 and post readiness summary to Teams."
inputParameters:
- name: business_unit
in: body
type: string
description: "Business unit to review."
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}} | 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