Bunge Capabilities
Naftiko 0.5 capability definitions for Bunge - 100 capabilities showing integration workflows and service orchestrations.
Generates crop yield forecasts via AI.
naftiko: "0.5"
info:
label: "AI-Powered Crop Yield Forecast Digest"
description: "Generates crop yield forecasts via AI."
tags:
- artificial-intelligence
- agribusiness
- microsoft-teams
- forecasting
capability:
exposes:
- type: mcp
namespace: artificial-intelligence-ops
port: 8080
tools:
- name: execute-workflow
description: "AI-Powered Crop Yield Forecast Digest - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Sends a trade contract document to the Anthropic Claude API for extraction of key terms (price, volume, delivery dates, incoterms) and stores the summary in Snowflake.
naftiko: "0.5"
info:
label: "Anthropic Document Summarization for Trade Contracts"
description: "Sends a trade contract document to the Anthropic Claude API for extraction of key terms (price, volume, delivery dates, incoterms) and stores the summary in Snowflake."
tags:
- ai
- anthropic
- supply-chain
- snowflake
- contracts
capability:
exposes:
- type: mcp
namespace: ai-contracts
port: 8080
tools:
- name: summarize-trade-contract
description: "Given the text of a Bunge trade contract, invoke Anthropic Claude to extract key terms (commodity, price, volume, delivery date, incoterms, counterparty) and store the structured summary in Snowflake. Use for contract digitization and trade operations intake."
inputParameters:
- name: contract_text
in: body
type: string
description: "Full text of the trade contract document."
- name: contract_id
in: body
type: string
description: "Bunge internal contract identifier."
steps:
- name: extract-terms
type: call
call: "anthropic.create-message"
with:
model: "claude-opus-4-5"
max_tokens: 1024
system: "You are a trade contract analyst. Extract key terms as JSON: commodity, price, volume, delivery_date, incoterms, counterparty."
content: "{{contract_text}}"
- name: store-summary
type: call
call: "snowflake-contracts.execute-statement"
with:
statement: "INSERT INTO BUNGE_DW.CONTRACTS.SUMMARIES (contract_id, extracted_terms, created_at) VALUES ('{{contract_id}}', PARSE_JSON('{{extract-terms.content}}'), CURRENT_TIMESTAMP())"
consumes:
- type: http
namespace: anthropic
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: snowflake-contracts
baseUri: "https://bunge.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
Queries AWS Cost Explorer for spend anomalies in the current billing period, logs findings to Snowflake, and sends a summary to the FinOps Teams channel.
naftiko: "0.5"
info:
label: "AWS Cost Anomaly Detection and Alert"
description: "Queries AWS Cost Explorer for spend anomalies in the current billing period, logs findings to Snowflake, and sends a summary to the FinOps Teams channel."
tags:
- cloud
- finops
- aws
- snowflake
- microsoft-teams
- cost-management
capability:
exposes:
- type: mcp
namespace: cloud-finops
port: 8080
tools:
- name: detect-cost-anomalies
description: "Query AWS Cost Explorer for spending anomalies over the trailing 7 days across all Bunge AWS accounts. Log detected anomalies to Snowflake and post a summary to the FinOps Teams channel. Use for proactive cloud cost governance."
inputParameters:
- name: threshold_usd
in: body
type: number
description: "Minimum anomaly impact in USD to report, e.g. 500."
steps:
- name: get-anomalies
type: call
call: "aws-cost.get-anomalies"
with:
threshold: "{{threshold_usd}}"
- name: log-to-snowflake
type: call
call: "snowflake-cost.execute-statement"
with:
statement: "INSERT INTO FINOPS.COST_ANOMALIES SELECT * FROM VALUES {{get-anomalies.data}}"
- name: post-summary
type: call
call: "msteams-finops.send-message"
with:
channel: "finops-alerts"
text: "AWS Cost Anomalies Detected: {{get-anomalies.total_impact}} USD impact across {{get-anomalies.count}} services."
consumes:
- type: http
namespace: aws-cost
baseUri: "https://ce.us-east-1.amazonaws.com"
authentication:
type: bearer
token: "$secrets.aws_session_token"
resources:
- name: anomalies
path: "/GetAnomalies"
operations:
- name: get-anomalies
method: POST
- type: http
namespace: snowflake-cost
baseUri: "https://bunge.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: msteams-finops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Queries Azure Active Directory for user group memberships in privileged access groups, identifies stale memberships, and creates a ServiceNow task for access recertification.
naftiko: "0.5"
info:
label: "Azure AD Access Review and Recertification"
description: "Queries Azure Active Directory for user group memberships in privileged access groups, identifies stale memberships, and creates a ServiceNow task for access recertification."
tags:
- security
- identity
- azure-active-directory
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: identity-governance
port: 8080
tools:
- name: run-access-recertification
description: "Retrieve all members of a privileged Azure AD group, identify accounts inactive for more than 90 days, and create a ServiceNow access review task listing accounts requiring recertification. Use for quarterly access reviews."
inputParameters:
- name: group_id
in: body
type: string
description: "Azure AD group object ID to review."
- name: inactivity_days
in: body
type: integer
description: "Number of days of inactivity to flag accounts, typically 90."
steps:
- name: get-members
type: call
call: "azure-ad-review.list-group-members"
with:
group_id: "{{group_id}}"
- name: create-review-task
type: call
call: "servicenow-access.create-incident"
with:
short_description: "Access recertification required for group {{group_id}}"
description: "{{get-members.count}} members found. Accounts inactive >{{inactivity_days}} days require review."
category: "access_review"
consumes:
- type: http
namespace: azure-ad-review
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: group-members
path: "/groups/{{group_id}}/members"
inputParameters:
- name: group_id
in: path
operations:
- name: list-group-members
method: GET
- type: http
namespace: servicenow-access
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
Triggers access reviews.
naftiko: "0.5"
info:
label: "Azure AD Access Review Workflow"
description: "Triggers access reviews."
tags:
- security
- azure-active-directory
- microsoft-teams
- compliance
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: execute-workflow
description: "Azure AD Access Review Workflow - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Alerts trading on price volatility.
naftiko: "0.5"
info:
label: "Commodity Market Volatility Alert"
description: "Alerts trading on price volatility."
tags:
- trading
- bloomberg
- microsoft-teams
- risk-management
capability:
exposes:
- type: mcp
namespace: trading-ops
port: 8080
tools:
- name: execute-workflow
description: "Commodity Market Volatility Alert - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Calculates mark-to-market.
naftiko: "0.5"
info:
label: "Commodity Position Mark-to-Market"
description: "Calculates mark-to-market."
tags:
- trading
- sap
- bloomberg
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: trading-ops
port: 8080
tools:
- name: execute-workflow
description: "Commodity Position Mark-to-Market - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Pulls current grain and oilseed spot prices from the Bloomberg API and stores a snapshot in Snowflake for downstream analytics and trading desk reporting.
naftiko: "0.5"
info:
label: "Commodity Price Feed Snapshot"
description: "Pulls current grain and oilseed spot prices from the Bloomberg API and stores a snapshot in Snowflake for downstream analytics and trading desk reporting."
tags:
- supply-chain
- commodities
- trading
- bloomberg
- snowflake
- data
capability:
exposes:
- type: mcp
namespace: commodities-data
port: 8080
tools:
- name: snapshot-commodity-prices
description: "Given a list of commodity ticker symbols (e.g. CBOT corn, soybean), retrieve current spot prices from Bloomberg and write a snapshot record to Snowflake. Use for daily price capture, risk management, or trading analytics."
inputParameters:
- name: tickers
in: body
type: array
description: "List of Bloomberg commodity ticker symbols, e.g. ['C 1 Comdty', 'S 1 Comdty']."
- name: snapshot_date
in: body
type: string
description: "Date of snapshot in YYYY-MM-DD format."
steps:
- name: fetch-prices
type: call
call: "bloomberg.get-reference-data"
with:
identifiers: "{{tickers}}"
fields: "PX_LAST,PX_OPEN,PX_HIGH,PX_LOW"
- name: write-snapshot
type: call
call: "snowflake.insert-rows"
with:
table: "COMMODITIES.PRICE_SNAPSHOTS"
data: "{{fetch-prices.data}}"
snapshot_date: "{{snapshot_date}}"
consumes:
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: reference-data
path: "/referenceData"
operations:
- name: get-reference-data
method: POST
- type: http
namespace: snowflake
baseUri: "https://bunge.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-rows
method: POST
Creates SAP contracts for commodity trades.
naftiko: "0.5"
info:
label: "Commodity Trade Confirmation Workflow"
description: "Creates SAP contracts for commodity trades."
tags:
- trading
- sap
- microsoft-teams
- commodities
capability:
exposes:
- type: mcp
namespace: trading-ops
port: 8080
tools:
- name: execute-workflow
description: "Commodity Trade Confirmation Workflow - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Searches Confluence for pages matching a query.
naftiko: "0.5"
info:
label: "Confluence Page Search"
description: "Searches Confluence for pages matching a query."
tags:
- collaboration
- confluence
- knowledge-management
capability:
exposes:
- type: mcp
namespace: collaboration-ops
port: 8080
tools:
- name: get-record
description: "Confluence Page Search - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Creates incidents for anomalies.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Anomaly Alert"
description: "Creates incidents for anomalies."
tags:
- observability
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: observability-ops
port: 8080
tools:
- name: execute-workflow
description: "Datadog Infrastructure Anomaly Alert - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Returns current health status of Bunge's monitored hosts and services from Datadog, flagging any hosts with unhealthy status for on-call review.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Health Check"
description: "Returns current health status of Bunge's monitored hosts and services from Datadog, flagging any hosts with unhealthy status for on-call review."
tags:
- observability
- monitoring
- datadog
- infrastructure
capability:
exposes:
- type: mcp
namespace: observability
port: 8080
tools:
- name: get-infra-health
description: "Query Datadog for the current status of all monitored hosts and return a list of hosts with alert or no-data states. Use during incident response or daily operational health reviews."
inputParameters:
- name: filter_tag
in: body
type: string
description: "Datadog host tag to filter by, e.g. 'env:production'."
call: "datadog-hosts.list-hosts"
with:
filter: "{{filter_tag}}"
outputParameters:
- name: hosts
type: array
mapping: "$.host_list[*]"
consumes:
- type: http
namespace: datadog-hosts
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: hosts
path: "/hosts"
inputParameters:
- name: filter
in: query
operations:
- name: list-hosts
method: GET
Creates incidents for anomalies.
naftiko: "0.5"
info:
label: "Datadog Log Anomaly to ServiceNow"
description: "Creates incidents for anomalies."
tags:
- observability
- datadog
- servicenow
- incident-management
capability:
exposes:
- type: mcp
namespace: observability-ops
port: 8080
tools:
- name: execute-workflow
description: "Datadog Log Anomaly to ServiceNow - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Retrieves Service Level Objective compliance data from Datadog for all production services and publishes a weekly SLO report to the engineering Teams channel.
naftiko: "0.5"
info:
label: "Datadog SLO Compliance Report"
description: "Retrieves Service Level Objective compliance data from Datadog for all production services and publishes a weekly SLO report to the engineering Teams channel."
tags:
- observability
- slo
- datadog
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: slo-reporting
port: 8080
tools:
- name: publish-slo-report
description: "Retrieve all Datadog SLO compliance metrics for the trailing 7 days and post a summary report to the engineering Microsoft Teams channel showing which services are meeting or breaching their SLOs."
inputParameters:
- name: tag_filter
in: body
type: string
description: "Datadog tag filter for SLO selection, e.g. 'env:production'."
steps:
- name: get-slos
type: call
call: "datadog-slo.list-slos"
with:
tags_query: "{{tag_filter}}"
- name: post-report
type: call
call: "msteams-slo.send-message"
with:
channel: "engineering-metrics"
text: "Weekly SLO Report: {{get-slos.compliant_count}} services meeting SLO, {{get-slos.breached_count}} breaching. Review Datadog for details."
consumes:
- type: http
namespace: datadog-slo
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: slos
path: "/slo"
inputParameters:
- name: tags_query
in: query
operations:
- name: list-slos
method: GET
- type: http
namespace: msteams-slo
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the signing status of a DocuSign envelope including signer progress.
naftiko: "0.5"
info:
label: "DocuSign Envelope Status"
description: "Retrieves the signing status of a DocuSign envelope including signer progress."
tags:
- legal
- docusign
- contract-management
capability:
exposes:
- type: mcp
namespace: legal-ops
port: 8080
tools:
- name: get-record
description: "DocuSign Envelope Status - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
When an employee separation is recorded in Workday, disables the Azure Active Directory account, revokes Salesforce access, and opens a ServiceNow offboarding task.
naftiko: "0.5"
info:
label: "Employee Offboarding Workflow"
description: "When an employee separation is recorded in Workday, disables the Azure Active Directory account, revokes Salesforce access, and opens a ServiceNow offboarding task."
tags:
- hr
- offboarding
- workday
- azure-active-directory
- servicenow
- salesforce
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID and termination date, disable the Azure AD account, revoke Salesforce CRM access, and open a ServiceNow offboarding checklist ticket. Invoke when HR processes a separation event."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday worker ID of the departing employee."
- name: termination_date
in: body
type: string
description: "Last day of employment in YYYY-MM-DD format."
steps:
- name: get-worker
type: call
call: "workday-lookup.get-worker"
with:
worker_id: "{{employee_id}}"
- name: disable-aad
type: call
call: "azure-ad.disable-user"
with:
user_id: "{{get-worker.azure_object_id}}"
- name: revoke-salesforce
type: call
call: "salesforce.deactivate-user"
with:
salesforce_user_id: "{{get-worker.salesforce_id}}"
- name: open-ticket
type: call
call: "servicenow-offboard.create-incident"
with:
short_description: "Offboarding: {{get-worker.display_name}} — effective {{termination_date}}"
category: "hr_offboarding"
consumes:
- type: http
namespace: workday-lookup
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/bunge/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: azure-ad
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: users
path: "/users/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: disable-user
method: PATCH
- type: http
namespace: salesforce
baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User/{{salesforce_user_id}}"
inputParameters:
- name: salesforce_user_id
in: path
operations:
- name: deactivate-user
method: PATCH
- type: http
namespace: servicenow-offboard
baseUri: "https://bunge.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
When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message.
naftiko: "0.5"
info:
label: "Employee Onboarding Orchestrator"
description: "When a new hire is created in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint document folder, and sends a Microsoft Teams welcome message."
tags:
- hr
- onboarding
- workday
- servicenow
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Given a Workday employee ID and start date, orchestrate the full new-hire onboarding sequence: open a ServiceNow ticket, provision a SharePoint folder, and send a Teams welcome card. Invoke when HR confirms a new hire record is ready."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "Employee start date in YYYY-MM-DD format."
- name: department
in: body
type: string
description: "Department the new hire is joining."
steps:
- name: get-worker
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-worker.display_name}}"
category: "hr_onboarding"
assignment_group: "IT_Onboarding"
- name: provision-folder
type: call
call: "sharepoint.create-folder"
with:
site_id: "hr-onboarding"
folder_path: "OnboardingDocs/{{get-worker.display_name}}_{{start_date}}"
- name: send-welcome
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-worker.work_email}}"
text: "Welcome to Bunge, {{get-worker.first_name}}! Your onboarding ticket is {{create-ticket.number}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/bunge/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: sharepoint
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: drive-items
path: "/sites/{{site_id}}/drive/root/children"
inputParameters:
- name: site_id
in: path
operations:
- name: create-folder
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chat-messages
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Creates Jira tickets.
naftiko: "0.5"
info:
label: "GitHub Actions Build Failure Notification"
description: "Creates Jira tickets."
tags:
- devops
- github
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devops-ops
port: 8080
tools:
- name: execute-workflow
description: "GitHub Actions Build Failure Notification - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and sends a Microsoft Teams alert with full context.
naftiko: "0.5"
info:
label: "GitHub Actions CI/CD Pipeline Failure Response"
description: "On a GitHub Actions workflow failure on a protected branch, creates a Jira bug, posts a Datadog deployment marker, and sends a Microsoft Teams alert with full context."
tags:
- devops
- cicd
- github
- jira
- datadog
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devops
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub workflow run ID, repository, branch, and failed job name, create a Jira bug, post a Datadog deployment event marker, and send a Teams engineering alert. Invoke on any protected-branch CI failure."
inputParameters:
- name: run_id
in: body
type: string
description: "GitHub Actions workflow run ID."
- name: repository
in: body
type: string
description: "GitHub repository full name, e.g. bunge/grain-trading-api."
- name: branch
in: body
type: string
description: "Branch name where the failure occurred."
- name: failed_job
in: body
type: string
description: "Name of the failed job in the workflow."
- name: commit_sha
in: body
type: string
description: "Git commit SHA that triggered the run."
steps:
- name: create-bug
type: call
call: "jira.create-issue"
with:
project_key: "ENG"
issuetype: "Bug"
summary: "[CI Failure] {{repository}} / {{branch}} — {{failed_job}}"
description: "Run: {{run_id}} | Commit: {{commit_sha}}"
- name: post-dd-event
type: call
call: "datadog-events.create-event"
with:
title: "CI Failure: {{repository}}"
text: "Branch {{branch}} | Job: {{failed_job}} | Commit: {{commit_sha}}"
tags: "env:cicd,repo:{{repository}}"
- name: notify-engineering
type: call
call: "msteams-eng.send-message"
with:
channel: "engineering-alerts"
text: "CI Failure: {{repository}} | Branch: {{branch}} | Job: {{failed_job}} | Jira: {{create-bug.key}}"
consumes:
- type: http
namespace: jira
baseUri: "https://bunge.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
- type: http
namespace: datadog-events
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: events
path: "/events"
operations:
- name: create-event
method: POST
- type: http
namespace: msteams-eng
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Checks approval before deployment.
naftiko: "0.5"
info:
label: "GitHub Deployment Approval Gate"
description: "Checks approval before deployment."
tags:
- devops
- github
- servicenow
- change-management
capability:
exposes:
- type: mcp
namespace: devops-ops
port: 8080
tools:
- name: execute-workflow
description: "GitHub Deployment Approval Gate - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Triggers a code security scan on a GitHub repository via GitHub Actions and opens a Jira security ticket for any high or critical vulnerability findings.
naftiko: "0.5"
info:
label: "GitHub Repository Security Scan Trigger"
description: "Triggers a code security scan on a GitHub repository via GitHub Actions and opens a Jira security ticket for any high or critical vulnerability findings."
tags:
- devops
- security
- github
- jira
capability:
exposes:
- type: mcp
namespace: devsec-ops
port: 8080
tools:
- name: trigger-security-scan
description: "Given a GitHub repository and branch, dispatch a security scan workflow via GitHub Actions. Poll for completion and create a Jira security bug for any high or critical findings. Use for on-demand or pre-release security validation."
inputParameters:
- name: repository
in: body
type: string
description: "GitHub repository full name, e.g. bunge/logistics-api."
- name: branch
in: body
type: string
description: "Branch to scan."
steps:
- name: dispatch-scan
type: call
call: "github.dispatch-workflow"
with:
repo: "{{repository}}"
workflow_id: "security-scan.yml"
ref: "{{branch}}"
- name: create-jira-ticket
type: call
call: "jira-sec.create-issue"
with:
project_key: "SEC"
issuetype: "Bug"
summary: "Security scan triggered: {{repository}}@{{branch}}"
description: "Workflow dispatched. Run ID: {{dispatch-scan.run_id}}. Review scan results when complete."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-dispatches
path: "/repos/{{repo}}/actions/workflows/{{workflow_id}}/dispatches"
inputParameters:
- name: repo
in: path
- name: workflow_id
in: path
operations:
- name: dispatch-workflow
method: POST
- type: http
namespace: jira-sec
baseUri: "https://bunge.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue"
operations:
- name: create-issue
method: POST
Creates Jira tickets.
naftiko: "0.5"
info:
label: "GitHub Security Vulnerability Triage"
description: "Creates Jira tickets."
tags:
- security
- github
- jira
- vulnerability-management
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: execute-workflow
description: "GitHub Security Vulnerability Triage - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Monitors grain elevator capacity.
naftiko: "0.5"
info:
label: "Grain Elevator Capacity Monitor"
description: "Monitors grain elevator capacity."
tags:
- supply-chain
- iot
- microsoft-teams
- agribusiness
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: execute-workflow
description: "Grain Elevator Capacity Monitor - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Creates incidents for shipment delays.
naftiko: "0.5"
info:
label: "Grain Shipment Delay Escalation"
description: "Creates incidents for shipment delays."
tags:
- logistics
- servicenow
- microsoft-teams
- agribusiness
capability:
exposes:
- type: mcp
namespace: logistics-ops
port: 8080
tools:
- name: execute-workflow
description: "Grain Shipment Delay Escalation - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Looks up the current status and estimated arrival of a Bunge grain shipment by bill of lading number via the SAP Transportation Management API.
naftiko: "0.5"
info:
label: "Grain Shipment Tracking Lookup"
description: "Looks up the current status and estimated arrival of a Bunge grain shipment by bill of lading number via the SAP Transportation Management API."
tags:
- supply-chain
- logistics
- sap
- shipment-tracking
capability:
exposes:
- type: mcp
namespace: logistics
port: 8080
tools:
- name: get-shipment-status
description: "Given a bill of lading number, return the current shipment status, carrier name, origin port, destination port, and estimated arrival date from SAP TM. Use for supply chain visibility, customer inquiries, or trade finance documentation."
inputParameters:
- name: bill_of_lading
in: body
type: string
description: "Bill of lading number issued for the shipment."
call: "sap-tm.get-shipment"
with:
bill_of_lading: "{{bill_of_lading}}"
outputParameters:
- name: status
type: string
mapping: "$.d.TransportationStatus"
- name: carrier
type: string
mapping: "$.d.CarrierName"
- name: eta
type: string
mapping: "$.d.PlannedArrivalDate"
- name: origin
type: string
mapping: "$.d.DepartureLocation"
- name: destination
type: string
mapping: "$.d.DestinationLocation"
consumes:
- type: http
namespace: sap-tm
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/TM_FREIGHT_ORDER_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: freight-orders
path: "/FreightOrder('{{bill_of_lading}}')"
inputParameters:
- name: bill_of_lading
in: path
operations:
- name: get-shipment
method: GET
Queries ungroomed Jira tickets older than 30 days in a project, uses Anthropic to suggest priority and acceptance criteria, and updates each ticket with the AI-generated suggestions.
naftiko: "0.5"
info:
label: "Jira Backlog Grooming Ticket Triage"
description: "Queries ungroomed Jira tickets older than 30 days in a project, uses Anthropic to suggest priority and acceptance criteria, and updates each ticket with the AI-generated suggestions."
tags:
- devops
- jira
- ai
- anthropic
- agile
capability:
exposes:
- type: mcp
namespace: backlog-ops
port: 8080
tools:
- name: triage-backlog-tickets
description: "Retrieve all ungroomed Jira tickets older than 30 days for a project, invoke Anthropic Claude to suggest priority classification and draft acceptance criteria for each, and update the Jira tickets with the suggestions. Use during sprint planning preparation."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key to triage, e.g. BUNGE-OPS."
- name: max_tickets
in: body
type: integer
description: "Maximum number of backlog tickets to process in one run."
steps:
- name: list-backlog
type: call
call: "jira-backlog.search-issues"
with:
jql: "project={{project_key}} AND status=Backlog AND created<=-30d ORDER BY created ASC"
max_results: "{{max_tickets}}"
- name: suggest-priorities
type: call
call: "anthropic-triage.create-message"
with:
model: "claude-opus-4-5"
content: "Review these Jira ticket summaries and suggest priority (P1-P4) and 2-3 acceptance criteria for each: {{list-backlog.summaries}}"
- name: update-tickets
type: call
call: "jira-update.bulk-update"
with:
issues: "{{list-backlog.issue_keys}}"
comment: "AI Triage Suggestions: {{suggest-priorities.content}}"
consumes:
- type: http
namespace: jira-backlog
baseUri: "https://bunge.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issue-search
path: "/issue/picker"
inputParameters:
- name: jql
in: query
- name: max_results
in: query
operations:
- name: search-issues
method: GET
- type: http
namespace: anthropic-triage
baseUri: "https://api.anthropic.com/v1"
authentication:
type: apikey
key: "x-api-key"
value: "$secrets.anthropic_api_key"
placement: header
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: jira-update
baseUri: "https://bunge.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: issues
path: "/issue/{{issue_key}}"
inputParameters:
- name: issue_key
in: path
operations:
- name: bulk-update
method: PUT
Queries completed Jira sprints for a project, calculates velocity metrics, and publishes a sprint summary to the engineering Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Jira Sprint Velocity Report"
description: "Queries completed Jira sprints for a project, calculates velocity metrics, and publishes a sprint summary to the engineering Microsoft Teams channel."
tags:
- devops
- jira
- reporting
- microsoft-teams
- agile
capability:
exposes:
- type: mcp
namespace: devops-reporting
port: 8080
tools:
- name: publish-sprint-velocity
description: "Retrieve the last N completed sprints for a Jira project, calculate average velocity (story points delivered), and post a sprint report to the engineering Teams channel. Use for retrospectives or program reporting."
inputParameters:
- name: project_key
in: body
type: string
description: "Jira project key, e.g. BUNGE-TRADE."
- name: sprint_count
in: body
type: integer
description: "Number of completed sprints to include in the velocity calculation."
steps:
- name: get-sprints
type: call
call: "jira-sprints.list-sprints"
with:
project_key: "{{project_key}}"
max_results: "{{sprint_count}}"
- name: post-report
type: call
call: "msteams-dev.send-message"
with:
channel: "engineering-team"
text: "Sprint Velocity Report for {{project_key}}: Avg {{get-sprints.avg_velocity}} pts/sprint over {{sprint_count}} sprints."
consumes:
- type: http
namespace: jira-sprints
baseUri: "https://bunge.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_token"
resources:
- name: sprints
path: "/board/{{board_id}}/sprint"
inputParameters:
- name: board_id
in: path
operations:
- name: list-sprints
method: GET
- type: http
namespace: msteams-dev
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Pulls open Bunge requisitions from Workday Recruiting and matches them against LinkedIn Talent Solutions candidate pools, publishing a weekly digest to the HR Teams channel.
naftiko: "0.5"
info:
label: "LinkedIn Talent Pipeline Digest"
description: "Pulls open Bunge requisitions from Workday Recruiting and matches them against LinkedIn Talent Solutions candidate pools, publishing a weekly digest to the HR Teams channel."
tags:
- hr
- recruiting
- workday
- linkedin
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: digest-talent-pipeline
description: "Retrieve open job requisitions from Workday Recruiting, query LinkedIn Talent Solutions for matching candidate counts per role, and post a weekly talent pipeline digest to the HR Microsoft Teams channel."
inputParameters:
- name: week_ending
in: body
type: string
description: "Week ending date in YYYY-MM-DD format for the digest."
steps:
- name: get-requisitions
type: call
call: "workday-recruit.list-requisitions"
with:
status: "Open"
- name: get-linkedin-pools
type: call
call: "linkedin.search-candidates"
with:
job_titles: "{{get-requisitions.titles}}"
- name: post-digest
type: call
call: "msteams-hr.send-message"
with:
channel: "hr-talent"
text: "Talent Pipeline Digest (week of {{week_ending}}): {{get-requisitions.count}} open reqs | {{get-linkedin-pools.candidate_count}} LinkedIn candidates matched."
consumes:
- type: http
namespace: workday-recruit
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: job-requisitions
path: "/bunge/jobRequisitions"
operations:
- name: list-requisitions
method: GET
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: talent-search
path: "/talentSearch"
operations:
- name: search-candidates
method: POST
- type: http
namespace: msteams-hr
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Monitors environmental compliance.
naftiko: "0.5"
info:
label: "Manufacturing Environmental Compliance Monitor"
description: "Monitors environmental compliance."
tags:
- manufacturing
- compliance
- microsoft-teams
- environmental
capability:
exposes:
- type: mcp
namespace: manufacturing-ops
port: 8080
tools:
- name: execute-workflow
description: "Manufacturing Environmental Compliance Monitor - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Given a supplier name, retrieves recent risk signals from Salesforce and SAP, sends the data to OpenAI for narrative risk summarization, and posts the result to the procurement Teams channel.
naftiko: "0.5"
info:
label: "OpenAI-Assisted Supplier Risk Summarization"
description: "Given a supplier name, retrieves recent risk signals from Salesforce and SAP, sends the data to OpenAI for narrative risk summarization, and posts the result to the procurement Teams channel."
tags:
- ai
- openai
- procurement
- salesforce
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ai-procurement
port: 8080
tools:
- name: summarize-supplier-risk
description: "Given a supplier name and Salesforce account ID, retrieve recent service issues from ServiceNow and open POs from SAP, then invoke OpenAI to produce a 200-word supplier risk narrative. Post to the procurement Teams channel. Use for supplier quarterly business reviews."
inputParameters:
- name: supplier_name
in: body
type: string
description: "Legal name of the supplier."
- name: account_id
in: body
type: string
description: "Salesforce account ID for the supplier."
steps:
- name: get-sf-account
type: call
call: "salesforce-supplier.get-account"
with:
account_id: "{{account_id}}"
- name: get-open-pos
type: call
call: "sap-supplier.get-po-list"
with:
supplier_name: "{{supplier_name}}"
- name: generate-summary
type: call
call: "openai.create-completion"
with:
model: "gpt-4o"
prompt: "Summarize supplier risk for {{supplier_name}}. Open POs: {{get-open-pos.count}}. Salesforce risk rating: {{get-sf-account.risk_rating}}. Recent issues: {{get-sf-account.recent_issues}}."
- name: post-to-teams
type: call
call: "msteams-purch.send-message"
with:
channel: "procurement-ops"
text: "Supplier Risk Summary — {{supplier_name}}: {{generate-summary.text}}"
consumes:
- type: http
namespace: salesforce-supplier
baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: sap-supplier
baseUri: "https://bunge-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"
inputParameters:
- name: supplier_name
in: query
operations:
- name: get-po-list
method: GET
- type: http
namespace: openai
baseUri: "https://api.openai.com/v1"
authentication:
type: bearer
token: "$secrets.openai_api_key"
resources:
- name: completions
path: "/chat/completions"
operations:
- name: create-completion
method: POST
- type: http
namespace: msteams-purch
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves the current firewall security policies from Palo Alto Networks, flags any rules with 'any' source or destination, and logs findings to ServiceNow for review.
naftiko: "0.5"
info:
label: "Palo Alto Networks Firewall Policy Audit"
description: "Retrieves the current firewall security policies from Palo Alto Networks, flags any rules with 'any' source or destination, and logs findings to ServiceNow for review."
tags:
- security
- identity
- palo-alto-networks
- servicenow
- compliance
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: audit-firewall-policies
description: "Retrieve all firewall security policies from Palo Alto Networks, identify overly permissive rules (any source/destination), and create a ServiceNow change request for remediation review. Use for quarterly security compliance audits."
inputParameters:
- name: firewall_hostname
in: body
type: string
description: "Hostname of the Palo Alto Networks firewall to audit."
steps:
- name: get-policies
type: call
call: "paloalto.get-security-policies"
with:
hostname: "{{firewall_hostname}}"
- name: create-change
type: call
call: "servicenow-sec.create-change"
with:
short_description: "Firewall policy audit findings: {{firewall_hostname}}"
description: "Overly permissive rules found during audit. Total policies reviewed: {{get-policies.count}}"
category: "security_audit"
consumes:
- type: http
namespace: paloalto
baseUri: "https://{{hostname}}/restapi/v10.1"
authentication:
type: apikey
key: "X-PAN-KEY"
value: "$secrets.paloalto_api_key"
placement: header
resources:
- name: security-policies
path: "/Objects/SecurityRules"
operations:
- name: get-security-policies
method: GET
- type: http
namespace: servicenow-sec
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change
method: POST
Returns the current headcount grouped by department and cost center from Workday, enabling real-time workforce planning and cost analysis.
naftiko: "0.5"
info:
label: "Payroll Headcount Snapshot"
description: "Returns the current headcount grouped by department and cost center from Workday, enabling real-time workforce planning and cost analysis."
tags:
- hr
- payroll
- headcount
- workday
- reporting
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: get-headcount-snapshot
description: "Returns a list of active Bunge employees grouped by department and cost center from Workday. Use for workforce planning, budget forecasting, or cost center reporting."
call: "workday-hcm.headcount-export"
outputParameters:
- name: employees
type: array
mapping: "$.data[*]"
consumes:
- type: http
namespace: workday-hcm
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: worker-export
path: "/bunge/workers"
operations:
- name: headcount-export
method: GET
Checks the latest Power BI dataset refresh status, returning completion time and status.
naftiko: "0.5"
info:
label: "Power BI Dataset Refresh Status"
description: "Checks the latest Power BI dataset refresh status, returning completion time and status."
tags:
- analytics
- power-bi
- monitoring
capability:
exposes:
- type: mcp
namespace: analytics-ops
port: 8080
tools:
- name: get-record
description: "Power BI Dataset Refresh Status - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Triggers a Power BI dataset refresh for the executive KPI dashboard and notifies stakeholders via Microsoft Teams when the refresh is complete.
naftiko: "0.5"
info:
label: "Power BI Executive Dashboard Refresh Trigger"
description: "Triggers a Power BI dataset refresh for the executive KPI dashboard and notifies stakeholders via Microsoft Teams when the refresh is complete."
tags:
- data
- analytics
- power-bi
- reporting
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: exec-reporting
port: 8080
tools:
- name: refresh-executive-dashboard
description: "Trigger a dataset refresh on the Bunge executive KPI Power BI dashboard and notify the leadership Teams channel upon completion. Use before board meetings or executive reviews."
inputParameters:
- name: notify_channel
in: body
type: string
description: "Teams channel name to notify on completion, e.g. 'executive-team'."
steps:
- name: trigger-refresh
type: call
call: "powerbi-refresh.trigger-refresh"
with:
dataset_id: "$secrets.powerbi_exec_dataset_id"
- name: notify-leadership
type: call
call: "msteams-exec.send-message"
with:
channel: "{{notify_channel}}"
text: "Executive KPI Dashboard refresh initiated. Status: {{trigger-refresh.status}}. Dashboard will be updated shortly."
consumes:
- type: http
namespace: powerbi-refresh
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
- type: http
namespace: msteams-exec
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Refreshes executive dashboard.
naftiko: "0.5"
info:
label: "Power BI Executive Dashboard Refresh"
description: "Refreshes executive dashboard."
tags:
- analytics
- power-bi
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: analytics-ops
port: 8080
tools:
- name: execute-workflow
description: "Power BI Executive Dashboard Refresh - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Refreshes supply chain KPIs.
naftiko: "0.5"
info:
label: "Power BI Supply Chain Dashboard Refresh"
description: "Refreshes supply chain KPIs."
tags:
- analytics
- power-bi
- microsoft-teams
- supply-chain
capability:
exposes:
- type: mcp
namespace: analytics-ops
port: 8080
tools:
- name: execute-workflow
description: "Power BI Supply Chain Dashboard Refresh - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Posts health score digest.
naftiko: "0.5"
info:
label: "Salesforce Account Health Score Digest"
description: "Posts health score digest."
tags:
- sales
- salesforce
- microsoft-teams
- customer-success
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: execute-workflow
description: "Salesforce Account Health Score Digest - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Queries Snowflake for customer trading volume metrics, calculates an account health score, and updates the Salesforce account record for use by the sales team.
naftiko: "0.5"
info:
label: "Salesforce Account Health Score Refresh"
description: "Queries Snowflake for customer trading volume metrics, calculates an account health score, and updates the Salesforce account record for use by the sales team."
tags:
- crm
- sales
- salesforce
- snowflake
- analytics
capability:
exposes:
- type: mcp
namespace: crm-analytics
port: 8080
tools:
- name: refresh-account-health-score
description: "Given a Salesforce account ID, query Snowflake for the customer's trailing 90-day trading volume and contract fulfillment rate, compute a health score (0–100), and update the Salesforce account record. Use for account review cycles or churn risk identification."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account ID (18-character)."
- name: customer_id
in: body
type: string
description: "Bunge internal customer ID for Snowflake lookup."
steps:
- name: get-trading-metrics
type: call
call: "snowflake-crm.execute-statement"
with:
statement: "SELECT SUM(volume_mt) as total_volume, AVG(fulfillment_rate) as avg_fulfillment FROM BUNGE_DW.SALES.CUSTOMER_METRICS WHERE customer_id='{{customer_id}}' AND trade_date >= DATEADD(day,-90,CURRENT_DATE())"
- name: update-account
type: call
call: "salesforce-acct.update-account"
with:
account_id: "{{account_id}}"
health_score: "{{get-trading-metrics.health_score}}"
last_score_date: "{{get-trading-metrics.as_of_date}}"
consumes:
- type: http
namespace: snowflake-crm
baseUri: "https://bunge.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: salesforce-acct
baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: update-account
method: PATCH
Retrieves a Salesforce support case by number, returning status, priority, and account name.
naftiko: "0.5"
info:
label: "Salesforce Case Lookup"
description: "Retrieves a Salesforce support case by number, returning status, priority, and account name."
tags:
- customer-service
- salesforce
- crm
capability:
exposes:
- type: mcp
namespace: customer-service-ops
port: 8080
tools:
- name: get-record
description: "Salesforce Case Lookup - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Routes complaints for resolution.
naftiko: "0.5"
info:
label: "Salesforce Customer Complaint Workflow"
description: "Routes complaints for resolution."
tags:
- customer-service
- salesforce
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: customer-service-ops
port: 8080
tools:
- name: execute-workflow
description: "Salesforce Customer Complaint Workflow - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Triggers credit reviews.
naftiko: "0.5"
info:
label: "Salesforce Customer Credit Review"
description: "Triggers credit reviews."
tags:
- sales
- salesforce
- microsoft-teams
- credit-management
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: execute-workflow
description: "Salesforce Customer Credit Review - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
When a new Salesforce lead is created, enriches it with ZoomInfo firmographic data and routes it to the correct regional sales queue based on geography.
naftiko: "0.5"
info:
label: "Salesforce Lead Enrichment and Routing"
description: "When a new Salesforce lead is created, enriches it with ZoomInfo firmographic data and routes it to the correct regional sales queue based on geography."
tags:
- crm
- sales
- salesforce
- zoominfo
- lead-management
capability:
exposes:
- type: mcp
namespace: crm-sales
port: 8080
tools:
- name: enrich-and-route-lead
description: "Given a Salesforce lead ID, fetch ZoomInfo firmographic data (company size, industry, revenue), update the lead record, and assign it to the correct regional sales queue. Use when a new inbound lead requires qualification and routing."
inputParameters:
- name: lead_id
in: body
type: string
description: "Salesforce lead record ID (18-character)."
steps:
- name: get-lead
type: call
call: "salesforce-read.get-lead"
with:
lead_id: "{{lead_id}}"
- name: enrich-firmographic
type: call
call: "zoominfo.search-company"
with:
company_name: "{{get-lead.Company}}"
country: "{{get-lead.Country}}"
- name: update-lead
type: call
call: "salesforce-write.update-lead"
with:
lead_id: "{{lead_id}}"
annual_revenue: "{{enrich-firmographic.revenue}}"
number_of_employees: "{{enrich-firmographic.employee_count}}"
industry: "{{enrich-firmographic.industry}}"
owner_queue: "{{enrich-firmographic.region}}"
consumes:
- type: http
namespace: salesforce-read
baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: get-lead
method: GET
- type: http
namespace: zoominfo
baseUri: "https://api.zoominfo.com/search"
authentication:
type: bearer
token: "$secrets.zoominfo_token"
resources:
- name: company-search
path: "/company"
operations:
- name: search-company
method: POST
- type: http
namespace: salesforce-write
baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: leads-update
path: "/sobjects/Lead/{{lead_id}}"
inputParameters:
- name: lead_id
in: path
operations:
- name: update-lead
method: PATCH
Creates SAP customer from Salesforce.
naftiko: "0.5"
info:
label: "Salesforce New Account to SAP Customer"
description: "Creates SAP customer from Salesforce."
tags:
- sales
- salesforce
- sap
- sync
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: execute-workflow
description: "Salesforce New Account to SAP Customer - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Generates a weekly pipeline digest from Salesforce, summarizing open opportunities by stage and region, and posts the report to a Microsoft Teams sales channel.
naftiko: "0.5"
info:
label: "Salesforce Opportunity Pipeline Digest"
description: "Generates a weekly pipeline digest from Salesforce, summarizing open opportunities by stage and region, and posts the report to a Microsoft Teams sales channel."
tags:
- crm
- sales
- salesforce
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: sales-reporting
port: 8080
tools:
- name: digest-pipeline
description: "Query Salesforce for all open opportunities grouped by stage and region, then post a structured weekly pipeline summary to the Microsoft Teams sales channel. Use for weekly sales reviews or executive briefings."
inputParameters:
- name: fiscal_quarter
in: body
type: string
description: "Fiscal quarter to filter by, e.g. Q2-2026."
steps:
- name: query-opportunities
type: call
call: "salesforce-opp.query-opportunities"
with:
quarter: "{{fiscal_quarter}}"
- name: post-digest
type: call
call: "msteams-sales.send-message"
with:
channel: "sales-leadership"
text: "Pipeline Digest {{fiscal_quarter}}: {{query-opportunities.summary}}"
consumes:
- type: http
namespace: salesforce-opp
baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/query"
operations:
- name: query-opportunities
method: GET
- type: http
namespace: msteams-sales
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates SAP contracts from won opportunities.
naftiko: "0.5"
info:
label: "Salesforce Opportunity to SAP Contract"
description: "Creates SAP contracts from won opportunities."
tags:
- sales
- salesforce
- sap
- sync
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: execute-workflow
description: "Salesforce Opportunity to SAP Contract - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Pushes pipeline to Power BI.
naftiko: "0.5"
info:
label: "Salesforce Quarterly Pipeline to Power BI"
description: "Pushes pipeline to Power BI."
tags:
- sales
- salesforce
- power-bi
- analytics
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: execute-workflow
description: "Salesforce Quarterly Pipeline to Power BI - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Pushes win-loss to Power BI.
naftiko: "0.5"
info:
label: "Salesforce Win-Loss Analysis Report"
description: "Pushes win-loss to Power BI."
tags:
- sales
- salesforce
- power-bi
- analytics
capability:
exposes:
- type: mcp
namespace: sales-ops
port: 8080
tools:
- name: execute-workflow
description: "Salesforce Win-Loss Analysis Report - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Creates tasks for expiring contracts.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Renewal Alert"
description: "Creates tasks for expiring contracts."
tags:
- procurement
- sap-ariba
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Ariba Contract Renewal Alert - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Routes match exceptions.
naftiko: "0.5"
info:
label: "SAP Ariba Invoice Matching Exception"
description: "Routes match exceptions."
tags:
- procurement
- sap-ariba
- microsoft-teams
- accounts-payable
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Ariba Invoice Matching Exception - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Submits a new purchase requisition in SAP Ariba, retrieves its approval status, and notifies the requestor via Microsoft Teams when approved or rejected.
naftiko: "0.5"
info:
label: "SAP Ariba Purchase Requisition Approval"
description: "Submits a new purchase requisition in SAP Ariba, retrieves its approval status, and notifies the requestor via Microsoft Teams when approved or rejected."
tags:
- procurement
- sap-ariba
- approval
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: procurement
port: 8080
tools:
- name: submit-purchase-requisition
description: "Given requisition details (commodity, quantity, unit price, supplier), create a purchase requisition in SAP Ariba and notify the requestor via Teams of the submission and initial approval status. Use for automated procurement intake."
inputParameters:
- name: commodity
in: body
type: string
description: "Commodity or material being procured, e.g. Soybean Oil."
- name: quantity
in: body
type: number
description: "Quantity to procure."
- name: unit_price
in: body
type: number
description: "Unit price in USD."
- name: supplier_id
in: body
type: string
description: "SAP Ariba supplier ID."
- name: requestor_upn
in: body
type: string
description: "UPN of the employee submitting the requisition."
steps:
- name: create-pr
type: call
call: "ariba.create-requisition"
with:
commodity: "{{commodity}}"
quantity: "{{quantity}}"
unit_price: "{{unit_price}}"
supplier_id: "{{supplier_id}}"
- name: notify-requestor
type: call
call: "msteams-proc.send-message"
with:
recipient_upn: "{{requestor_upn}}"
text: "Your purchase requisition for {{commodity}} has been submitted. Ariba PR ID: {{create-pr.requisition_id}} | Status: {{create-pr.status}}"
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/purchase-requisitions-buying/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: requisitions
path: "/requisitions"
operations:
- name: create-requisition
method: POST
- type: http
namespace: msteams-proc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail-send
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Posts supplier performance.
naftiko: "0.5"
info:
label: "SAP Ariba Supplier Performance Review"
description: "Posts supplier performance."
tags:
- procurement
- sap-ariba
- microsoft-teams
- supplier-management
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Ariba Supplier Performance Review - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Audits expenses.
naftiko: "0.5"
info:
label: "SAP Concur Expense Compliance Audit"
description: "Audits expenses."
tags:
- travel
- sap-concur
- microsoft-teams
- compliance
capability:
exposes:
- type: mcp
namespace: travel-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Concur Expense Compliance Audit - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Retrieves pending expense reports from SAP Concur for a given cost center, validates against Bunge travel policy thresholds, and approves or flags for manual review via Teams notification.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Approval"
description: "Retrieves pending expense reports from SAP Concur for a given cost center, validates against Bunge travel policy thresholds, and approves or flags for manual review via Teams notification."
tags:
- finance
- expense-management
- sap-concur
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: finance-expenses
port: 8080
tools:
- name: process-expense-approvals
description: "Retrieve pending expense reports in SAP Concur for a cost center, auto-approve those within policy, and flag out-of-policy reports to the finance manager in Teams. Use for automated expense workflow management."
inputParameters:
- name: cost_center
in: body
type: string
description: "Bunge cost center code to filter pending expense reports."
- name: policy_limit_usd
in: body
type: number
description: "Per-report USD threshold for auto-approval."
- name: finance_manager_upn
in: body
type: string
description: "UPN of the finance manager to notify for out-of-policy reports."
steps:
- name: get-reports
type: call
call: "concur.list-expense-reports"
with:
cost_center: "{{cost_center}}"
status: "PENDING"
- name: notify-manager
type: call
call: "msteams-finance.send-message"
with:
recipient_upn: "{{finance_manager_upn}}"
text: "Expense Reports Pending for cost center {{cost_center}}: {{get-reports.count}} reports. Policy limit: ${{policy_limit_usd}}. Please review out-of-policy items."
consumes:
- type: http
namespace: concur
baseUri: "https://www.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: expense-reports
path: "/expense/reports"
inputParameters:
- name: cost_center
in: query
- name: status
in: query
operations:
- name: list-expense-reports
method: GET
- type: http
namespace: msteams-finance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail-send
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Checks travel policy compliance.
naftiko: "0.5"
info:
label: "SAP Concur Travel Booking Compliance"
description: "Checks travel policy compliance."
tags:
- travel
- sap-concur
- microsoft-teams
- compliance
capability:
exposes:
- type: mcp
namespace: travel-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Concur Travel Booking Compliance - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Retrieves budget vs actual spend for a SAP cost center, returning planned budget and variance.
naftiko: "0.5"
info:
label: "SAP Cost Center Budget Check"
description: "Retrieves budget vs actual spend for a SAP cost center, returning planned budget and variance."
tags:
- finance
- sap
- erp
- budgeting
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: get-record
description: "SAP Cost Center Budget Check - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Posts demand forecasts.
naftiko: "0.5"
info:
label: "SAP Demand Planning Forecast Digest"
description: "Posts demand forecasts."
tags:
- supply-chain
- sap
- microsoft-teams
- forecasting
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Demand Planning Forecast Digest - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Posts close readiness.
naftiko: "0.5"
info:
label: "SAP Financial Close Readiness Check"
description: "Posts close readiness."
tags:
- finance
- sap
- microsoft-teams
- accounting
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Financial Close Readiness Check - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Checks whether a SAP financial posting period is open or closed.
naftiko: "0.5"
info:
label: "SAP Financial Posting Period Check"
description: "Checks whether a SAP financial posting period is open or closed."
tags:
- finance
- sap
- erp
- accounting
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: get-record
description: "SAP Financial Posting Period Check - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Creates audit tasks.
naftiko: "0.5"
info:
label: "SAP Goods Movement Reversal Alert"
description: "Creates audit tasks."
tags:
- supply-chain
- sap
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Goods Movement Reversal Alert - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Posts a goods receipt against a SAP purchase order, confirming delivery and updating inventory records.
naftiko: "0.5"
info:
label: "SAP Goods Receipt Posting"
description: "Posts a goods receipt against a SAP purchase order, confirming delivery and updating inventory records."
tags:
- supply-chain
- sap
- erp
- inventory
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: get-record
description: "SAP Goods Receipt Posting - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Creates purchase requisitions.
naftiko: "0.5"
info:
label: "SAP Inventory Reorder Point Alert"
description: "Creates purchase requisitions."
tags:
- supply-chain
- sap
- microsoft-teams
- inventory
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Inventory Reorder Point Alert - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Retrieves invoice payment status from SAP including approval state and payment date.
naftiko: "0.5"
info:
label: "SAP Invoice Payment Status"
description: "Retrieves invoice payment status from SAP including approval state and payment date."
tags:
- finance
- sap
- erp
- accounts-payable
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: get-record
description: "SAP Invoice Payment Status - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Receives an incoming vendor invoice, validates it against the SAP purchase order, posts the invoice in SAP, and notifies the AP team via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Invoice Processing Workflow"
description: "Receives an incoming vendor invoice, validates it against the SAP purchase order, posts the invoice in SAP, and notifies the AP team via Microsoft Teams."
tags:
- finance
- erp
- accounts-payable
- sap
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: erp-finance
port: 8080
tools:
- name: process-vendor-invoice
description: "Given a vendor invoice number, PO number, and invoice amount, validate the invoice against the SAP PO and post it to SAP S/4HANA. Notifies the AP team in Microsoft Teams on success or failure. Use for automated invoice processing."
inputParameters:
- name: invoice_number
in: body
type: string
description: "Vendor invoice number as it appears on the document."
- name: po_number
in: body
type: string
description: "Associated SAP purchase order number."
- name: invoice_amount
in: body
type: number
description: "Invoice total amount in the vendor's currency."
- name: currency
in: body
type: string
description: "Three-letter ISO currency code, e.g. USD."
steps:
- name: validate-po
type: call
call: "sap-po.get-po"
with:
po_number: "{{po_number}}"
- name: post-invoice
type: call
call: "sap-fi.post-invoice"
with:
po_number: "{{po_number}}"
invoice_number: "{{invoice_number}}"
amount: "{{invoice_amount}}"
currency: "{{currency}}"
- name: notify-ap
type: call
call: "msteams-ap.send-message"
with:
channel: "ap-team"
text: "Invoice {{invoice_number}} posted for PO {{po_number}} — Amount: {{invoice_amount}} {{currency}} | SAP Doc: {{post-invoice.document_number}}"
consumes:
- type: http
namespace: sap-po
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
- type: http
namespace: sap-fi
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: supplier-invoices
path: "/A_SupplierInvoice"
operations:
- name: post-invoice
method: POST
- type: http
namespace: msteams-ap
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Triggers an MRP planning run in SAP S/4HANA for a given plant and material group, retrieves planned order recommendations, and posts a summary to the supply chain Teams channel.
naftiko: "0.5"
info:
label: "SAP Material Requirements Planning Run"
description: "Triggers an MRP planning run in SAP S/4HANA for a given plant and material group, retrieves planned order recommendations, and posts a summary to the supply chain Teams channel."
tags:
- supply-chain
- erp
- sap
- planning
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: supply-planning
port: 8080
tools:
- name: run-mrp-plan
description: "Trigger an SAP S/4HANA MRP planning run for a specified plant and material group, retrieve the resulting planned orders, and post a summary count and key shortfalls to the supply chain Teams channel. Use for weekly supply planning cycles."
inputParameters:
- name: plant_code
in: body
type: string
description: "SAP plant code to run MRP for, e.g. BU01."
- name: material_group
in: body
type: string
description: "SAP material group code, e.g. OILSEEDS."
steps:
- name: trigger-mrp
type: call
call: "sap-mrp.run-mrp"
with:
plant: "{{plant_code}}"
material_group: "{{material_group}}"
- name: get-planned-orders
type: call
call: "sap-planned.list-planned-orders"
with:
plant: "{{plant_code}}"
mrp_run_id: "{{trigger-mrp.run_id}}"
- name: notify-supply-chain
type: call
call: "msteams-sc.send-message"
with:
channel: "supply-chain-ops"
text: "MRP Run Complete: Plant {{plant_code}} | {{get-planned-orders.count}} planned orders generated | {{get-planned-orders.shortfall_count}} shortfalls identified."
consumes:
- type: http
namespace: sap-mrp
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_MRP_MATERIALS_SRV_01"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: mrp-runs
path: "/MRPMaterialParameters"
operations:
- name: run-mrp
method: POST
- type: http
namespace: sap-planned
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_PLANNED_ORDERS_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: planned-orders
path: "/PlannedOrder"
inputParameters:
- name: plant
in: query
operations:
- name: list-planned-orders
method: GET
- type: http
namespace: msteams-sc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Runs the Bunge month-end close checklist against SAP S/4HANA, verifying that all required journal entries and reconciliations are complete, and posts a status summary to the Finance Teams channel.
naftiko: "0.5"
info:
label: "SAP Period-End Financial Close Checklist"
description: "Runs the Bunge month-end close checklist against SAP S/4HANA, verifying that all required journal entries and reconciliations are complete, and posts a status summary to the Finance Teams channel."
tags:
- finance
- erp
- sap
- period-close
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance-close
port: 8080
tools:
- name: run-period-close-check
description: "Query SAP S/4HANA for the status of all required period-end close tasks (journal entries, intercompany reconciliations, accruals) for a given fiscal period. Post a completion status summary to the Finance Teams channel. Use at month-end or quarter-end."
inputParameters:
- name: fiscal_year
in: body
type: string
description: "SAP fiscal year, e.g. 2026."
- name: fiscal_period
in: body
type: string
description: "SAP fiscal period (01-12)."
steps:
- name: get-close-status
type: call
call: "sap-close.get-period-status"
with:
fiscal_year: "{{fiscal_year}}"
fiscal_period: "{{fiscal_period}}"
- name: post-status
type: call
call: "msteams-close.send-message"
with:
channel: "finance-close"
text: "Period Close Status FY{{fiscal_year}}/P{{fiscal_period}}: {{get-close-status.complete_count}} complete, {{get-close-status.pending_count}} pending."
consumes:
- type: http
namespace: sap-close
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/FAM_PERIOD_CLOSE_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: period-status
path: "/PeriodCloseItems"
inputParameters:
- name: fiscal_year
in: query
- name: fiscal_period
in: query
operations:
- name: get-period-status
method: GET
- type: http
namespace: msteams-close
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates Jira tickets for failed batches.
naftiko: "0.5"
info:
label: "SAP Production Batch Quality Check"
description: "Creates Jira tickets for failed batches."
tags:
- manufacturing
- sap
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: manufacturing-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Production Batch Quality Check - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Retrieves the status of a SAP production order including planned quantity and manufacturing status.
naftiko: "0.5"
info:
label: "SAP Production Order Status"
description: "Retrieves the status of a SAP production order including planned quantity and manufacturing status."
tags:
- manufacturing
- sap
- erp
- production
capability:
exposes:
- type: mcp
namespace: manufacturing-ops
port: 8080
tools:
- name: get-record
description: "SAP Production Order Status - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Posts production variance.
naftiko: "0.5"
info:
label: "SAP Production Variance Report"
description: "Posts production variance."
tags:
- manufacturing
- sap
- microsoft-teams
- production
capability:
exposes:
- type: mcp
namespace: manufacturing-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Production Variance Report - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Looks up a Bunge SAP S/4HANA purchase order by number and returns header status, vendor details, total value, and open line items.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Looks up a Bunge SAP S/4HANA purchase order by number and returns header status, vendor details, total value, and open line items."
tags:
- finance
- erp
- procurement
- sap
capability:
exposes:
- type: mcp
namespace: erp
port: 8080
tools:
- name: get-purchase-order
description: "Given a SAP purchase order number, retrieve the PO header status, vendor name, total value, and currency from Bunge's SAP S/4HANA system. Use for procurement tracking, AP verification, or invoice matching."
inputParameters:
- name: po_number
in: body
type: string
description: "SAP purchase order number, e.g. 4500012345."
call: "sap-s4.get-po"
with:
po_number: "{{po_number}}"
outputParameters:
- name: status
type: string
mapping: "$.d.OverallStatus"
- name: vendor
type: string
mapping: "$.d.Supplier.CompanyName"
- name: total_value
type: string
mapping: "$.d.TotalAmount"
- name: currency
type: string
mapping: "$.d.TransactionCurrency"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: purchase-orders
path: "/A_PurchaseOrder('{{po_number}}')"
inputParameters:
- name: po_number
in: path
operations:
- name: get-po
method: GET
Retrieves a quality inspection lot from SAP QM and returns the inspection result and defect count.
naftiko: "0.5"
info:
label: "SAP Quality Inspection Result"
description: "Retrieves a quality inspection lot from SAP QM and returns the inspection result and defect count."
tags:
- manufacturing
- sap
- erp
- quality
capability:
exposes:
- type: mcp
namespace: manufacturing-ops
port: 8080
tools:
- name: get-record
description: "SAP Quality Inspection Result - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Retrieves the status of a SAP transport request including release status, target system, and owner.
naftiko: "0.5"
info:
label: "SAP Transport Request Status"
description: "Retrieves the status of a SAP transport request including release status, target system, and owner."
tags:
- devops
- sap
- erp
- transport-management
capability:
exposes:
- type: mcp
namespace: devops-ops
port: 8080
tools:
- name: get-record
description: "SAP Transport Request Status - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Retrieves vendor master data from SAP S/4HANA by vendor ID, returning contact details, payment terms, and bank account information for AP processing.
naftiko: "0.5"
info:
label: "SAP Vendor Master Data Lookup"
description: "Retrieves vendor master data from SAP S/4HANA by vendor ID, returning contact details, payment terms, and bank account information for AP processing."
tags:
- finance
- erp
- sap
- vendor-management
capability:
exposes:
- type: mcp
namespace: vendor-master
port: 8080
tools:
- name: get-vendor-master
description: "Given a SAP vendor ID, retrieve the vendor's master data including company name, address, payment terms, and bank details from Bunge's SAP S/4HANA system. Use for AP processing, vendor validation, or onboarding verification."
inputParameters:
- name: vendor_id
in: body
type: string
description: "SAP vendor account number, e.g. 100012345."
call: "sap-vendor.get-vendor"
with:
vendor_id: "{{vendor_id}}"
outputParameters:
- name: company_name
type: string
mapping: "$.d.SupplierName"
- name: payment_terms
type: string
mapping: "$.d.PaymentTerms"
- name: country
type: string
mapping: "$.d.Country"
consumes:
- type: http
namespace: sap-vendor
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: suppliers
path: "/A_Supplier('{{vendor_id}}')"
inputParameters:
- name: vendor_id
in: path
operations:
- name: get-vendor
method: GET
Checks the status of a SAP vendor payment run, returning processed count and total amount.
naftiko: "0.5"
info:
label: "SAP Vendor Payment Run Status"
description: "Checks the status of a SAP vendor payment run, returning processed count and total amount."
tags:
- finance
- sap
- erp
- accounts-payable
capability:
exposes:
- type: mcp
namespace: finance-ops
port: 8080
tools:
- name: get-record
description: "SAP Vendor Payment Run Status - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Generates vendor scorecards.
naftiko: "0.5"
info:
label: "SAP Vendor Scorecard Generation"
description: "Generates vendor scorecards."
tags:
- procurement
- sap
- microsoft-teams
- supplier-management
capability:
exposes:
- type: mcp
namespace: procurement-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Vendor Scorecard Generation - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Triggers cycle count workflows.
naftiko: "0.5"
info:
label: "SAP Warehouse Inventory Cycle Count"
description: "Triggers cycle count workflows."
tags:
- supply-chain
- sap
- microsoft-teams
- inventory
capability:
exposes:
- type: mcp
namespace: supply-chain-ops
port: 8080
tools:
- name: execute-workflow
description: "SAP Warehouse Inventory Cycle Count - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Creates a ServiceNow change request for a planned infrastructure change, assigns approvers, and notifies stakeholders via Microsoft Teams.
naftiko: "0.5"
info:
label: "ServiceNow Change Management Approval"
description: "Creates a ServiceNow change request for a planned infrastructure change, assigns approvers, and notifies stakeholders via Microsoft Teams."
tags:
- itsm
- change-management
- servicenow
- microsoft-teams
- approval
capability:
exposes:
- type: mcp
namespace: change-mgmt
port: 8080
tools:
- name: open-change-request
description: "Given change details (title, description, risk level, scheduled window), create a ServiceNow change request and notify the change advisory board channel in Teams. Use for planned infrastructure, deployment, or configuration changes."
inputParameters:
- name: change_title
in: body
type: string
description: "Short title describing the change."
- name: change_description
in: body
type: string
description: "Full description of the change, including rollback plan."
- name: risk_level
in: body
type: string
description: "Risk classification: low, medium, or high."
- name: scheduled_start
in: body
type: string
description: "Planned start datetime in ISO 8601 format."
steps:
- name: create-change
type: call
call: "servicenow-chg.create-change"
with:
short_description: "{{change_title}}"
description: "{{change_description}}"
risk: "{{risk_level}}"
planned_start: "{{scheduled_start}}"
- name: notify-cab
type: call
call: "msteams-cab.send-message"
with:
channel: "change-advisory-board"
text: "New Change Request: {{change_title}} | Risk: {{risk_level}} | Scheduled: {{scheduled_start}} | CHG: {{create-change.number}}"
consumes:
- type: http
namespace: servicenow-chg
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: msteams-cab
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Retrieves a ServiceNow change request and returns its approval status and risk level.
naftiko: "0.5"
info:
label: "ServiceNow Change Request Status"
description: "Retrieves a ServiceNow change request and returns its approval status and risk level."
tags:
- it-ops
- servicenow
- change-management
capability:
exposes:
- type: mcp
namespace: it-ops-ops
port: 8080
tools:
- name: get-record
description: "ServiceNow Change Request Status - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Retrieves a ServiceNow CMDB configuration item by asset tag.
naftiko: "0.5"
info:
label: "ServiceNow CMDB Asset Lookup"
description: "Retrieves a ServiceNow CMDB configuration item by asset tag."
tags:
- it-ops
- servicenow
- asset-management
capability:
exposes:
- type: mcp
namespace: it-ops-ops
port: 8080
tools:
- name: get-record
description: "ServiceNow CMDB Asset Lookup - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
When a P1 or P2 incident is raised in ServiceNow, enriches it with Datadog alert context, assigns it to the on-call engineer, and posts an alert to Microsoft Teams.
naftiko: "0.5"
info:
label: "ServiceNow Incident Triage and Assignment"
description: "When a P1 or P2 incident is raised in ServiceNow, enriches it with Datadog alert context, assigns it to the on-call engineer, and posts an alert to Microsoft Teams."
tags:
- itsm
- incident-response
- servicenow
- datadog
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: itsm-ops
port: 8080
tools:
- name: handle-critical-incident
description: "Given a ServiceNow incident number and Datadog alert ID, fetch alert details, update the incident with root-cause context, assign to the on-call engineer, and send a Teams alert. Use for P1/P2 incident triage."
inputParameters:
- name: incident_number
in: body
type: string
description: "ServiceNow incident number, e.g. INC0012345."
- name: datadog_alert_id
in: body
type: string
description: "Datadog monitor alert ID that triggered the incident."
steps:
- name: get-alert
type: call
call: "datadog.get-alert"
with:
alert_id: "{{datadog_alert_id}}"
- name: update-incident
type: call
call: "servicenow-update.update-incident"
with:
number: "{{incident_number}}"
work_notes: "Datadog alert: {{get-alert.name}} | Severity: {{get-alert.overall_state}} | Query: {{get-alert.query}}"
- name: notify-oncall
type: call
call: "msteams-ops.send-message"
with:
channel: "it-operations"
text: "P1 Incident {{incident_number}}: {{get-alert.name}} — assigned to on-call. Datadog alert {{datadog_alert_id}}."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: monitors
path: "/monitor/{{alert_id}}"
inputParameters:
- name: alert_id
in: path
operations:
- name: get-alert
method: GET
- type: http
namespace: servicenow-update
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident/{{number}}"
inputParameters:
- name: number
in: path
operations:
- name: update-incident
method: PATCH
- type: http
namespace: msteams-ops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Searches the ServiceNow knowledge base for articles matching a query.
naftiko: "0.5"
info:
label: "ServiceNow Knowledge Article Search"
description: "Searches the ServiceNow knowledge base for articles matching a query."
tags:
- it-ops
- servicenow
- knowledge-management
capability:
exposes:
- type: mcp
namespace: it-ops-ops
port: 8080
tools:
- name: get-record
description: "ServiceNow Knowledge Article Search - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Creates Teams bridge for P1.
naftiko: "0.5"
info:
label: "ServiceNow Major Incident Bridge"
description: "Creates Teams bridge for P1."
tags:
- it-ops
- servicenow
- microsoft-teams
- incident-management
capability:
exposes:
- type: mcp
namespace: it-ops-ops
port: 8080
tools:
- name: execute-workflow
description: "ServiceNow Major Incident Bridge - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Creates investigation tickets.
naftiko: "0.5"
info:
label: "ServiceNow Problem Management Workflow"
description: "Creates investigation tickets."
tags:
- it-ops
- servicenow
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: it-ops-ops
port: 8080
tools:
- name: execute-workflow
description: "ServiceNow Problem Management Workflow - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Escalates SLA breaches.
naftiko: "0.5"
info:
label: "ServiceNow SLA Breach Escalation"
description: "Escalates SLA breaches."
tags:
- it-ops
- servicenow
- microsoft-teams
- sla-management
capability:
exposes:
- type: mcp
namespace: it-ops-ops
port: 8080
tools:
- name: execute-workflow
description: "ServiceNow SLA Breach Escalation - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Searches a SharePoint site for documents matching a keyword.
naftiko: "0.5"
info:
label: "SharePoint Document Search"
description: "Searches a SharePoint site for documents matching a keyword."
tags:
- collaboration
- sharepoint
- document-management
capability:
exposes:
- type: mcp
namespace: collaboration-ops
port: 8080
tools:
- name: get-record
description: "SharePoint Document Search - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Triggers a Snowflake refresh of the grain trading analytics view and pushes updated data to a Power BI dataset for executive dashboards.
naftiko: "0.5"
info:
label: "Snowflake BI Refresh and Power BI Publish"
description: "Triggers a Snowflake refresh of the grain trading analytics view and pushes updated data to a Power BI dataset for executive dashboards."
tags:
- data
- analytics
- snowflake
- power-bi
- reporting
capability:
exposes:
- type: mcp
namespace: bi-reporting
port: 8080
tools:
- name: refresh-trading-dashboard
description: "Execute the Snowflake grain trading analytics view refresh and push updated aggregates to the Power BI executive dashboard dataset. Use before board reporting cycles or on-demand for executive requests."
inputParameters:
- name: report_date
in: body
type: string
description: "Reporting date in YYYY-MM-DD format."
steps:
- name: refresh-view
type: call
call: "snowflake-bi.execute-statement"
with:
statement: "CALL BUNGE_DW.ANALYTICS.REFRESH_TRADING_VIEW('{{report_date}}')"
- name: push-dataset
type: call
call: "powerbi-exec.push-rows"
with:
dataset_id: "$secrets.powerbi_trading_dataset_id"
table: "TradingMetrics"
rows: "{{refresh-view.data}}"
consumes:
- type: http
namespace: snowflake-bi
baseUri: "https://bunge.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
method: POST
- type: http
namespace: powerbi-exec
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-rows
path: "/datasets/{{dataset_id}}/tables/{{table}}/rows"
inputParameters:
- name: dataset_id
in: path
- name: table
in: path
operations:
- name: push-rows
method: POST
Runs a data quality validation query against a Snowflake table and publishes results to a Power BI dataset, alerting via Teams if row counts or null rates exceed thresholds.
naftiko: "0.5"
info:
label: "Snowflake Data Pipeline Quality Check"
description: "Runs a data quality validation query against a Snowflake table and publishes results to a Power BI dataset, alerting via Teams if row counts or null rates exceed thresholds."
tags:
- data
- analytics
- snowflake
- power-bi
- data-quality
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: run-pipeline-quality-check
description: "Given a Snowflake table name and quality threshold parameters, run a row-count and null-rate check. Push results to a Power BI streaming dataset and alert Teams if thresholds are breached. Use for daily ETL validation."
inputParameters:
- name: table_name
in: body
type: string
description: "Fully qualified Snowflake table name, e.g. BUNGE_DW.GRAINS.PRICE_HISTORY."
- name: max_null_rate
in: body
type: number
description: "Maximum acceptable null rate (0.0–1.0) for key columns."
- name: min_row_count
in: body
type: integer
description: "Minimum expected row count in the table."
steps:
- name: run-quality-sql
type: call
call: "snowflake-dq.execute-statement"
with:
statement: "SELECT COUNT(*) as row_count, SUM(CASE WHEN key_col IS NULL THEN 1 ELSE 0 END)/COUNT(*) as null_rate FROM {{table_name}}"
- name: push-to-powerbi
type: call
call: "powerbi.push-rows"
with:
dataset_id: "$secrets.powerbi_dq_dataset_id"
table: "QualityResults"
rows: "{{run-quality-sql.data}}"
- name: alert-if-breach
type: call
call: "msteams-data.send-message"
with:
channel: "data-engineering"
text: "DQ Check {{table_name}}: rows={{run-quality-sql.row_count}}, null_rate={{run-quality-sql.null_rate}}"
consumes:
- type: http
namespace: snowflake-dq
baseUri: "https://bunge.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-statement
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/{{dataset_id}}/tables/{{table}}/rows"
inputParameters:
- name: dataset_id
in: path
- name: table
in: path
operations:
- name: push-rows
method: POST
- type: http
namespace: msteams-data
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates Jira tickets for ETL failures.
naftiko: "0.5"
info:
label: "Snowflake ETL Pipeline Failure Handler"
description: "Creates Jira tickets for ETL failures."
tags:
- data-engineering
- snowflake
- jira
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: data-engineering-ops
port: 8080
tools:
- name: execute-workflow
description: "Snowflake ETL Pipeline Failure Handler - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Aggregates ESG data.
naftiko: "0.5"
info:
label: "Sustainability Reporting Data Aggregation"
description: "Aggregates ESG data."
tags:
- compliance
- sustainability
- microsoft-teams
- agribusiness
capability:
exposes:
- type: mcp
namespace: compliance-ops
port: 8080
tools:
- name: execute-workflow
description: "Sustainability Reporting Data Aggregation - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Summarizes contracts via AI.
naftiko: "0.5"
info:
label: "Trade Contract Document Summarization"
description: "Summarizes contracts via AI."
tags:
- artificial-intelligence
- legal
- microsoft-teams
- agribusiness
capability:
exposes:
- type: mcp
namespace: artificial-intelligence-ops
port: 8080
tools:
- name: execute-workflow
description: "Trade Contract Document Summarization - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Queries Workday for employees who have not completed open enrollment by the deadline and sends personalized reminder messages via Microsoft Teams.
naftiko: "0.5"
info:
label: "Workday Benefits Enrollment Reminder"
description: "Queries Workday for employees who have not completed open enrollment by the deadline and sends personalized reminder messages via Microsoft Teams."
tags:
- hr
- benefits
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-benefits
port: 8080
tools:
- name: send-enrollment-reminders
description: "Retrieve all Bunge employees from Workday who have not yet completed open enrollment for the current benefit plan year, and send each a personalized Teams reminder message. Use in the final week of the open enrollment window."
inputParameters:
- name: enrollment_deadline
in: body
type: string
description: "Open enrollment deadline date in YYYY-MM-DD format."
- name: plan_year
in: body
type: string
description: "Benefit plan year, e.g. 2026."
steps:
- name: get-pending-enrollments
type: call
call: "workday-ben.list-pending-enrollments"
with:
plan_year: "{{plan_year}}"
status: "Not_Started"
- name: send-reminders
type: call
call: "msteams-ben.send-message"
with:
channel: "hr-announcements"
text: "Benefits Open Enrollment Reminder: {{get-pending-enrollments.count}} employees have not yet enrolled. Deadline: {{enrollment_deadline}}. Please log into Workday to complete your elections."
consumes:
- type: http
namespace: workday-ben
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: benefit-enrollments
path: "/bunge/benefitElections"
inputParameters:
- name: plan_year
in: query
- name: status
in: query
operations:
- name: list-pending-enrollments
method: GET
- type: http
namespace: msteams-ben
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel_id}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Updates access on transfers.
naftiko: "0.5"
info:
label: "Workday Employee Transfer Provisioning"
description: "Updates access on transfers."
tags:
- hr
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: execute-workflow
description: "Workday Employee Transfer Provisioning - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Posts headcount variance.
naftiko: "0.5"
info:
label: "Workday Headcount Variance Report"
description: "Posts headcount variance."
tags:
- hr
- workday
- microsoft-teams
- workforce-planning
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: execute-workflow
description: "Workday Headcount Variance Report - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Retrieves a Workday job requisition by ID and returns approval status, hiring manager, and target start date.
naftiko: "0.5"
info:
label: "Workday Job Requisition Status"
description: "Retrieves a Workday job requisition by ID and returns approval status, hiring manager, and target start date."
tags:
- hr
- recruiting
- workday
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: get-record
description: "Workday Job Requisition Status - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Posts learning digest.
naftiko: "0.5"
info:
label: "Workday Learning Completion Digest"
description: "Posts learning digest."
tags:
- hr
- workday
- microsoft-teams
- learning
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: execute-workflow
description: "Workday Learning Completion Digest - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Creates IT equipment requests for new hires.
naftiko: "0.5"
info:
label: "Workday New Hire IT Equipment Provisioning"
description: "Creates IT equipment requests for new hires."
tags:
- hr
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: execute-workflow
description: "Workday New Hire IT Equipment Provisioning - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Retrieves the organizational hierarchy for a Workday worker, returning manager and direct reports count.
naftiko: "0.5"
info:
label: "Workday Org Chart Lookup"
description: "Retrieves the organizational hierarchy for a Workday worker, returning manager and direct reports count."
tags:
- hr
- workday
- organization
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: get-record
description: "Workday Org Chart Lookup - retrieve record data for operations review."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
call: primary.get-record
with:
record_id: "{{record_id}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: result
type: string
mapping: "$.result"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: records
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-record
method: GET
Launches review cycle.
naftiko: "0.5"
info:
label: "Workday Performance Review Kickoff"
description: "Launches review cycle."
tags:
- hr
- workday
- microsoft-teams
- performance-management
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: execute-workflow
description: "Workday Performance Review Kickoff - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
When an employee's role changes in Workday, updates their Salesforce profile permissions and notifies their new manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Workday Role Change Provisioning"
description: "When an employee's role changes in Workday, updates their Salesforce profile permissions and notifies their new manager via Microsoft Teams."
tags:
- hr
- role-management
- workday
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-provisioning
port: 8080
tools:
- name: sync-role-change
description: "Given a Workday worker ID and new role details, update the employee's Salesforce profile to match their new role permissions and notify the new manager via Teams. Use when an employee is promoted or transferred."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday worker ID."
- name: new_role
in: body
type: string
description: "New job title or role name."
- name: new_manager_upn
in: body
type: string
description: "UPN of the employee's new manager."
steps:
- name: get-worker
type: call
call: "workday-role.get-worker"
with:
worker_id: "{{employee_id}}"
- name: update-sf-profile
type: call
call: "salesforce-role.update-user"
with:
user_id: "{{get-worker.salesforce_id}}"
profile: "{{new_role}}"
- name: notify-manager
type: call
call: "msteams-mgr.send-message"
with:
recipient_upn: "{{new_manager_upn}}"
text: "{{get-worker.display_name}} has been added to your team as {{new_role}}. Their Salesforce access has been updated."
consumes:
- type: http
namespace: workday-role
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/bunge/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: salesforce-role
baseUri: "https://bunge.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User/{{user_id}}"
inputParameters:
- name: user_id
in: path
operations:
- name: update-user
method: PATCH
- type: http
namespace: msteams-mgr
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail-send
path: "/users/{{recipient_upn}}/sendMail"
inputParameters:
- name: recipient_upn
in: path
operations:
- name: send-message
method: POST
Revokes access on termination.
naftiko: "0.5"
info:
label: "Workday Termination Access Revocation"
description: "Revokes access on termination."
tags:
- hr
- security
- workday
- servicenow
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: execute-workflow
description: "Workday Termination Access Revocation - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST
Deactivates badges on termination.
naftiko: "0.5"
info:
label: "Workday Termination Badge Deactivation"
description: "Deactivates badges on termination."
tags:
- hr
- security
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-ops
port: 8080
tools:
- name: execute-workflow
description: "Workday Termination Badge Deactivation - orchestrate multi-step workflow across services."
inputParameters:
- name: record_id
in: body
type: string
description: "The primary record identifier."
steps:
- name: get-data
type: call
call: primary.get-data
with:
record_id: "{{record_id}}"
- name: process-result
type: call
call: secondary.process
with:
data: "{{get-data.result}}"
- name: notify-team
type: call
call: msteams.post-message
with:
channel_id: "$secrets.teams_ops_channel_id"
text: "Processed {{record_id}} | Result: {{process-result.status}}"
consumes:
- type: http
namespace: primary
baseUri: "https://bunge-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_user"
password: "$secrets.sap_password"
resources:
- name: data
path: "/records/{{record_id}}"
inputParameters:
- name: record_id
in: path
operations:
- name: get-data
method: GET
- type: http
namespace: secondary
baseUri: "https://bunge.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: tasks
path: "/table/sc_task"
operations:
- name: process
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/$secrets.teams_team_id/channels/{{channel_id}}/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: post-message
method: POST