Jpmorgan Chase Capabilities
Naftiko 0.5 capability definitions for Jpmorgan Chase - 100 capabilities showing integration workflows and service orchestrations.
Handles ACH payment returns by retrieving return details from Snowflake, updating the payment record in Salesforce, and notifying the payments team via Microsoft Teams.
naftiko: "0.5"
info:
label: "ACH Payment Return Handling"
description: "Handles ACH payment returns by retrieving return details from Snowflake, updating the payment record in Salesforce, and notifying the payments team via Microsoft Teams."
tags:
- payments
- ach
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ach-return
port: 8080
tools:
- name: handle-ach-return
description: "Given an ACH return reference, retrieves details from Snowflake, updates Salesforce, and notifies the payments team."
inputParameters:
- name: return_ref
in: body
type: string
description: "The ACH return reference number."
- name: return_reason_code
in: body
type: string
description: "The ACH return reason code (e.g., R01, R02)."
steps:
- name: get-return-details
type: call
call: "snowflake-payments.query-ach-return"
with:
return_ref: "{{return_ref}}"
- name: update-payment-record
type: call
call: "salesforce-payments.update-payment"
with:
paymentId: "{{get-return-details.original_payment_id}}"
Status__c: "Returned"
Return_Reason__c: "{{return_reason_code}}"
- name: notify-payments-team
type: call
call: "msteams-payments.send-message"
with:
channel_id: "$secrets.payments_channel_id"
message: "ACH return: {{return_ref}} ({{return_reason_code}}). Original amount: {{get-return-details.amount}}."
consumes:
- type: http
namespace: snowflake-payments
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: return_ref
in: body
operations:
- name: query-ach-return
method: POST
- type: http
namespace: salesforce-payments
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: payments
path: "/sobjects/Payment__c/{{paymentId}}"
inputParameters:
- name: paymentId
in: path
operations:
- name: update-payment
method: PATCH
- type: http
namespace: msteams-payments
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Detects suspicious transaction patterns in Snowflake, creates an AML investigation case in Salesforce, and notifies the financial crimes team via Microsoft Teams.
naftiko: "0.5"
info:
label: "AML Transaction Monitoring Alert"
description: "Detects suspicious transaction patterns in Snowflake, creates an AML investigation case in Salesforce, and notifies the financial crimes team via Microsoft Teams."
tags:
- compliance
- aml
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: aml-monitoring
port: 8080
tools:
- name: handle-aml-alert
description: "Given a customer ID and alert trigger, queries Snowflake for transaction patterns, creates a Salesforce investigation case, and alerts the financial crimes team."
inputParameters:
- name: customer_id
in: body
type: string
description: "The customer identifier."
- name: alert_type
in: body
type: string
description: "The AML alert type (e.g., structuring, rapid-movement, high-risk-jurisdiction)."
steps:
- name: get-transaction-patterns
type: call
call: "snowflake-aml.query-patterns"
with:
customer_id: "{{customer_id}}"
alert_type: "{{alert_type}}"
- name: create-investigation
type: call
call: "salesforce-aml.create-case"
with:
subject: "AML Alert: {{alert_type}} for customer {{customer_id}}"
description: "Transaction count: {{get-transaction-patterns.txn_count}}\nTotal amount: {{get-transaction-patterns.total_amount}}\nPeriod: {{get-transaction-patterns.period}}"
priority: "High"
- name: notify-fincrime
type: call
call: "msteams-fincrime.send-message"
with:
channel_id: "$secrets.fincrime_channel_id"
message: "AML alert for customer {{customer_id}}: {{alert_type}}. Case: {{create-investigation.case_number}}."
consumes:
- type: http
namespace: snowflake-aml
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: customer_id
in: body
- name: alert_type
in: body
operations:
- name: query-patterns
method: POST
- type: http
namespace: salesforce-aml
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: msteams-fincrime
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
When a P1 ServiceNow incident is raised, uses Anthropic to analyze incident notes and recent Datadog metrics to draft a structured incident summary and recommended remediation steps for the on-call team.
naftiko: "0.5"
info:
label: "Anthropic Incident Triage Assistant"
description: "When a P1 ServiceNow incident is raised, uses Anthropic to analyze incident notes and recent Datadog metrics to draft a structured incident summary and recommended remediation steps for the on-call team."
tags:
- ai
- incident-response
- anthropic
- servicenow
- datadog
capability:
exposes:
- type: mcp
namespace: ai-incident-triage
port: 8080
tools:
- name: triage-p1-incident
description: "Given a ServiceNow P1 incident number and a Datadog monitor ID, fetches incident details and monitor state, then calls Anthropic to draft a structured triage summary with recommended next steps. Invoke immediately when a P1 incident is created."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow P1 incident number (e.g., INC0012345)."
- name: datadog_monitor_id
in: body
type: string
description: "The Datadog monitor ID related to this incident."
steps:
- name: get-incident
type: call
call: "servicenow-triage.get-incident"
with:
number: "{{incident_number}}"
- name: get-monitor
type: call
call: "datadog-triage.get-monitor"
with:
monitor_id: "{{datadog_monitor_id}}"
- name: generate-triage-summary
type: call
call: "anthropic-triage.create-message"
with:
model: "claude-opus-4-5"
max_tokens: 800
messages:
- role: "user"
content: "Triage this incident: {{get-incident.description}}. Datadog monitor status: {{get-monitor.overall_state}}. Provide: Root Cause Hypothesis, Immediate Actions, Escalation Path."
consumes:
- type: http
namespace: servicenow-triage
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: number
in: query
operations:
- name: get-incident
method: GET
- type: http
namespace: datadog-triage
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/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
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"
inputParameters:
- name: model
in: body
- name: max_tokens
in: body
- name: messages
in: body
operations:
- name: create-message
method: POST
Uses Anthropic to generate a structured executive summary of lengthy regulatory or compliance documents, making dense financial regulation accessible to non-specialist stakeholders.
naftiko: "0.5"
info:
label: "Anthropic Regulatory Document Summarizer"
description: "Uses Anthropic to generate a structured executive summary of lengthy regulatory or compliance documents, making dense financial regulation accessible to non-specialist stakeholders."
tags:
- ai
- compliance
- regulatory
- anthropic
capability:
exposes:
- type: mcp
namespace: ai-compliance
port: 8080
tools:
- name: summarize-regulatory-document
description: "Given the text of a regulatory document (e.g., SEC guidance, FINRA notice, Basel amendment), calls Anthropic Claude to produce a structured executive summary highlighting key obligations, deadlines, and impacted business lines. Invoke when compliance teams receive new regulatory guidance."
inputParameters:
- name: document_text
in: body
type: string
description: "The full text of the regulatory document to summarize."
- name: document_title
in: body
type: string
description: "The title or reference number of the document (e.g., SEC Release 34-12345)."
call: "anthropic.create-message"
with:
model: "claude-opus-4-5"
max_tokens: 1024
system: "You are a financial regulatory compliance analyst. Summarize regulatory documents with sections: Key Obligations, Compliance Deadlines, Impacted Business Lines, and Recommended Actions."
messages:
- role: "user"
content: "Summarize this regulatory document titled '{{document_title}}': {{document_text}}"
outputParameters:
- name: summary
type: string
mapping: "$.content[0].text"
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"
inputParameters:
- name: model
in: body
- name: max_tokens
in: body
- name: system
in: body
- name: messages
in: body
operations:
- name: create-message
method: POST
Triggers an Azure Databricks ML model training job for risk or fraud detection models and posts training metrics to the data science team's Microsoft Teams channel upon completion.
naftiko: "0.5"
info:
label: "Azure Databricks ML Model Training Run"
description: "Triggers an Azure Databricks ML model training job for risk or fraud detection models and posts training metrics to the data science team's Microsoft Teams channel upon completion."
tags:
- ai
- machine-learning
- azure-databricks
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ml-training
port: 8080
tools:
- name: trigger-model-training
description: "Given a Databricks job ID and parameter overrides, triggers a model training run and notifies the data science team in Teams with run status. Invoke when updated training data is available or a retraining schedule fires."
inputParameters:
- name: job_id
in: body
type: string
description: "The Azure Databricks job ID for the model training pipeline."
- name: model_name
in: body
type: string
description: "The name of the model being trained (e.g., fraud-detection-v3)."
- name: ds_channel_id
in: body
type: string
description: "The Teams channel ID for the data science team."
steps:
- name: trigger-run
type: call
call: "databricks.run-now"
with:
job_id: "{{job_id}}"
- name: notify-data-science
type: call
call: "msteams-ds.send-message"
with:
channel_id: "{{ds_channel_id}}"
message: "Model training job triggered for {{model_name}} (Databricks job {{job_id}}). Run ID: {{trigger-run.run_id}}."
consumes:
- type: http
namespace: databricks
baseUri: "https://adb-jpmorgan.azuredatabricks.net/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: job-runs
path: "/jobs/run-now"
inputParameters:
- name: job_id
in: body
operations:
- name: run-now
method: POST
- type: http
namespace: msteams-ds
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Validates Bloomberg market data feeds in Snowflake against expected benchmarks, creates a ServiceNow incident for data quality issues, and notifies the market data team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Bloomberg Market Data Quality Check"
description: "Validates Bloomberg market data feeds in Snowflake against expected benchmarks, creates a ServiceNow incident for data quality issues, and notifies the market data team via Microsoft Teams."
tags:
- trading
- bloomberg
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: market-data-quality
port: 8080
tools:
- name: check-market-data-quality
description: "Given a data feed name and check date, queries Snowflake for quality metrics, creates a ServiceNow incident for issues, and alerts the team."
inputParameters:
- name: feed_name
in: body
type: string
description: "The Bloomberg data feed name."
- name: check_date
in: body
type: string
description: "The date to check in YYYY-MM-DD format."
steps:
- name: run-quality-check
type: call
call: "snowflake-market-data.query-quality"
with:
feed: "{{feed_name}}"
date: "{{check_date}}"
- name: create-incident
type: call
call: "servicenow-data.create-incident"
with:
short_description: "Market data quality: {{feed_name}} ({{check_date}})"
description: "Feed: {{feed_name}}\nMissing records: {{run-quality-check.missing_count}}\nStale records: {{run-quality-check.stale_count}}"
urgency: "2"
- name: notify-market-data-team
type: call
call: "msteams-market-data.send-message"
with:
channel_id: "$secrets.market_data_channel_id"
message: "Market data quality alert: {{feed_name}} on {{check_date}}. Missing: {{run-quality-check.missing_count}}, Stale: {{run-quality-check.stale_count}}. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: snowflake-market-data
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: feed
in: body
- name: date
in: body
operations:
- name: query-quality
method: POST
- type: http
namespace: servicenow-data
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-market-data
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
When a GitHub Actions pipeline fails, queries Datadog for related application errors, opens a Jira incident ticket, and alerts the engineering team in Microsoft Teams.
naftiko: "0.5"
info:
label: "CI/CD Pipeline Failure Observability Chain"
description: "When a GitHub Actions pipeline fails, queries Datadog for related application errors, opens a Jira incident ticket, and alerts the engineering team in Microsoft Teams."
tags:
- devops
- ci-cd
- incident-response
- github
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devops-cicd
port: 8080
tools:
- name: handle-pipeline-failure
description: "Given a GitHub Actions run ID and repository name, fetches failure logs, queries Datadog for correlated errors, creates a ServiceNow incident, and notifies the engineering team in Teams. Invoke on pipeline failure webhook events."
inputParameters:
- name: run_id
in: body
type: string
description: "The GitHub Actions workflow run ID that failed."
- name: repo_name
in: body
type: string
description: "The GitHub repository name (e.g., jpmorgan/payments-service)."
- name: eng_channel_id
in: body
type: string
description: "The Teams channel ID for the responsible engineering team."
steps:
- name: get-run-logs
type: call
call: "github.get-workflow-run"
with:
repo: "{{repo_name}}"
run_id: "{{run_id}}"
- name: query-datadog-errors
type: call
call: "datadog.search-logs"
with:
query: "service:{{repo_name}} status:error"
timeRange: "15m"
- name: create-servicenow-incident
type: call
call: "servicenow-eng.create-incident"
with:
short_description: "Pipeline failure: {{repo_name}} run {{run_id}}"
category: "Software"
urgency: "2"
- name: notify-eng-team
type: call
call: "msteams-eng.send-message"
with:
channel_id: "{{eng_channel_id}}"
message: "Pipeline failure in {{repo_name}} (run {{run_id}}). ServiceNow incident created: {{create-servicenow-incident.number}}. Datadog errors: {{query-datadog-errors.total}}."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-runs
path: "/repos/{{repo}}/actions/runs/{{run_id}}"
inputParameters:
- name: repo
in: path
- name: run_id
in: path
operations:
- name: get-workflow-run
method: GET
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: logs
path: "/logs-queries/list"
inputParameters:
- name: query
in: body
- name: timeRange
in: body
operations:
- name: search-logs
method: POST
- type: http
namespace: servicenow-eng
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
- name: urgency
in: body
operations:
- name: create-incident
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Creates a Salesforce client onboarding case, provisions a SharePoint document collection folder, and notifies the relationship manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Client Onboarding Document Collection"
description: "Creates a Salesforce client onboarding case, provisions a SharePoint document collection folder, and notifies the relationship manager via Microsoft Teams."
tags:
- wealth
- client-onboarding
- salesforce
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: client-onboarding
port: 8080
tools:
- name: initiate-client-onboarding
description: "Given new client details, creates a Salesforce case, sets up a SharePoint document folder, and notifies the RM team via Teams."
inputParameters:
- name: client_name
in: body
type: string
description: "The new client legal name."
- name: client_type
in: body
type: string
description: "The client type: individual or institutional."
- name: relationship_manager
in: body
type: string
description: "The assigned relationship manager email."
steps:
- name: create-onboarding-case
type: call
call: "salesforce-onboarding.create-case"
with:
subject: "Client onboarding: {{client_name}}"
Type: "Onboarding"
Client_Type__c: "{{client_type}}"
- name: create-doc-folder
type: call
call: "sharepoint-docs.create-folder"
with:
folderPath: "/Client Onboarding/{{client_name}}"
- name: notify-rm
type: call
call: "msteams-onboarding.send-message"
with:
channel_id: "$secrets.onboarding_channel_id"
message: "New client onboarding initiated for {{client_name}} ({{client_type}}). Case: {{create-onboarding-case.case_number}}. Documents folder ready."
consumes:
- type: http
namespace: salesforce-onboarding
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: sharepoint-docs
baseUri: "https://graph.microsoft.com/v1.0/sites/jpmorgan.sharepoint.com"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: folders
path: "/drive/root:/{{folderPath}}"
inputParameters:
- name: folderPath
in: path
operations:
- name: create-folder
method: PATCH
- type: http
namespace: msteams-onboarding
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Reviews client risk ratings by pulling transaction data from Snowflake, checking current Salesforce risk scores, and creating a ServiceNow review task for the risk team.
naftiko: "0.5"
info:
label: "Client Risk Rating Review Workflow"
description: "Reviews client risk ratings by pulling transaction data from Snowflake, checking current Salesforce risk scores, and creating a ServiceNow review task for the risk team."
tags:
- risk
- compliance
- snowflake
- salesforce
- servicenow
capability:
exposes:
- type: mcp
namespace: risk-rating-review
port: 8080
tools:
- name: review-client-risk-rating
description: "Given a client ID, pulls transaction analytics from Snowflake, checks Salesforce risk scores, and creates a ServiceNow review task."
inputParameters:
- name: client_id
in: body
type: string
description: "The client account ID."
- name: review_period
in: body
type: string
description: "The review period (e.g., 2025-Q4)."
steps:
- name: get-transaction-analytics
type: call
call: "snowflake-risk.query-client-analytics"
with:
client_id: "{{client_id}}"
period: "{{review_period}}"
- name: get-current-rating
type: call
call: "salesforce-risk.get-account"
with:
accountId: "{{client_id}}"
- name: create-review-task
type: call
call: "servicenow-risk.create-task"
with:
short_description: "Risk rating review: {{get-current-rating.Name}} ({{review_period}})"
description: "Current risk rating: {{get-current-rating.Risk_Rating__c}}\nTransaction volume: {{get-transaction-analytics.txn_volume}}\nAvg transaction size: {{get-transaction-analytics.avg_txn_size}}"
assignment_group: "Credit Risk Management"
consumes:
- type: http
namespace: snowflake-risk
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: client_id
in: body
- name: period
in: body
operations:
- name: query-client-analytics
method: POST
- type: http
namespace: salesforce-risk
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{accountId}}"
inputParameters:
- name: accountId
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: servicenow-risk
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Detects unexpected cloud spend spikes in AWS or Azure, creates a ServiceNow cost management incident, and routes the alert to the FinOps team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Cloud Cost Anomaly Responder"
description: "Detects unexpected cloud spend spikes in AWS or Azure, creates a ServiceNow cost management incident, and routes the alert to the FinOps team via Microsoft Teams."
tags:
- cloud
- infra
- cost-management
- aws
- azure
- servicenow
capability:
exposes:
- type: mcp
namespace: cloud-cost
port: 8080
tools:
- name: respond-to-cost-anomaly
description: "Given a cloud provider, account ID, and anomaly amount, creates a ServiceNow FinOps incident and notifies the cloud cost management team in Teams. Invoke when automated cost anomaly detection flags an unexpected spend increase."
inputParameters:
- name: account_id
in: body
type: string
description: "The cloud account or subscription ID where the anomaly was detected."
- name: anomaly_amount
in: body
type: number
description: "The estimated overspend amount in USD."
- name: finops_channel
in: body
type: string
description: "The Teams channel ID for the FinOps team."
steps:
- name: create-finops-incident
type: call
call: "servicenow-finops.create-incident"
with:
short_description: "Cloud cost anomaly: account {{account_id}} — estimated overspend ${{anomaly_amount}}"
category: "Cloud Cost"
urgency: "2"
- name: notify-finops
type: call
call: "msteams-finops.send-message"
with:
channel_id: "{{finops_channel}}"
message: "Cloud cost anomaly on account {{account_id}}: estimated ${{anomaly_amount}} overspend. ServiceNow incident: {{create-finops-incident.number}}."
consumes:
- type: http
namespace: servicenow-finops
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
- name: urgency
in: body
operations:
- name: create-incident
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Calculates margin requirements from Snowflake, creates a margin call record in Salesforce, and notifies the collateral management team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Collateral Margin Call Workflow"
description: "Calculates margin requirements from Snowflake, creates a margin call record in Salesforce, and notifies the collateral management team via Microsoft Teams."
tags:
- trading
- collateral
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: margin-call
port: 8080
tools:
- name: process-margin-call
description: "Given a counterparty and portfolio, calculates margin from Snowflake, creates a Salesforce margin call, and notifies the collateral team."
inputParameters:
- name: counterparty_id
in: body
type: string
description: "The counterparty identifier."
- name: portfolio_id
in: body
type: string
description: "The portfolio identifier for margin calculation."
steps:
- name: calc-margin
type: call
call: "snowflake-collateral.query-margin"
with:
counterparty: "{{counterparty_id}}"
portfolio: "{{portfolio_id}}"
- name: create-margin-call
type: call
call: "salesforce-collateral.create-margin-call"
with:
Counterparty__c: "{{counterparty_id}}"
Required_Margin__c: "{{calc-margin.required_margin}}"
Current_Collateral__c: "{{calc-margin.current_collateral}}"
Shortfall__c: "{{calc-margin.shortfall}}"
- name: notify-collateral-team
type: call
call: "msteams-collateral.send-message"
with:
channel_id: "$secrets.collateral_channel_id"
message: "Margin call for {{counterparty_id}}: shortfall {{calc-margin.shortfall}}. Required: {{calc-margin.required_margin}}."
consumes:
- type: http
namespace: snowflake-collateral
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: counterparty
in: body
- name: portfolio
in: body
operations:
- name: query-margin
method: POST
- type: http
namespace: salesforce-collateral
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: margin-calls
path: "/sobjects/Margin_Call__c"
operations:
- name: create-margin-call
method: POST
- type: http
namespace: msteams-collateral
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Processes a commercial loan drawdown request by validating the facility in Salesforce, recording the drawdown in Snowflake, and notifying the lending operations team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Commercial Loan Drawdown Processing"
description: "Processes a commercial loan drawdown request by validating the facility in Salesforce, recording the drawdown in Snowflake, and notifying the lending operations team via Microsoft Teams."
tags:
- lending
- loan-servicing
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: loan-drawdown
port: 8080
tools:
- name: process-drawdown
description: "Given a facility ID and drawdown amount, validates the Salesforce facility, records in Snowflake, and notifies lending ops."
inputParameters:
- name: facility_id
in: body
type: string
description: "The Salesforce credit facility record ID."
- name: drawdown_amount
in: body
type: number
description: "The requested drawdown amount."
- name: value_date
in: body
type: string
description: "The value date for the drawdown in YYYY-MM-DD format."
steps:
- name: validate-facility
type: call
call: "salesforce-lending.get-facility"
with:
facilityId: "{{facility_id}}"
- name: record-drawdown
type: call
call: "snowflake-lending.insert-drawdown"
with:
table: "LENDING.DRAWDOWNS"
facility_id: "{{facility_id}}"
amount: "{{drawdown_amount}}"
value_date: "{{value_date}}"
- name: notify-lending-ops
type: call
call: "msteams-lending.send-message"
with:
channel_id: "$secrets.lending_ops_channel_id"
message: "Drawdown processed: {{drawdown_amount}} from facility {{facility_id}}. Remaining limit: {{validate-facility.Available_Limit__c}}."
consumes:
- type: http
namespace: salesforce-lending
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: facilities
path: "/sobjects/Credit_Facility__c/{{facilityId}}"
inputParameters:
- name: facilityId
in: path
operations:
- name: get-facility
method: GET
- type: http
namespace: snowflake-lending
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-drawdown
method: POST
- type: http
namespace: msteams-lending
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Identifies employees with overdue compliance training in Workday, creates a Salesforce compliance case, and notifies the compliance team and employee manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Compliance Training Overdue Escalation"
description: "Identifies employees with overdue compliance training in Workday, creates a Salesforce compliance case, and notifies the compliance team and employee manager via Microsoft Teams."
tags:
- compliance
- workday
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: training-escalation
port: 8080
tools:
- name: escalate-overdue-training
description: "Given an employee ID with overdue compliance training, retrieves Workday details, creates a Salesforce case, and notifies via Teams."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
- name: training_course
in: body
type: string
description: "The overdue compliance training course name."
steps:
- name: get-employee
type: call
call: "workday-hr.get-worker"
with:
workerId: "{{employee_id}}"
- name: create-compliance-case
type: call
call: "salesforce-compliance.create-case"
with:
subject: "Overdue training: {{training_course}} - {{get-employee.Name}}"
description: "Employee: {{get-employee.Name}}\nDepartment: {{get-employee.Department}}\nCourse: {{training_course}}"
priority: "Medium"
- name: notify-manager
type: call
call: "msteams-compliance.send-message"
with:
channel_id: "$secrets.compliance_channel_id"
message: "Compliance training overdue: {{get-employee.Name}} has not completed {{training_course}}. Case: {{create-compliance-case.case_number}}."
consumes:
- type: http
namespace: workday-hr
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/jpmorgan"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{workerId}}"
inputParameters:
- name: workerId
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: salesforce-compliance
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: msteams-compliance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Detects upcoming corporate actions from Snowflake market data, identifies impacted client portfolios in Salesforce, and notifies portfolio managers via Microsoft Teams.
naftiko: "0.5"
info:
label: "Corporate Action Notification Workflow"
description: "Detects upcoming corporate actions from Snowflake market data, identifies impacted client portfolios in Salesforce, and notifies portfolio managers via Microsoft Teams."
tags:
- trading
- corporate-actions
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: corp-actions
port: 8080
tools:
- name: notify-corporate-action
description: "Given a security identifier and action type, queries Snowflake for details, identifies impacted Salesforce portfolios, and notifies managers via Teams."
inputParameters:
- name: security_id
in: body
type: string
description: "The security identifier (ISIN or CUSIP)."
- name: action_type
in: body
type: string
description: "The corporate action type (e.g., dividend, split, merger)."
steps:
- name: get-action-details
type: call
call: "snowflake-market-data.query-corporate-action"
with:
security_id: "{{security_id}}"
action_type: "{{action_type}}"
- name: get-impacted-portfolios
type: call
call: "salesforce-portfolio.query-holdings"
with:
security_id: "{{security_id}}"
- name: notify-managers
type: call
call: "msteams-portfolio.send-message"
with:
channel_id: "$secrets.portfolio_channel_id"
message: "Corporate Action Alert: {{action_type}} for {{security_id}}\nEx-date: {{get-action-details.ex_date}}\nImpacted portfolios: {{get-impacted-portfolios.portfolio_count}}\nTotal exposure: {{get-impacted-portfolios.total_exposure}}"
consumes:
- type: http
namespace: snowflake-market-data
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: security_id
in: body
- name: action_type
in: body
operations:
- name: query-corporate-action
method: POST
- type: http
namespace: salesforce-portfolio
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: holdings
path: "/query"
inputParameters:
- name: security_id
in: query
operations:
- name: query-holdings
method: GET
- type: http
namespace: msteams-portfolio
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Generates a comprehensive counterparty exposure report by querying Snowflake for position data, enriching with Salesforce client details, and distributing via Microsoft Teams.
naftiko: "0.5"
info:
label: "Counterparty Exposure Report Workflow"
description: "Generates a comprehensive counterparty exposure report by querying Snowflake for position data, enriching with Salesforce client details, and distributing via Microsoft Teams."
tags:
- risk
- counterparty
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: exposure-report
port: 8080
tools:
- name: generate-exposure-report
description: "Given a counterparty ID, queries Snowflake for all exposures, enriches with Salesforce data, and sends a summary to the risk team via Teams."
inputParameters:
- name: counterparty_id
in: body
type: string
description: "The counterparty identifier."
steps:
- name: get-exposures
type: call
call: "snowflake-risk.query-counterparty-exposures"
with:
counterparty: "{{counterparty_id}}"
- name: get-client-details
type: call
call: "salesforce-risk.get-counterparty"
with:
counterpartyId: "{{counterparty_id}}"
- name: send-report
type: call
call: "msteams-risk.send-message"
with:
channel_id: "$secrets.risk_channel_id"
message: "Counterparty Exposure Report: {{get-client-details.Name}}\nTotal exposure: {{get-exposures.total_exposure}}\nCredit limit: {{get-exposures.credit_limit}}\nUtilization: {{get-exposures.utilization_pct}}%\nProduct breakdown: {{get-exposures.product_summary}}"
consumes:
- type: http
namespace: snowflake-risk
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: counterparty
in: body
operations:
- name: query-counterparty-exposures
method: POST
- type: http
namespace: salesforce-risk
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: counterparties
path: "/sobjects/Counterparty__c/{{counterpartyId}}"
inputParameters:
- name: counterpartyId
in: path
operations:
- name: get-counterparty
method: GET
- type: http
namespace: msteams-risk
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Detects when a counterparty credit exposure exceeds the approved limit in Snowflake, creates a risk case in Salesforce, and alerts the risk management team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Credit Limit Breach Alert Workflow"
description: "Detects when a counterparty credit exposure exceeds the approved limit in Snowflake, creates a risk case in Salesforce, and alerts the risk management team via Microsoft Teams."
tags:
- risk
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: credit-breach-alert
port: 8080
tools:
- name: handle-credit-limit-breach
description: "Given a counterparty ID that has breached credit limits, retrieves exposure data from Snowflake, creates a Salesforce risk case, and alerts the risk team via Teams."
inputParameters:
- name: counterparty_id
in: body
type: string
description: "The counterparty identifier."
- name: counterparty_name
in: body
type: string
description: "The counterparty name."
steps:
- name: get-exposure
type: call
call: "snowflake-risk.query-exposure"
with:
counterparty: "{{counterparty_id}}"
- name: create-risk-case
type: call
call: "salesforce-risk.create-case"
with:
subject: "Credit limit breach: {{counterparty_name}}"
description: "Exposure: {{get-exposure.total_exposure}}\nLimit: {{get-exposure.credit_limit}}\nUtilization: {{get-exposure.utilization_pct}}%"
priority: "High"
- name: alert-risk-team
type: call
call: "msteams-risk.send-message"
with:
channel_id: "$secrets.risk_channel_id"
message: "ALERT: {{counterparty_name}} has breached credit limit. Exposure: {{get-exposure.total_exposure}}. Case: {{create-risk-case.case_number}}."
consumes:
- type: http
namespace: snowflake-risk
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: counterparty
in: body
operations:
- name: query-exposure
method: POST
- type: http
namespace: salesforce-risk
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: msteams-risk
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Retrieves the current protection status and last check-in time of an endpoint from CrowdStrike Falcon.
naftiko: "0.5"
info:
label: "CrowdStrike Endpoint Status Lookup"
description: "Retrieves the current protection status and last check-in time of an endpoint from CrowdStrike Falcon."
tags:
- security
- crowdstrike
- endpoint-protection
- lookup
capability:
exposes:
- type: mcp
namespace: endpoint-status
port: 8080
tools:
- name: get-endpoint-status
description: "Given a hostname, returns the CrowdStrike agent status, last seen timestamp, and OS version. Use for security posture checks."
inputParameters:
- name: hostname
in: body
type: string
description: "The endpoint hostname to look up."
call: "crowdstrike-hosts.get-host"
with:
filter: "hostname:'{{hostname}}'"
outputParameters:
- name: agent_status
type: string
mapping: "$.resources[0].status"
- name: last_seen
type: string
mapping: "$.resources[0].last_seen"
- name: os_version
type: string
mapping: "$.resources[0].os_version"
consumes:
- type: http
namespace: crowdstrike-hosts
baseUri: "https://api.crowdstrike.com"
authentication:
type: bearer
token: "$secrets.crowdstrike_token"
resources:
- name: hosts
path: "/devices/queries/devices/v1"
inputParameters:
- name: filter
in: query
operations:
- name: get-host
method: GET
When CrowdStrike detects an endpoint detection, isolates the affected host, creates a ServiceNow security incident, and alerts the SOC team in Microsoft Teams.
naftiko: "0.5"
info:
label: "CrowdStrike Endpoint Threat Response"
description: "When CrowdStrike detects an endpoint detection, isolates the affected host, creates a ServiceNow security incident, and alerts the SOC team in Microsoft Teams."
tags:
- security
- endpoint-protection
- crowdstrike
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: endpoint-security
port: 8080
tools:
- name: respond-to-endpoint-threat
description: "Given a CrowdStrike detection ID and device ID, fetches detection details, triggers host containment, and opens a ServiceNow P1 security incident. Invoke immediately when a CrowdStrike critical detection is raised."
inputParameters:
- name: detection_id
in: body
type: string
description: "The CrowdStrike detection ID for the threat."
- name: device_id
in: body
type: string
description: "The CrowdStrike device ID of the affected endpoint."
- name: soc_channel_id
in: body
type: string
description: "The Teams channel ID for the SOC team."
steps:
- name: get-detection
type: call
call: "crowdstrike-detections.get-detection"
with:
detection_id: "{{detection_id}}"
- name: isolate-host
type: call
call: "crowdstrike-hosts.contain-host"
with:
device_id: "{{device_id}}"
action: "contain"
- name: create-p1-incident
type: call
call: "servicenow-endpoint.create-incident"
with:
short_description: "CrowdStrike critical detection on device {{device_id}}: {{get-detection.tactic}}"
category: "Security"
urgency: "1"
- name: alert-soc
type: call
call: "msteams-soc.send-message"
with:
channel_id: "{{soc_channel_id}}"
message: "Endpoint threat detected ({{get-detection.tactic}}) on device {{device_id}}. Host isolated. ServiceNow P1: {{create-p1-incident.number}}."
consumes:
- type: http
namespace: crowdstrike-detections
baseUri: "https://api.crowdstrike.com"
authentication:
type: bearer
token: "$secrets.crowdstrike_token"
resources:
- name: detections
path: "/detects/entities/detect/v2"
inputParameters:
- name: detection_id
in: query
operations:
- name: get-detection
method: GET
- type: http
namespace: crowdstrike-hosts
baseUri: "https://api.crowdstrike.com"
authentication:
type: bearer
token: "$secrets.crowdstrike_token"
resources:
- name: host-actions
path: "/devices/entities/devices-actions/v2"
inputParameters:
- name: device_id
in: query
- name: action
in: query
operations:
- name: contain-host
method: POST
- type: http
namespace: servicenow-endpoint
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
- name: urgency
in: body
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-soc
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
When Datadog detects an infrastructure anomaly in production, creates a ServiceNow priority-2 incident and posts diagnostic details to the on-call engineering channel in Microsoft Teams.
naftiko: "0.5"
info:
label: "Datadog Infrastructure Anomaly Response"
description: "When Datadog detects an infrastructure anomaly in production, creates a ServiceNow priority-2 incident and posts diagnostic details to the on-call engineering channel in Microsoft Teams."
tags:
- observability
- incident-response
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: infra-ops
port: 8080
tools:
- name: handle-infrastructure-anomaly
description: "Given a Datadog monitor ID and alert event ID, fetches monitor status and alert details, opens a ServiceNow incident, and alerts the on-call team in Teams. Invoke when a Datadog infrastructure alert fires."
inputParameters:
- name: monitor_id
in: body
type: string
description: "The Datadog monitor ID that triggered the alert."
- name: alert_event_id
in: body
type: string
description: "The Datadog alert event ID for contextual details."
- name: oncall_channel
in: body
type: string
description: "The Teams channel ID for the on-call engineering team."
steps:
- name: get-monitor-status
type: call
call: "datadog-monitors.get-monitor"
with:
monitor_id: "{{monitor_id}}"
- name: create-incident
type: call
call: "servicenow-infra.create-incident"
with:
short_description: "Infrastructure anomaly: {{get-monitor-status.name}}"
category: "Infrastructure"
urgency: "2"
- name: notify-oncall
type: call
call: "msteams-oncall.send-message"
with:
channel_id: "{{oncall_channel}}"
message: "Infrastructure anomaly detected: {{get-monitor-status.name}}. ServiceNow incident: {{create-incident.number}}. Alert: {{alert_event_id}}."
consumes:
- type: http
namespace: datadog-monitors
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/{{monitor_id}}"
inputParameters:
- name: monitor_id
in: path
operations:
- name: get-monitor
method: GET
- type: http
namespace: servicenow-infra
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
- name: urgency
in: body
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-oncall
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Responds to Datadog latency spike alerts by retrieving APM metrics, creating a ServiceNow incident, and notifying the SRE team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Datadog Latency Spike to ServiceNow"
description: "Responds to Datadog latency spike alerts by retrieving APM metrics, creating a ServiceNow incident, and notifying the SRE team via Microsoft Teams."
tags:
- observability
- datadog
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: latency-spike
port: 8080
tools:
- name: handle-latency-spike
description: "Given a Datadog service name and latency threshold breach, retrieves metrics, creates a ServiceNow incident, and alerts the SRE team."
inputParameters:
- name: service_name
in: body
type: string
description: "The Datadog APM service name."
- name: latency_ms
in: body
type: number
description: "The observed latency in milliseconds."
steps:
- name: get-metrics
type: call
call: "datadog-apm.get-service-metrics"
with:
service: "{{service_name}}"
- name: create-incident
type: call
call: "servicenow-sre.create-incident"
with:
short_description: "Latency spike: {{service_name}} at {{latency_ms}}ms"
description: "Service: {{service_name}}\nLatency: {{latency_ms}}ms\nError rate: {{get-metrics.error_rate}}\nRequest rate: {{get-metrics.request_rate}}"
urgency: "2"
- name: alert-sre
type: call
call: "msteams-sre.send-message"
with:
channel_id: "$secrets.sre_channel_id"
message: "Latency spike: {{service_name}} at {{latency_ms}}ms. Error rate: {{get-metrics.error_rate}}. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: datadog-apm
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: services
path: "/service_summary"
inputParameters:
- name: service
in: query
operations:
- name: get-service-metrics
method: GET
- type: http
namespace: servicenow-sre
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-sre
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Queries Datadog for the current health status and error rate of a specified banking microservice.
naftiko: "0.5"
info:
label: "Datadog Service Health Check"
description: "Queries Datadog for the current health status and error rate of a specified banking microservice."
tags:
- observability
- datadog
- health-check
- monitoring
capability:
exposes:
- type: mcp
namespace: service-health
port: 8080
tools:
- name: check-service-status
description: "Given a Datadog service name, returns the current health status, error rate, and latency p99. Use for operational health checks."
inputParameters:
- name: service_name
in: body
type: string
description: "The Datadog APM service name."
call: "datadog-apm.get-service-summary"
with:
service: "{{service_name}}"
outputParameters:
- name: status
type: string
mapping: "$.data.attributes.status"
- name: error_rate
type: number
mapping: "$.data.attributes.error_rate"
- name: latency_p99
type: number
mapping: "$.data.attributes.latency_p99"
consumes:
- type: http
namespace: datadog-apm
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apikey
key: "DD-API-KEY"
value: "$secrets.datadog_api_key"
placement: header
resources:
- name: services
path: "/service_summary"
inputParameters:
- name: service
in: query
operations:
- name: get-service-summary
method: GET
When an employee separation is recorded in Workday, revokes Okta access, closes open ServiceNow assets, and notifies the employee's manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Employee Offboarding Workflow"
description: "When an employee separation is recorded in Workday, revokes Okta access, closes open ServiceNow assets, and notifies the employee's manager via Microsoft Teams."
tags:
- hr
- offboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-offboarding
port: 8080
tools:
- name: trigger-offboarding
description: "Given a Workday employee ID and separation date, orchestrate the full offboarding sequence across ServiceNow and Microsoft Teams. Invoke when a termination event is detected in Workday."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the departing employee."
- name: separation_date
in: body
type: string
description: "The employee's last day in ISO 8601 format (YYYY-MM-DD)."
steps:
- name: get-employee
type: call
call: "workday-read.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: close-assets
type: call
call: "servicenow-offboard.create-incident"
with:
short_description: "Offboarding: revoke assets for {{get-employee.full_name}}"
category: "HR"
- name: notify-manager
type: call
call: "msteams-hr.send-message"
with:
channel_id: "hr-ops"
message: "Offboarding initiated for {{get-employee.full_name}} (separation: {{separation_date}}). Please review delegations."
consumes:
- type: http
namespace: workday-read
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow-offboard
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
operations:
- name: create-incident
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
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 to the new employee.
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 to the new employee."
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 onboarding sequence across ServiceNow, SharePoint, and Microsoft Teams. Invoke when a new hire record is confirmed in Workday."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID for the new hire."
- name: start_date
in: body
type: string
description: "The new hire's start date in ISO 8601 format (YYYY-MM-DD)."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: open-onboarding-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New hire onboarding: {{get-employee.full_name}}"
category: "HR"
start_date: "{{start_date}}"
- name: provision-sharepoint-folder
type: call
call: "sharepoint.create-folder"
with:
folder_name: "{{get-employee.full_name}}"
site_id: "hr-onboarding"
- name: send-welcome-message
type: call
call: "msteams.send-message"
with:
channel_id: "new-hires"
message: "Welcome to JPMorgan Chase, {{get-employee.full_name}}! Your start date is {{start_date}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
- name: start_date
in: body
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
- name: folder_name
in: body
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: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Generates equity research summaries using Anthropic Claude from Snowflake data, creates a Salesforce activity record, and distributes to institutional clients via Microsoft Teams.
naftiko: "0.5"
info:
label: "Equity Research Report Distribution"
description: "Generates equity research summaries using Anthropic Claude from Snowflake data, creates a Salesforce activity record, and distributes to institutional clients via Microsoft Teams."
tags:
- trading
- research
- snowflake
- anthropic
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: research-distribution
port: 8080
tools:
- name: distribute-research-report
description: "Given a ticker symbol and analysis period, generates an AI research summary from Snowflake data and distributes via Teams."
inputParameters:
- name: ticker
in: body
type: string
description: "The equity ticker symbol."
- name: period
in: body
type: string
description: "The analysis period (e.g., Q4-2025)."
steps:
- name: get-market-data
type: call
call: "snowflake-research.query-equity-data"
with:
ticker: "{{ticker}}"
period: "{{period}}"
- name: generate-summary
type: call
call: "anthropic-ai.create-message"
with:
model: "claude-sonnet-4-20250514"
prompt: "Create a brief equity research summary for {{ticker}} based on: Price={{get-market-data.price}}, PE={{get-market-data.pe_ratio}}, EPS={{get-market-data.eps}}, Revenue growth={{get-market-data.revenue_growth}}"
- name: distribute-report
type: call
call: "msteams-research.send-message"
with:
channel_id: "$secrets.research_channel_id"
message: "Equity Research: {{ticker}} ({{period}})\n{{generate-summary.content}}"
consumes:
- type: http
namespace: snowflake-research
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: ticker
in: body
- name: period
in: body
operations:
- name: query-equity-data
method: POST
- type: http
namespace: anthropic-ai
baseUri: "https://api.anthropic.com/v1"
authentication:
type: bearer
token: "$secrets.anthropic_api_key"
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: msteams-research
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Reconciles fixed income positions between the trading system in Snowflake and the accounting system in SAP, creating a ServiceNow task for any discrepancies.
naftiko: "0.5"
info:
label: "Fixed Income Position Reconciliation"
description: "Reconciles fixed income positions between the trading system in Snowflake and the accounting system in SAP, creating a ServiceNow task for any discrepancies."
tags:
- trading
- fixed-income
- snowflake
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: fi-recon
port: 8080
tools:
- name: reconcile-fi-positions
description: "Given a portfolio and valuation date, queries trading positions from Snowflake, checks SAP accounting, and creates a ServiceNow task for breaks."
inputParameters:
- name: portfolio_id
in: body
type: string
description: "The fixed income portfolio identifier."
- name: valuation_date
in: body
type: string
description: "The valuation date in YYYY-MM-DD format."
steps:
- name: get-trading-positions
type: call
call: "snowflake-trading.query-fi-positions"
with:
portfolio: "{{portfolio_id}}"
date: "{{valuation_date}}"
- name: get-accounting-positions
type: call
call: "sap-s4.get-fi-positions"
with:
portfolio: "{{portfolio_id}}"
date: "{{valuation_date}}"
- name: create-recon-task
type: call
call: "servicenow-ops.create-task"
with:
short_description: "FI position reconciliation: {{portfolio_id}} ({{valuation_date}})"
description: "Trading positions: {{get-trading-positions.position_count}}\nAccounting positions: {{get-accounting-positions.position_count}}\nBreaks identified: {{get-trading-positions.break_count}}"
assignment_group: "Trade Operations"
consumes:
- type: http
namespace: snowflake-trading
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: portfolio
in: body
- name: date
in: body
operations:
- name: query-fi-positions
method: POST
- type: http
namespace: sap-s4
baseUri: "https://jpmorgan-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
authentication:
type: basic
username: "$secrets.sap_s4_username"
password: "$secrets.sap_s4_password"
resources:
- name: positions
path: "/A_JournalEntryItemBasic"
inputParameters:
- name: portfolio
in: query
- name: date
in: query
operations:
- name: get-fi-positions
method: GET
- type: http
namespace: servicenow-ops
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Monitors FX rate movements in Snowflake, generates hedge recommendations using Anthropic Claude, and notifies the treasury team via Microsoft Teams.
naftiko: "0.5"
info:
label: "FX Rate Alert and Hedge Recommendation"
description: "Monitors FX rate movements in Snowflake, generates hedge recommendations using Anthropic Claude, and notifies the treasury team via Microsoft Teams."
tags:
- trading
- fx
- snowflake
- anthropic
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: fx-rate-alert
port: 8080
tools:
- name: handle-fx-rate-alert
description: "Given a currency pair and movement threshold, checks Snowflake for rate data, generates AI hedge recommendations, and alerts treasury via Teams."
inputParameters:
- name: currency_pair
in: body
type: string
description: "The FX currency pair (e.g., EUR/USD)."
- name: movement_threshold_bps
in: body
type: number
description: "The movement threshold in basis points."
steps:
- name: get-rate-data
type: call
call: "snowflake-fx.query-rate-movement"
with:
pair: "{{currency_pair}}"
threshold_bps: "{{movement_threshold_bps}}"
- name: generate-recommendation
type: call
call: "anthropic-ai.create-message"
with:
model: "claude-sonnet-4-20250514"
prompt: "Given {{currency_pair}} moved {{get-rate-data.movement_bps}} bps to {{get-rate-data.current_rate}}, provide hedge recommendation for a bank with USD base currency."
- name: alert-treasury
type: call
call: "msteams-treasury.send-message"
with:
channel_id: "$secrets.treasury_channel_id"
message: "FX Alert: {{currency_pair}} moved {{get-rate-data.movement_bps}} bps.\nRecommendation: {{generate-recommendation.content}}"
consumes:
- type: http
namespace: snowflake-fx
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: pair
in: body
- name: threshold_bps
in: body
operations:
- name: query-rate-movement
method: POST
- type: http
namespace: anthropic-ai
baseUri: "https://api.anthropic.com/v1"
authentication:
type: bearer
token: "$secrets.anthropic_api_key"
resources:
- name: messages
path: "/messages"
inputParameters:
- name: model
in: body
- name: prompt
in: body
operations:
- name: create-message
method: POST
- type: http
namespace: msteams-treasury
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
When a GitHub pull request is opened against a core banking service, triggers a code quality analysis and posts the result as a PR comment, blocking merge if quality thresholds are not met.
naftiko: "0.5"
info:
label: "GitHub PR Code Quality Gate"
description: "When a GitHub pull request is opened against a core banking service, triggers a code quality analysis and posts the result as a PR comment, blocking merge if quality thresholds are not met."
tags:
- devops
- code-quality
- github
capability:
exposes:
- type: mcp
namespace: code-quality
port: 8080
tools:
- name: run-pr-quality-gate
description: "Given a GitHub repository and pull request number, checks the PR's status checks for quality gate results and posts a summary comment on the PR. Invoke when a PR is opened or updated in a core banking repository."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository name in org/repo format."
- name: pr_number
in: body
type: integer
description: "The pull request number to evaluate."
steps:
- name: get-pr-checks
type: call
call: "github-pr.get-pull-request"
with:
repo: "{{repo_name}}"
pull_number: "{{pr_number}}"
- name: post-quality-comment
type: call
call: "github-pr.create-pr-comment"
with:
repo: "{{repo_name}}"
issue_number: "{{pr_number}}"
body: "Quality gate result for PR #{{pr_number}}: Status — {{get-pr-checks.mergeable_state}}. All checks must pass before merge."
consumes:
- type: http
namespace: github-pr
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: pull-requests
path: "/repos/{{repo}}/pulls/{{pull_number}}"
inputParameters:
- name: repo
in: path
- name: pull_number
in: path
operations:
- name: get-pull-request
method: GET
- name: issue-comments
path: "/repos/{{repo}}/issues/{{issue_number}}/comments"
inputParameters:
- name: repo
in: path
- name: issue_number
in: path
- name: body
in: body
operations:
- name: create-pr-comment
method: POST
When a new developer joins a team, adds them to the correct GitHub teams and repositories based on their Workday role, enforcing least-privilege access control.
naftiko: "0.5"
info:
label: "GitHub Repository Access Provisioning"
description: "When a new developer joins a team, adds them to the correct GitHub teams and repositories based on their Workday role, enforcing least-privilege access control."
tags:
- devops
- identity
- access-management
- github
- workday
capability:
exposes:
- type: mcp
namespace: devops-access
port: 8080
tools:
- name: provision-github-access
description: "Given a Workday employee ID and GitHub username, reads the employee's role from Workday and adds them to the appropriate GitHub teams. Invoke when a new developer joins or changes teams."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "The Workday worker ID of the developer."
- name: github_username
in: body
type: string
description: "The GitHub username of the developer."
steps:
- name: get-employee-role
type: call
call: "workday-roles.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: add-to-github-team
type: call
call: "github-access.add-team-member"
with:
org: "jpmorganchase"
team_slug: "{{get-employee-role.department}}"
username: "{{github_username}}"
consumes:
- type: http
namespace: workday-roles
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: github-access
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: team-members
path: "/orgs/{{org}}/teams/{{team_slug}}/memberships/{{username}}"
inputParameters:
- name: org
in: path
- name: team_slug
in: path
- name: username
in: path
operations:
- name: add-team-member
method: PUT
Retrieves metadata for a GitHub repository including default branch, visibility, and last push date.
naftiko: "0.5"
info:
label: "GitHub Repository Info Lookup"
description: "Retrieves metadata for a GitHub repository including default branch, visibility, and last push date."
tags:
- devops
- github
- repository
- lookup
capability:
exposes:
- type: mcp
namespace: repo-info
port: 8080
tools:
- name: get-repository
description: "Given a GitHub org and repo name, returns the repository visibility, default branch, language, and last pushed date. Use for developer portal inquiries."
inputParameters:
- name: org
in: body
type: string
description: "The GitHub organization name."
- name: repo
in: body
type: string
description: "The GitHub repository name."
call: "github-repos.get-repo"
with:
org: "{{org}}"
repo: "{{repo}}"
outputParameters:
- name: visibility
type: string
mapping: "$.visibility"
- name: default_branch
type: string
mapping: "$.default_branch"
- name: language
type: string
mapping: "$.language"
consumes:
- type: http
namespace: github-repos
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: repos
path: "/repos/{{org}}/{{repo}}"
inputParameters:
- name: org
in: path
- name: repo
in: path
operations:
- name: get-repo
method: GET
Detects GitHub Dependabot security alerts, creates a ServiceNow incident for the security team, and notifies the application team via Microsoft Teams.
naftiko: "0.5"
info:
label: "GitHub Security Alert to ServiceNow"
description: "Detects GitHub Dependabot security alerts, creates a ServiceNow incident for the security team, and notifies the application team via Microsoft Teams."
tags:
- devops
- security
- github
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: github-sec-alert
port: 8080
tools:
- name: handle-github-security-alert
description: "Given a GitHub repo and alert ID, retrieves the vulnerability details, creates a ServiceNow incident, and notifies the app team via Teams."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository name (org/repo format)."
- name: alert_id
in: body
type: string
description: "The Dependabot alert number."
steps:
- name: get-alert
type: call
call: "github-alerts.get-dependabot-alert"
with:
repo: "{{repo_name}}"
alert_number: "{{alert_id}}"
- name: create-incident
type: call
call: "servicenow-security.create-incident"
with:
short_description: "GitHub security alert: {{get-alert.security_advisory.summary}}"
description: "Repo: {{repo_name}}\nSeverity: {{get-alert.security_advisory.severity}}\nPackage: {{get-alert.dependency.package.name}}"
urgency: "2"
- name: notify-team
type: call
call: "msteams-devops.send-message"
with:
channel_id: "$secrets.devops_channel_id"
message: "Security alert for {{repo_name}}: {{get-alert.security_advisory.summary}} ({{get-alert.security_advisory.severity}}). Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: github-alerts
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: dependabot-alerts
path: "/repos/{{repo}}/dependabot/alerts/{{alert_number}}"
inputParameters:
- name: repo
in: path
- name: alert_number
in: path
operations:
- name: get-dependabot-alert
method: GET
- type: http
namespace: servicenow-security
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-devops
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
When GitHub Dependabot raises a critical vulnerability alert, creates a ServiceNow security incident and notifies the platform security team via Microsoft Teams.
naftiko: "0.5"
info:
label: "GitHub Security Vulnerability Triage"
description: "When GitHub Dependabot raises a critical vulnerability alert, creates a ServiceNow security incident and notifies the platform security team via Microsoft Teams."
tags:
- devops
- security
- github
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: devops-security
port: 8080
tools:
- name: triage-vulnerability-alert
description: "Given a GitHub repository and Dependabot alert number, reads the vulnerability details, opens a ServiceNow security incident, and notifies the platform security team in Teams. Invoke when a critical Dependabot alert is raised."
inputParameters:
- name: repo_name
in: body
type: string
description: "The GitHub repository name (org/repo format)."
- name: alert_number
in: body
type: integer
description: "The Dependabot security alert number."
steps:
- name: get-alert
type: call
call: "github-security.get-dependabot-alert"
with:
repo: "{{repo_name}}"
alert_number: "{{alert_number}}"
- name: create-security-incident
type: call
call: "servicenow-security.create-incident"
with:
short_description: "Critical vulnerability in {{repo_name}}: {{get-alert.cve_id}}"
category: "Security"
urgency: "1"
- name: notify-security-team
type: call
call: "msteams-security.send-message"
with:
channel_id: "platform-security"
message: "Critical CVE {{get-alert.cve_id}} detected in {{repo_name}}. ServiceNow incident: {{create-security-incident.number}}."
consumes:
- type: http
namespace: github-security
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: dependabot-alerts
path: "/repos/{{repo}}/dependabot/alerts/{{alert_number}}"
inputParameters:
- name: repo
in: path
- name: alert_number
in: path
operations:
- name: get-dependabot-alert
method: GET
- type: http
namespace: servicenow-security
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
- name: urgency
in: body
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-security
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Calculates the mark-to-market valuation of an interest rate swap from Snowflake, updates the trade record in Salesforce, and alerts the trading desk via Microsoft Teams if the MTM exceeds threshold.
naftiko: "0.5"
info:
label: "Interest Rate Swap Valuation Alert"
description: "Calculates the mark-to-market valuation of an interest rate swap from Snowflake, updates the trade record in Salesforce, and alerts the trading desk via Microsoft Teams if the MTM exceeds threshold."
tags:
- trading
- derivatives
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: irs-valuation
port: 8080
tools:
- name: check-swap-valuation
description: "Given a swap trade ID and MTM threshold, calculates valuation from Snowflake, updates Salesforce, and alerts the desk if threshold exceeded."
inputParameters:
- name: swap_id
in: body
type: string
description: "The interest rate swap trade identifier."
- name: mtm_threshold
in: body
type: number
description: "The mark-to-market threshold amount for alerting."
steps:
- name: calc-mtm
type: call
call: "snowflake-trading.query-swap-mtm"
with:
swap_id: "{{swap_id}}"
- name: update-trade-record
type: call
call: "salesforce-trading.update-trade"
with:
tradeId: "{{swap_id}}"
MTM_Value__c: "{{calc-mtm.mtm_value}}"
Valuation_Date__c: "{{calc-mtm.valuation_date}}"
- name: alert-desk
type: call
call: "msteams-trading.send-message"
with:
channel_id: "$secrets.trading_channel_id"
message: "IRS {{swap_id}} MTM: {{calc-mtm.mtm_value}} (threshold: {{mtm_threshold}}). Updated in Salesforce."
consumes:
- type: http
namespace: snowflake-trading
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: swap_id
in: body
operations:
- name: query-swap-mtm
method: POST
- type: http
namespace: salesforce-trading
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: trades
path: "/sobjects/Trade__c/{{tradeId}}"
inputParameters:
- name: tradeId
in: path
operations:
- name: update-trade
method: PATCH
- type: http
namespace: msteams-trading
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Escalates critical Jira bugs by retrieving issue details, creating a ServiceNow incident for tracking, and notifying engineering leadership via Microsoft Teams.
naftiko: "0.5"
info:
label: "Jira Critical Bug Escalation Workflow"
description: "Escalates critical Jira bugs by retrieving issue details, creating a ServiceNow incident for tracking, and notifying engineering leadership via Microsoft Teams."
tags:
- devops
- jira
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: bug-escalation
port: 8080
tools:
- name: escalate-critical-bug
description: "Given a Jira issue key for a critical bug, retrieves details, creates a ServiceNow incident, and alerts engineering leadership via Teams."
inputParameters:
- name: issue_key
in: body
type: string
description: "The Jira issue key (e.g., TRADE-1234)."
steps:
- name: get-issue
type: call
call: "jira-issues.get-issue"
with:
issueKey: "{{issue_key}}"
- name: create-incident
type: call
call: "servicenow-eng.create-incident"
with:
short_description: "Critical bug: {{issue_key}} - {{get-issue.summary}}"
description: "Jira: {{issue_key}}\nSummary: {{get-issue.summary}}\nComponent: {{get-issue.component}}\nReporter: {{get-issue.reporter}}"
urgency: "1"
- name: notify-leadership
type: call
call: "msteams-eng.send-message"
with:
channel_id: "$secrets.eng_leadership_channel_id"
message: "Critical bug escalation: {{issue_key}} - {{get-issue.summary}}. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: jira-issues
baseUri: "https://jpmorgan.atlassian.net/rest/api/3"
authentication:
type: bearer
token: "$secrets.jira_token"
resources:
- name: issues
path: "/issue/{{issueKey}}"
inputParameters:
- name: issueKey
in: path
operations:
- name: get-issue
method: GET
- type: http
namespace: servicenow-eng
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Runs a periodic KYC refresh for an existing client, updates the compliance record in Salesforce, and logs the refresh outcome to Snowflake for audit trail.
naftiko: "0.5"
info:
label: "KYC Refresh and Compliance Update"
description: "Runs a periodic KYC refresh for an existing client, updates the compliance record in Salesforce, and logs the refresh outcome to Snowflake for audit trail."
tags:
- compliance
- kyc
- salesforce
- snowflake
capability:
exposes:
- type: mcp
namespace: kyc-refresh
port: 8080
tools:
- name: refresh-client-kyc
description: "Given a client ID, re-screens the client for KYC compliance, updates Salesforce records, and logs to Snowflake for regulatory audit."
inputParameters:
- name: client_id
in: body
type: string
description: "The Salesforce client account ID."
- name: client_name
in: body
type: string
description: "The legal name of the client."
steps:
- name: get-client-record
type: call
call: "salesforce-kyc.get-account"
with:
accountId: "{{client_id}}"
- name: run-kyc-screen
type: call
call: "refinitiv-kyc.search-entity"
with:
name: "{{client_name}}"
entity_type: "organization"
- name: update-compliance-status
type: call
call: "salesforce-kyc.update-account"
with:
accountId: "{{client_id}}"
KYC_Risk_Score__c: "{{run-kyc-screen.risk_score}}"
KYC_Last_Reviewed__c: "{{$now}}"
- name: log-refresh
type: call
call: "snowflake-kyc.insert-record"
with:
table: "COMPLIANCE.KYC_REFRESHES"
client_id: "{{client_id}}"
risk_score: "{{run-kyc-screen.risk_score}}"
consumes:
- type: http
namespace: salesforce-kyc
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{accountId}}"
inputParameters:
- name: accountId
in: path
operations:
- name: get-account
method: GET
- name: update-account
method: PATCH
- type: http
namespace: refinitiv-kyc
baseUri: "https://api.thomsonreuters.com/worldcheck/v1"
authentication:
type: bearer
token: "$secrets.refinitiv_token"
resources:
- name: entities
path: "/entities/search"
inputParameters:
- name: name
in: query
- name: entity_type
in: query
operations:
- name: search-entity
method: GET
- type: http
namespace: snowflake-kyc
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-record
method: POST
Monitors loan covenant compliance by querying financial metrics from Snowflake, updating the loan record in Salesforce, and alerting the lending team via Microsoft Teams if covenants are at risk.
naftiko: "0.5"
info:
label: "Lending Covenant Monitoring Alert"
description: "Monitors loan covenant compliance by querying financial metrics from Snowflake, updating the loan record in Salesforce, and alerting the lending team via Microsoft Teams if covenants are at risk."
tags:
- lending
- covenants
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: covenant-monitor
port: 8080
tools:
- name: check-covenant-compliance
description: "Given a loan ID, queries Snowflake for covenant metrics, updates Salesforce loan status, and alerts the lending team if at risk."
inputParameters:
- name: loan_id
in: body
type: string
description: "The loan record identifier."
steps:
- name: get-covenant-metrics
type: call
call: "snowflake-lending.query-covenant-metrics"
with:
loan_id: "{{loan_id}}"
- name: update-loan-status
type: call
call: "salesforce-lending.update-loan-covenant"
with:
loanId: "{{loan_id}}"
Covenant_Status__c: "{{get-covenant-metrics.status}}"
DSCR__c: "{{get-covenant-metrics.dscr}}"
- name: alert-lending
type: call
call: "msteams-lending.send-message"
with:
channel_id: "$secrets.lending_channel_id"
message: "Covenant alert for loan {{loan_id}}: DSCR={{get-covenant-metrics.dscr}}, LTV={{get-covenant-metrics.ltv}}. Status: {{get-covenant-metrics.status}}."
consumes:
- type: http
namespace: snowflake-lending
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: loan_id
in: body
operations:
- name: query-covenant-metrics
method: POST
- type: http
namespace: salesforce-lending
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: loans
path: "/sobjects/Loan__c/{{loanId}}"
inputParameters:
- name: loanId
in: path
operations:
- name: update-loan-covenant
method: PATCH
- type: http
namespace: msteams-lending
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Pulls open requisition data from Workday and posts matching job listings to LinkedIn Recruiter, keeping talent pipelines current for financial services hiring.
naftiko: "0.5"
info:
label: "LinkedIn Talent Acquisition Pipeline Sync"
description: "Pulls open requisition data from Workday and posts matching job listings to LinkedIn Recruiter, keeping talent pipelines current for financial services hiring."
tags:
- hr
- recruiting
- workday
- linkedin
capability:
exposes:
- type: mcp
namespace: talent-acquisition
port: 8080
tools:
- name: sync-jobs-to-linkedin
description: "Given a Workday job requisition ID, reads job details and creates or updates the corresponding LinkedIn job posting. Invoke when a new requisition is opened or an existing one is updated in Workday."
inputParameters:
- name: requisition_id
in: body
type: string
description: "The Workday job requisition ID to sync to LinkedIn."
steps:
- name: get-requisition
type: call
call: "workday-recruiting.get-job-requisition"
with:
requisitionId: "{{requisition_id}}"
- name: post-to-linkedin
type: call
call: "linkedin.create-job-posting"
with:
title: "{{get-requisition.JobTitle}}"
description: "{{get-requisition.JobDescription}}"
location: "{{get-requisition.Location}}"
companyId: "$secrets.linkedin_company_id"
consumes:
- type: http
namespace: workday-recruiting
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: job-requisitions
path: "/jobRequisitions/{{requisitionId}}"
inputParameters:
- name: requisitionId
in: path
operations:
- name: get-job-requisition
method: GET
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: job-postings
path: "/jobs"
inputParameters:
- name: title
in: body
- name: description
in: body
- name: location
in: body
- name: companyId
in: body
operations:
- name: create-job-posting
method: POST
Retrieves loan application data from Salesforce, runs credit scoring via Snowflake analytics, and updates the underwriting decision back in Salesforce with notification to the lending team.
naftiko: "0.5"
info:
label: "Loan Underwriting Decision Workflow"
description: "Retrieves loan application data from Salesforce, runs credit scoring via Snowflake analytics, and updates the underwriting decision back in Salesforce with notification to the lending team."
tags:
- lending
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: loan-underwriting
port: 8080
tools:
- name: process-underwriting-decision
description: "Given a loan application ID, fetches application data from Salesforce, runs Snowflake credit analytics, updates the decision, and notifies the lending team."
inputParameters:
- name: application_id
in: body
type: string
description: "The Salesforce loan application record ID."
steps:
- name: get-application
type: call
call: "salesforce-lending.get-loan"
with:
applicationId: "{{application_id}}"
- name: run-credit-scoring
type: call
call: "snowflake-lending.query-credit-score"
with:
applicant_id: "{{get-application.Applicant_ID__c}}"
loan_amount: "{{get-application.Loan_Amount__c}}"
- name: update-decision
type: call
call: "salesforce-lending.update-loan"
with:
applicationId: "{{application_id}}"
Credit_Score__c: "{{run-credit-scoring.credit_score}}"
Underwriting_Decision__c: "{{run-credit-scoring.decision}}"
- name: notify-lending
type: call
call: "msteams-lending.send-message"
with:
channel_id: "$secrets.lending_channel_id"
message: "Loan {{application_id}} decision: {{run-credit-scoring.decision}} (score: {{run-credit-scoring.credit_score}})."
consumes:
- type: http
namespace: salesforce-lending
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: loan-applications
path: "/sobjects/Loan_Application__c/{{applicationId}}"
inputParameters:
- name: applicationId
in: path
operations:
- name: get-loan
method: GET
- name: update-loan
method: PATCH
- type: http
namespace: snowflake-lending
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-credit-score
method: POST
- type: http
namespace: msteams-lending
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Extracts daily market risk metrics from Snowflake, generates a formatted summary via Anthropic Claude, and distributes it to the risk committee via Microsoft Teams.
naftiko: "0.5"
info:
label: "Market Risk Daily Report Generation"
description: "Extracts daily market risk metrics from Snowflake, generates a formatted summary via Anthropic Claude, and distributes it to the risk committee via Microsoft Teams."
tags:
- risk
- snowflake
- anthropic
- microsoft-teams
- reporting
capability:
exposes:
- type: mcp
namespace: market-risk-report
port: 8080
tools:
- name: generate-daily-risk-report
description: "Given a reporting date, extracts VaR, stress test, and PnL data from Snowflake, creates an AI summary, and posts to the risk committee Teams channel."
inputParameters:
- name: report_date
in: body
type: string
description: "The reporting date in YYYY-MM-DD format."
steps:
- name: extract-risk-metrics
type: call
call: "snowflake-risk.query-daily-metrics"
with:
date: "{{report_date}}"
- name: generate-summary
type: call
call: "anthropic-ai.create-message"
with:
model: "claude-sonnet-4-20250514"
prompt: "Create an executive summary of daily market risk metrics for {{report_date}}: VaR={{extract-risk-metrics.var}}, Stress={{extract-risk-metrics.stress_loss}}, PnL={{extract-risk-metrics.pnl}}"
- name: distribute-report
type: call
call: "msteams-risk.send-message"
with:
channel_id: "$secrets.risk_committee_channel_id"
message: "Daily Market Risk Report for {{report_date}}:\n{{generate-summary.content}}"
consumes:
- type: http
namespace: snowflake-risk
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: date
in: body
operations:
- name: query-daily-metrics
method: POST
- type: http
namespace: anthropic-ai
baseUri: "https://api.anthropic.com/v1"
authentication:
type: bearer
token: "$secrets.anthropic_api_key"
resources:
- name: messages
path: "/messages"
inputParameters:
- name: model
in: body
- name: prompt
in: body
operations:
- name: create-message
method: POST
- type: http
namespace: msteams-risk
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Processes a mortgage rate lock request by validating the application in Salesforce, recording the lock in Snowflake, and notifying the mortgage operations team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Mortgage Rate Lock Processing"
description: "Processes a mortgage rate lock request by validating the application in Salesforce, recording the lock in Snowflake, and notifying the mortgage operations team via Microsoft Teams."
tags:
- lending
- mortgage
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: rate-lock
port: 8080
tools:
- name: process-rate-lock
description: "Given a mortgage application ID and lock rate, validates in Salesforce, records in Snowflake, and notifies mortgage ops."
inputParameters:
- name: application_id
in: body
type: string
description: "The Salesforce mortgage application record ID."
- name: lock_rate
in: body
type: number
description: "The interest rate to lock."
- name: lock_days
in: body
type: number
description: "The number of days for the rate lock."
steps:
- name: validate-application
type: call
call: "salesforce-mortgage.get-application"
with:
applicationId: "{{application_id}}"
- name: record-rate-lock
type: call
call: "snowflake-mortgage.insert-rate-lock"
with:
table: "LENDING.RATE_LOCKS"
application_id: "{{application_id}}"
rate: "{{lock_rate}}"
lock_days: "{{lock_days}}"
- name: notify-mortgage-ops
type: call
call: "msteams-mortgage.send-message"
with:
channel_id: "$secrets.mortgage_channel_id"
message: "Rate lock processed: {{application_id}} at {{lock_rate}}% for {{lock_days}} days. Borrower: {{validate-application.Borrower_Name__c}}."
consumes:
- type: http
namespace: salesforce-mortgage
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: applications
path: "/sobjects/Mortgage_Application__c/{{applicationId}}"
inputParameters:
- name: applicationId
in: path
operations:
- name: get-application
method: GET
- type: http
namespace: snowflake-mortgage
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-rate-lock
method: POST
- type: http
namespace: msteams-mortgage
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Generates a daily application performance summary from New Relic APM across core banking services and publishes the digest to the platform engineering Teams channel.
naftiko: "0.5"
info:
label: "New Relic APM Digest"
description: "Generates a daily application performance summary from New Relic APM across core banking services and publishes the digest to the platform engineering Teams channel."
tags:
- observability
- reporting
- new-relic
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: apm-reporting
port: 8080
tools:
- name: digest-apm-summary
description: "Fetches the 24-hour APM summary for a named application from New Relic and posts error rate, throughput, and response time metrics to the specified Teams channel. Invoke for daily platform health reviews."
inputParameters:
- name: app_name
in: body
type: string
description: "The New Relic application name to summarize (e.g., payments-service)."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel ID where the digest should be posted."
steps:
- name: get-app-summary
type: call
call: "newrelic.get-application-summary"
with:
app_name: "{{app_name}}"
- name: post-digest
type: call
call: "msteams-apm.send-message"
with:
channel_id: "{{teams_channel_id}}"
message: "APM Digest for {{app_name}}: Error rate {{get-app-summary.error_rate}}%, Throughput {{get-app-summary.throughput}} rpm, Avg response {{get-app-summary.response_time_ms}}ms."
consumes:
- type: http
namespace: newrelic
baseUri: "https://api.newrelic.com/v2"
authentication:
type: apikey
key: "X-Api-Key"
value: "$secrets.newrelic_api_key"
placement: header
resources:
- name: applications
path: "/applications.json"
inputParameters:
- name: app_name
in: query
operations:
- name: get-application-summary
method: GET
- type: http
namespace: msteams-apm
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Responds to New Relic error rate spikes by retrieving application metrics, creating a ServiceNow incident, and notifying the engineering team via Microsoft Teams.
naftiko: "0.5"
info:
label: "New Relic Error Rate Incident Creation"
description: "Responds to New Relic error rate spikes by retrieving application metrics, creating a ServiceNow incident, and notifying the engineering team via Microsoft Teams."
tags:
- observability
- new-relic
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: error-rate-incident
port: 8080
tools:
- name: handle-error-rate-spike
description: "Given a New Relic application name and error threshold, retrieves metrics, creates a ServiceNow incident, and alerts the engineering team."
inputParameters:
- name: app_name
in: body
type: string
description: "The New Relic application name."
- name: error_rate
in: body
type: number
description: "The current error rate percentage."
steps:
- name: get-app-metrics
type: call
call: "newrelic-apm.get-application"
with:
appName: "{{app_name}}"
- name: create-incident
type: call
call: "servicenow-eng.create-incident"
with:
short_description: "Error rate spike: {{app_name}} at {{error_rate}}%"
description: "Application: {{app_name}}\nError rate: {{error_rate}}%\nThroughput: {{get-app-metrics.throughput}}\nResponse time: {{get-app-metrics.response_time}}"
urgency: "2"
- name: notify-engineering
type: call
call: "msteams-eng.send-message"
with:
channel_id: "$secrets.engineering_channel_id"
message: "Error rate spike: {{app_name}} at {{error_rate}}%. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: newrelic-apm
baseUri: "https://api.newrelic.com/v2"
authentication:
type: apikey
key: "X-Api-Key"
value: "$secrets.newrelic_api_key"
placement: header
resources:
- name: applications
path: "/applications.json"
inputParameters:
- name: appName
in: query
operations:
- name: get-application
method: GET
- type: http
namespace: servicenow-eng
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Responds to Okta suspicious login alerts by retrieving user session details, creating a Splunk investigation query, and notifying the security team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Okta Suspicious Login Response"
description: "Responds to Okta suspicious login alerts by retrieving user session details, creating a Splunk investigation query, and notifying the security team via Microsoft Teams."
tags:
- security
- okta
- splunk
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: suspicious-login
port: 8080
tools:
- name: handle-suspicious-login
description: "Given an Okta user ID with suspicious login activity, retrieves session data, queries Splunk for correlated events, and alerts the security team."
inputParameters:
- name: user_id
in: body
type: string
description: "The Okta user ID."
- name: source_ip
in: body
type: string
description: "The suspicious source IP address."
steps:
- name: get-user-sessions
type: call
call: "okta-sessions.get-sessions"
with:
userId: "{{user_id}}"
- name: query-splunk
type: call
call: "splunk-security.search-events"
with:
search: "search index=auth src_ip={{source_ip}} user={{user_id}} earliest=-1h"
- name: alert-security
type: call
call: "msteams-security.send-message"
with:
channel_id: "$secrets.security_channel_id"
message: "Suspicious login alert: user {{user_id}} from IP {{source_ip}}. Active sessions: {{get-user-sessions.session_count}}. Correlated events: {{query-splunk.result_count}}."
consumes:
- type: http
namespace: okta-sessions
baseUri: "https://jpmorgan.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_token"
resources:
- name: sessions
path: "/users/{{userId}}/sessions"
inputParameters:
- name: userId
in: path
operations:
- name: get-sessions
method: GET
- type: http
namespace: splunk-security
baseUri: "https://jpmorgan-splunk.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search-jobs
path: "/search/jobs/export"
inputParameters:
- name: search
in: query
operations:
- name: search-events
method: GET
- type: http
namespace: msteams-security
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Monitors options portfolio Greeks from Snowflake, updates the risk dashboard in Salesforce, and alerts the derivatives desk via Microsoft Teams when thresholds are breached.
naftiko: "0.5"
info:
label: "Options Portfolio Greeks Monitor"
description: "Monitors options portfolio Greeks from Snowflake, updates the risk dashboard in Salesforce, and alerts the derivatives desk via Microsoft Teams when thresholds are breached."
tags:
- trading
- derivatives
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: greeks-monitor
port: 8080
tools:
- name: check-portfolio-greeks
description: "Given a portfolio ID, queries Snowflake for current Greeks, updates Salesforce risk records, and alerts the desk if thresholds are breached."
inputParameters:
- name: portfolio_id
in: body
type: string
description: "The options portfolio identifier."
steps:
- name: get-greeks
type: call
call: "snowflake-derivatives.query-greeks"
with:
portfolio: "{{portfolio_id}}"
- name: update-risk-record
type: call
call: "salesforce-derivatives.update-portfolio-risk"
with:
portfolioId: "{{portfolio_id}}"
Delta__c: "{{get-greeks.delta}}"
Gamma__c: "{{get-greeks.gamma}}"
Vega__c: "{{get-greeks.vega}}"
Theta__c: "{{get-greeks.theta}}"
- name: alert-desk
type: call
call: "msteams-derivatives.send-message"
with:
channel_id: "$secrets.derivatives_channel_id"
message: "Greeks alert for {{portfolio_id}}: Delta={{get-greeks.delta}}, Gamma={{get-greeks.gamma}}, Vega={{get-greeks.vega}}, Theta={{get-greeks.theta}}."
consumes:
- type: http
namespace: snowflake-derivatives
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: portfolio
in: body
operations:
- name: query-greeks
method: POST
- type: http
namespace: salesforce-derivatives
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: portfolio-risk
path: "/sobjects/Portfolio_Risk__c/{{portfolioId}}"
inputParameters:
- name: portfolioId
in: path
operations:
- name: update-portfolio-risk
method: PATCH
- type: http
namespace: msteams-derivatives
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Handles payment processing failures by retrieving error details from Snowflake, creating a ServiceNow incident, and notifying the payments operations team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Payment Processing Failure Remediation"
description: "Handles payment processing failures by retrieving error details from Snowflake, creating a ServiceNow incident, and notifying the payments operations team via Microsoft Teams."
tags:
- payments
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: payment-failure
port: 8080
tools:
- name: handle-payment-failure
description: "Given a failed payment reference, retrieves error details from Snowflake, creates a ServiceNow incident, and alerts the payments ops team."
inputParameters:
- name: payment_ref
in: body
type: string
description: "The failed payment reference number."
- name: error_code
in: body
type: string
description: "The payment processing error code."
steps:
- name: get-error-details
type: call
call: "snowflake-payments.query-failure"
with:
payment_ref: "{{payment_ref}}"
error_code: "{{error_code}}"
- name: create-incident
type: call
call: "servicenow-incidents.create-incident"
with:
short_description: "Payment failure: {{payment_ref}}"
description: "Error: {{error_code}}\nAmount: {{get-error-details.amount}}\nBeneficiary: {{get-error-details.beneficiary}}"
urgency: "2"
- name: notify-payments-ops
type: call
call: "msteams-payments.send-message"
with:
channel_id: "$secrets.payments_channel_id"
message: "Payment failure: {{payment_ref}} ({{error_code}}). Amount: {{get-error-details.amount}}. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: snowflake-payments
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: payment_ref
in: body
- name: error_code
in: body
operations:
- name: query-failure
method: POST
- type: http
namespace: servicenow-incidents
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-payments
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Screens an outgoing payment against OFAC sanctions lists, creates a compliance case in Salesforce if flagged, and logs the screening result to Snowflake.
naftiko: "0.5"
info:
label: "Payment Sanctions Screening Workflow"
description: "Screens an outgoing payment against OFAC sanctions lists, creates a compliance case in Salesforce if flagged, and logs the screening result to Snowflake."
tags:
- payments
- compliance
- salesforce
- snowflake
capability:
exposes:
- type: mcp
namespace: sanctions-screening
port: 8080
tools:
- name: screen-payment
description: "Given payment details, runs OFAC sanctions screening, creates a Salesforce compliance case if flagged, and logs the result to Snowflake for audit."
inputParameters:
- name: payment_ref
in: body
type: string
description: "The payment reference number."
- name: beneficiary_name
in: body
type: string
description: "The beneficiary name to screen."
- name: beneficiary_country
in: body
type: string
description: "ISO country code of the beneficiary."
- name: amount
in: body
type: number
description: "The payment amount."
steps:
- name: screen-beneficiary
type: call
call: "ofac-screening.search-entity"
with:
name: "{{beneficiary_name}}"
country: "{{beneficiary_country}}"
- name: create-compliance-case
type: call
call: "salesforce-compliance.create-case"
with:
subject: "Sanctions screening: {{beneficiary_name}}"
description: "Payment ref: {{payment_ref}}\nAmount: {{amount}}\nMatch score: {{screen-beneficiary.match_score}}"
priority: "{{screen-beneficiary.recommended_priority}}"
- name: log-screening
type: call
call: "snowflake-compliance.insert-record"
with:
table: "COMPLIANCE.SANCTIONS_SCREENINGS"
payment_ref: "{{payment_ref}}"
match_score: "{{screen-beneficiary.match_score}}"
case_id: "{{create-compliance-case.case_number}}"
consumes:
- type: http
namespace: ofac-screening
baseUri: "https://api.ofac-api.com/v4"
authentication:
type: bearer
token: "$secrets.ofac_api_token"
resources:
- name: entities
path: "/search"
inputParameters:
- name: name
in: query
- name: country
in: query
operations:
- name: search-entity
method: GET
- type: http
namespace: salesforce-compliance
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: snowflake-compliance
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-record
method: POST
Pulls the current active headcount and payroll summary from Workday to support weekly finance reporting and workforce planning.
naftiko: "0.5"
info:
label: "Payroll Headcount Snapshot"
description: "Pulls the current active headcount and payroll summary from Workday to support weekly finance reporting and workforce planning."
tags:
- hr
- payroll
- reporting
- workday
capability:
exposes:
- type: mcp
namespace: hr-reporting
port: 8080
tools:
- name: get-payroll-headcount
description: "Returns current active headcount and payroll cost summary from Workday. Invoke for weekly finance or HR dashboards that need live headcount data."
inputParameters:
- name: cost_center_id
in: body
type: string
description: "The Workday cost center ID to scope the headcount query."
call: "workday-payroll.get-headcount"
with:
cost_center: "{{cost_center_id}}"
outputParameters:
- name: headcount
type: integer
mapping: "$.total"
- name: payroll_cost
type: number
mapping: "$.payrollCost"
consumes:
- type: http
namespace: workday-payroll
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: headcount
path: "/costCenters/{{cost_center}}/headcount"
inputParameters:
- name: cost_center
in: path
operations:
- name: get-headcount
method: GET
Retrieves the last refresh status and timestamp of a Power BI dataset for reporting operations.
naftiko: "0.5"
info:
label: "Power BI Dataset Refresh Status Lookup"
description: "Retrieves the last refresh status and timestamp of a Power BI dataset for reporting operations."
tags:
- reporting
- power-bi
- data-refresh
- lookup
capability:
exposes:
- type: mcp
namespace: dataset-refresh
port: 8080
tools:
- name: get-refresh-status
description: "Given a Power BI workspace and dataset ID, returns the last refresh status, start time, and end time. Use for reporting health checks."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Power BI workspace ID."
- name: dataset_id
in: body
type: string
description: "The Power BI dataset ID."
call: "powerbi-datasets.get-refresh-history"
with:
workspaceId: "{{workspace_id}}"
datasetId: "{{dataset_id}}"
outputParameters:
- name: status
type: string
mapping: "$.value[0].status"
- name: start_time
type: string
mapping: "$.value[0].startTime"
consumes:
- type: http
namespace: powerbi-datasets
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: refreshes
path: "/groups/{{workspaceId}}/datasets/{{datasetId}}/refreshes"
inputParameters:
- name: workspaceId
in: path
- name: datasetId
in: path
operations:
- name: get-refresh-history
method: GET
Triggers a Power BI dataset refresh for the executive financial dashboard and notifies finance leadership via Microsoft Teams when the refresh completes.
naftiko: "0.5"
info:
label: "Power BI Financial Dashboard Refresh"
description: "Triggers a Power BI dataset refresh for the executive financial dashboard and notifies finance leadership via Microsoft Teams when the refresh completes."
tags:
- data
- analytics
- reporting
- power-bi
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance-reporting
port: 8080
tools:
- name: refresh-financial-dashboard
description: "Given a Power BI dataset ID and workspace ID, triggers a dataset refresh and notifies the finance team in Teams upon completion. Invoke at the start of business hours or after a period close."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Power BI workspace (group) ID containing the dataset."
- name: dataset_id
in: body
type: string
description: "The Power BI dataset ID to refresh."
- name: notify_channel
in: body
type: string
description: "The Teams channel ID for finance leadership notifications."
steps:
- name: trigger-refresh
type: call
call: "powerbi.refresh-dataset"
with:
workspaceId: "{{workspace_id}}"
datasetId: "{{dataset_id}}"
- name: notify-finance
type: call
call: "msteams-powerbi.send-message"
with:
channel_id: "{{notify_channel}}"
message: "Financial dashboard dataset {{dataset_id}} refresh triggered. Reports will be updated shortly."
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: dataset-refreshes
path: "/groups/{{workspaceId}}/datasets/{{datasetId}}/refreshes"
inputParameters:
- name: workspaceId
in: path
- name: datasetId
in: path
operations:
- name: refresh-dataset
method: POST
- type: http
namespace: msteams-powerbi
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Detects regulatory limit breaches in Snowflake, creates a compliance case in Salesforce, and escalates to the chief compliance officer via Microsoft Teams.
naftiko: "0.5"
info:
label: "Regulatory Breach Notification Workflow"
description: "Detects regulatory limit breaches in Snowflake, creates a compliance case in Salesforce, and escalates to the chief compliance officer via Microsoft Teams."
tags:
- compliance
- regulatory
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: reg-breach
port: 8080
tools:
- name: handle-regulatory-breach
description: "Given a regulation type and metric that breached, queries Snowflake for details, creates a Salesforce case, and escalates to the CCO."
inputParameters:
- name: regulation
in: body
type: string
description: "The regulation identifier (e.g., Basel III, Volcker Rule)."
- name: metric_name
in: body
type: string
description: "The breached metric name."
steps:
- name: get-breach-details
type: call
call: "snowflake-compliance.query-breach"
with:
regulation: "{{regulation}}"
metric: "{{metric_name}}"
- name: create-compliance-case
type: call
call: "salesforce-compliance.create-case"
with:
subject: "Regulatory breach: {{regulation}} - {{metric_name}}"
description: "Regulation: {{regulation}}\nMetric: {{metric_name}}\nCurrent value: {{get-breach-details.current_value}}\nLimit: {{get-breach-details.regulatory_limit}}\nBreach magnitude: {{get-breach-details.breach_amount}}"
priority: "Critical"
- name: escalate-to-cco
type: call
call: "msteams-compliance.send-message"
with:
channel_id: "$secrets.cco_channel_id"
message: "REGULATORY BREACH: {{regulation}} - {{metric_name}}. Current: {{get-breach-details.current_value}} vs Limit: {{get-breach-details.regulatory_limit}}. Case: {{create-compliance-case.case_number}}."
consumes:
- type: http
namespace: snowflake-compliance
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: regulation
in: body
- name: metric
in: body
operations:
- name: query-breach
method: POST
- type: http
namespace: salesforce-compliance
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case"
operations:
- name: create-case
method: POST
- type: http
namespace: msteams-compliance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Extracts regulatory data from Snowflake, generates a summary using Anthropic Claude, and creates a ServiceNow task for the compliance team to review and submit the filing.
naftiko: "0.5"
info:
label: "Regulatory Filing Preparation Workflow"
description: "Extracts regulatory data from Snowflake, generates a summary using Anthropic Claude, and creates a ServiceNow task for the compliance team to review and submit the filing."
tags:
- compliance
- snowflake
- anthropic
- servicenow
capability:
exposes:
- type: mcp
namespace: reg-filing-prep
port: 8080
tools:
- name: prepare-regulatory-filing
description: "Given a filing type and reporting period, extracts data from Snowflake, generates an AI summary via Claude, and creates a ServiceNow review task."
inputParameters:
- name: filing_type
in: body
type: string
description: "The regulatory filing type (e.g., FR-2052a, CCAR, DFAST)."
- name: reporting_period
in: body
type: string
description: "The reporting period in YYYY-Q# format."
steps:
- name: extract-data
type: call
call: "snowflake-reg.query-filing-data"
with:
filing_type: "{{filing_type}}"
period: "{{reporting_period}}"
- name: generate-summary
type: call
call: "anthropic-ai.create-message"
with:
model: "claude-sonnet-4-20250514"
prompt: "Summarize the following regulatory filing data for {{filing_type}} period {{reporting_period}}: {{extract-data.results}}"
- name: create-review-task
type: call
call: "servicenow-tasks.create-task"
with:
short_description: "Review {{filing_type}} filing for {{reporting_period}}"
description: "{{generate-summary.content}}"
assignment_group: "Regulatory Compliance"
consumes:
- type: http
namespace: snowflake-reg
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: filing_type
in: body
- name: period
in: body
operations:
- name: query-filing-data
method: POST
- type: http
namespace: anthropic-ai
baseUri: "https://api.anthropic.com/v1"
authentication:
type: bearer
token: "$secrets.anthropic_api_key"
resources:
- name: messages
path: "/messages"
inputParameters:
- name: model
in: body
- name: prompt
in: body
operations:
- name: create-message
method: POST
- type: http
namespace: servicenow-tasks
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Detects Salesforce Service Cloud cases for corporate clients that have breached SLA thresholds and escalates them to the relationship management team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Banking SLA Escalation"
description: "Detects Salesforce Service Cloud cases for corporate clients that have breached SLA thresholds and escalates them to the relationship management team via Microsoft Teams."
tags:
- crm
- customer-support
- sla
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: crm-sla
port: 8080
tools:
- name: escalate-sla-breach
description: "Given a Salesforce case ID that has breached SLA, updates the case priority and notifies the relationship management team in Microsoft Teams. Invoke when SLA monitoring detects a breach."
inputParameters:
- name: case_id
in: body
type: string
description: "The Salesforce case ID that has breached its SLA."
- name: escalation_channel
in: body
type: string
description: "The Teams channel ID for the relationship management team."
steps:
- name: get-case
type: call
call: "salesforce-cases.get-case"
with:
caseId: "{{case_id}}"
- name: escalate-case
type: call
call: "salesforce-cases.update-case"
with:
caseId: "{{case_id}}"
Priority: "High"
Status: "Escalated"
- name: notify-rm-team
type: call
call: "msteams-escalation.send-message"
with:
channel_id: "{{escalation_channel}}"
message: "SLA breach detected for case {{case_id}} — client: {{get-case.AccountName}}. Case escalated to High priority."
consumes:
- type: http
namespace: salesforce-cases
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: cases
path: "/sobjects/Case/{{caseId}}"
inputParameters:
- name: caseId
in: path
- name: Priority
in: body
- name: Status
in: body
operations:
- name: get-case
method: GET
- name: update-case
method: PATCH
- type: http
namespace: msteams-escalation
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Enriches a Salesforce corporate account with firmographic data from ZoomInfo to keep CRM records current for relationship bankers and sales teams.
naftiko: "0.5"
info:
label: "Salesforce Client Account Enrichment"
description: "Enriches a Salesforce corporate account with firmographic data from ZoomInfo to keep CRM records current for relationship bankers and sales teams."
tags:
- crm
- sales
- salesforce
- zoominfo
- data-enrichment
capability:
exposes:
- type: mcp
namespace: crm-enrichment
port: 8080
tools:
- name: enrich-client-account
description: "Given a Salesforce account ID, fetches updated firmographic data from ZoomInfo and writes it back to the Salesforce account record. Invoke for stale CRM records or as part of a new client onboarding workflow."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce account ID to enrich."
steps:
- name: get-account
type: call
call: "salesforce-accounts.get-account"
with:
accountId: "{{account_id}}"
- name: lookup-zoominfo
type: call
call: "zoominfo.search-company"
with:
companyName: "{{get-account.Name}}"
website: "{{get-account.Website}}"
- name: update-account
type: call
call: "salesforce-accounts.update-account"
with:
accountId: "{{account_id}}"
Industry: "{{lookup-zoominfo.industry}}"
AnnualRevenue: "{{lookup-zoominfo.revenue}}"
NumberOfEmployees: "{{lookup-zoominfo.employeeCount}}"
consumes:
- type: http
namespace: salesforce-accounts
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{accountId}}"
inputParameters:
- name: accountId
in: path
- name: Industry
in: body
- name: AnnualRevenue
in: body
- name: NumberOfEmployees
in: body
operations:
- name: get-account
method: GET
- name: update-account
method: PATCH
- type: http
namespace: zoominfo
baseUri: "https://api.zoominfo.com/search"
authentication:
type: bearer
token: "$secrets.zoominfo_token"
resources:
- name: companies
path: "/company"
inputParameters:
- name: companyName
in: query
- name: website
in: query
operations:
- name: search-company
method: GET
Retrieves client account details from Salesforce including relationship tier, AUM, and primary contact for wealth management inquiries.
naftiko: "0.5"
info:
label: "Salesforce Client Account Lookup"
description: "Retrieves client account details from Salesforce including relationship tier, AUM, and primary contact for wealth management inquiries."
tags:
- wealth
- salesforce
- client-management
- lookup
capability:
exposes:
- type: mcp
namespace: client-account
port: 8080
tools:
- name: get-client-account
description: "Given a Salesforce account ID, returns the client name, relationship tier, AUM, and primary contact. Use for relationship manager inquiries."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce account record ID."
call: "salesforce-wealth.get-account"
with:
accountId: "{{account_id}}"
outputParameters:
- name: client_name
type: string
mapping: "$.Name"
- name: relationship_tier
type: string
mapping: "$.Relationship_Tier__c"
- name: aum
type: number
mapping: "$.Assets_Under_Management__c"
consumes:
- type: http
namespace: salesforce-wealth
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{accountId}}"
inputParameters:
- name: accountId
in: path
operations:
- name: get-account
method: GET
When a Salesforce opportunity for a corporate banking client reaches Closed Won, creates a corresponding SAP S/4HANA project order and notifies the deal team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Client Opportunity Sync to SAP"
description: "When a Salesforce opportunity for a corporate banking client reaches Closed Won, creates a corresponding SAP S/4HANA project order and notifies the deal team via Microsoft Teams."
tags:
- crm
- sales
- finance
- salesforce
- sap-s4hana
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: crm-erp-sync
port: 8080
tools:
- name: sync-opportunity-to-sap
description: "Given a Salesforce opportunity ID, reads the closed-won deal details and creates a project order in SAP S/4HANA, then notifies the deal team in Teams. Invoke when a CRM opportunity status changes to Closed Won."
inputParameters:
- name: opportunity_id
in: body
type: string
description: "The Salesforce opportunity ID for the closed-won deal."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel ID where the deal team should be notified."
steps:
- name: get-opportunity
type: call
call: "salesforce-read.get-opportunity"
with:
opportunityId: "{{opportunity_id}}"
- name: create-sap-project
type: call
call: "sap-s4-projects.create-project"
with:
ProjectName: "{{get-opportunity.Name}}"
Amount: "{{get-opportunity.Amount}}"
CustomerAccount: "{{get-opportunity.AccountId}}"
- name: notify-deal-team
type: call
call: "msteams-crm.send-message"
with:
channel_id: "{{teams_channel_id}}"
message: "Opportunity '{{get-opportunity.Name}}' closed. SAP project order created: {{create-sap-project.ProjectInternalID}}."
consumes:
- type: http
namespace: salesforce-read
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/sobjects/Opportunity/{{opportunityId}}"
inputParameters:
- name: opportunityId
in: path
operations:
- name: get-opportunity
method: GET
- type: http
namespace: sap-s4-projects
baseUri: "https://jpmorgan-s4.sap.com/sap/opu/odata/sap/API_PROJECT_SRV"
authentication:
type: basic
username: "$secrets.sap_s4_username"
password: "$secrets.sap_s4_password"
resources:
- name: projects
path: "/A_Project"
inputParameters:
- name: ProjectName
in: body
- name: Amount
in: body
- name: CustomerAccount
in: body
operations:
- name: create-project
method: POST
- type: http
namespace: msteams-crm
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Retrieves the status and details of a loan application from Salesforce for lending operations review.
naftiko: "0.5"
info:
label: "Salesforce Loan Application Status Lookup"
description: "Retrieves the status and details of a loan application from Salesforce for lending operations review."
tags:
- lending
- salesforce
- loan-origination
- lookup
capability:
exposes:
- type: mcp
namespace: loan-status
port: 8080
tools:
- name: get-loan-application
description: "Given a Salesforce loan application ID, returns the application status, loan amount, and underwriting decision. Use for lending desk inquiries."
inputParameters:
- name: application_id
in: body
type: string
description: "The Salesforce loan application record ID."
call: "salesforce-lending.get-application"
with:
applicationId: "{{application_id}}"
outputParameters:
- name: status
type: string
mapping: "$.Status__c"
- name: loan_amount
type: number
mapping: "$.Loan_Amount__c"
- name: decision
type: string
mapping: "$.Underwriting_Decision__c"
consumes:
- type: http
namespace: salesforce-lending
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: loan-applications
path: "/sobjects/Loan_Application__c/{{applicationId}}"
inputParameters:
- name: applicationId
in: path
operations:
- name: get-application
method: GET
Identifies wealth management clients due for periodic relationship reviews in Salesforce, creates ServiceNow tasks for review preparation, and notifies relationship managers via Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Relationship Review Scheduling"
description: "Identifies wealth management clients due for periodic relationship reviews in Salesforce, creates ServiceNow tasks for review preparation, and notifies relationship managers via Microsoft Teams."
tags:
- wealth
- salesforce
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: relationship-review
port: 8080
tools:
- name: schedule-relationship-review
description: "Given a client account ID due for review, retrieves Salesforce client data, creates a ServiceNow prep task, and notifies the RM."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce client account ID."
steps:
- name: get-client
type: call
call: "salesforce-wealth.get-account"
with:
accountId: "{{account_id}}"
- name: create-prep-task
type: call
call: "servicenow-wealth.create-task"
with:
short_description: "Relationship review: {{get-client.Name}}"
description: "Client: {{get-client.Name}}\nTier: {{get-client.Relationship_Tier__c}}\nAUM: {{get-client.Assets_Under_Management__c}}"
assignment_group: "Wealth Management"
- name: notify-rm
type: call
call: "msteams-wealth.send-message"
with:
channel_id: "$secrets.wealth_channel_id"
message: "Relationship review due: {{get-client.Name}} (Tier {{get-client.Relationship_Tier__c}}). Task: {{create-prep-task.number}}."
consumes:
- type: http
namespace: salesforce-wealth
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{accountId}}"
inputParameters:
- name: accountId
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: servicenow-wealth
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
- type: http
namespace: msteams-wealth
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Generates a daily digest of active trade finance and corporate banking opportunities from Salesforce and publishes the summary to the wholesale banking leadership channel in Microsoft Teams.
naftiko: "0.5"
info:
label: "Salesforce Trade Finance Pipeline Digest"
description: "Generates a daily digest of active trade finance and corporate banking opportunities from Salesforce and publishes the summary to the wholesale banking leadership channel in Microsoft Teams."
tags:
- crm
- sales
- reporting
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sales-reporting
port: 8080
tools:
- name: digest-pipeline
description: "Queries the Salesforce pipeline for open opportunities in the wholesale banking segment and posts a daily summary to the specified Teams channel. Invoke each morning for leadership pipeline reviews."
inputParameters:
- name: opportunity_stage
in: body
type: string
description: "Salesforce opportunity stage to filter by (e.g., Proposal/Price Quote)."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel ID for wholesale banking leadership."
steps:
- name: query-pipeline
type: call
call: "salesforce-pipeline.query-opportunities"
with:
stage: "{{opportunity_stage}}"
- name: post-digest
type: call
call: "msteams-sales.send-message"
with:
channel_id: "{{teams_channel_id}}"
message: "Pipeline digest ({{opportunity_stage}}): {{query-pipeline.total_count}} opportunities totalling {{query-pipeline.total_amount}}. Top deal: {{query-pipeline.top_opportunity_name}}."
consumes:
- type: http
namespace: salesforce-pipeline
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: opportunities
path: "/query"
inputParameters:
- name: stage
in: 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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Retrieves the current status and details of a trade order from Salesforce by order ID for front-office operations review.
naftiko: "0.5"
info:
label: "Salesforce Trade Order Status Lookup"
description: "Retrieves the current status and details of a trade order from Salesforce by order ID for front-office operations review."
tags:
- trading
- salesforce
- order-management
- lookup
capability:
exposes:
- type: mcp
namespace: trade-orders
port: 8080
tools:
- name: get-trade-order-status
description: "Given a Salesforce trade order ID, returns the order status, asset class, notional amount, and counterparty. Use for trade desk inquiries."
inputParameters:
- name: order_id
in: body
type: string
description: "The Salesforce trade order record ID."
call: "salesforce-trading.get-order"
with:
orderId: "{{order_id}}"
outputParameters:
- name: status
type: string
mapping: "$.Status__c"
- name: notional_amount
type: number
mapping: "$.Notional_Amount__c"
- name: counterparty
type: string
mapping: "$.Counterparty__c"
consumes:
- type: http
namespace: salesforce-trading
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: trade-orders
path: "/sobjects/Trade_Order__c/{{orderId}}"
inputParameters:
- name: orderId
in: path
operations:
- name: get-order
method: GET
Triggers the accounts payable period close process in SAP S/4HANA, posts close status to the finance operations Teams channel, and creates a ServiceNow task for any unprocessed invoices.
naftiko: "0.5"
info:
label: "SAP AP Period Close Automation"
description: "Triggers the accounts payable period close process in SAP S/4HANA, posts close status to the finance operations Teams channel, and creates a ServiceNow task for any unprocessed invoices."
tags:
- finance
- accounts-payable
- period-close
- sap-s4hana
- servicenow
capability:
exposes:
- type: mcp
namespace: finance-period-close
port: 8080
tools:
- name: run-ap-period-close
description: "Given a company code and fiscal period, triggers the AP period close in SAP S/4HANA, creates a ServiceNow task for any exceptions, and notifies the finance ops team in Teams. Invoke at month-end to close the accounts payable period."
inputParameters:
- name: company_code
in: body
type: string
description: "The SAP company code for which to run the period close (e.g., JPMC)."
- name: fiscal_period
in: body
type: string
description: "The fiscal period to close in YYYY-MM format."
- name: finance_channel
in: body
type: string
description: "The Teams channel ID for finance operations notifications."
steps:
- name: trigger-period-close
type: call
call: "sap-ap.close-period"
with:
CompanyCode: "{{company_code}}"
FiscalPeriod: "{{fiscal_period}}"
- name: create-exception-task
type: call
call: "servicenow-ap.create-incident"
with:
short_description: "AP period close exceptions for {{company_code}} period {{fiscal_period}}"
category: "Finance"
- name: notify-finance-ops
type: call
call: "msteams-ap.send-message"
with:
channel_id: "{{finance_channel}}"
message: "AP period close initiated for {{company_code}} ({{fiscal_period}}). Exceptions task: {{create-exception-task.number}}."
consumes:
- type: http
namespace: sap-ap
baseUri: "https://jpmorgan-s4.sap.com/sap/opu/odata/sap/API_FINANCIALPERIOD_SRV"
authentication:
type: basic
username: "$secrets.sap_s4_username"
password: "$secrets.sap_s4_password"
resources:
- name: periods
path: "/A_CompanyCodeFiscalYear"
inputParameters:
- name: CompanyCode
in: body
- name: FiscalPeriod
in: body
operations:
- name: close-period
method: POST
- type: http
namespace: servicenow-ap
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
operations:
- name: create-incident
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Queries SAP Ariba for contracts expiring within a configurable window and creates ServiceNow renewal tasks, notifying the responsible category manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Ariba Contract Expiry Monitor"
description: "Queries SAP Ariba for contracts expiring within a configurable window and creates ServiceNow renewal tasks, notifying the responsible category manager via Microsoft Teams."
tags:
- procurement
- contract-management
- sap-ariba
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: procurement-contracts
port: 8080
tools:
- name: monitor-contract-expiry
description: "Given a number of days ahead, finds SAP Ariba contracts expiring within that window, creates a ServiceNow renewal task for each, and notifies the category manager via Teams. Invoke during daily procurement operations sweeps."
inputParameters:
- name: days_ahead
in: body
type: integer
description: "Number of days ahead to scan for expiring contracts (e.g., 30)."
- name: notify_channel
in: body
type: string
description: "Microsoft Teams channel ID to notify about expiring contracts."
steps:
- name: get-expiring-contracts
type: call
call: "ariba.get-expiring-contracts"
with:
daysUntilExpiry: "{{days_ahead}}"
- name: create-renewal-task
type: call
call: "servicenow-contracts.create-incident"
with:
short_description: "Contract renewal required within {{days_ahead}} days"
category: "Procurement"
- name: notify-category-manager
type: call
call: "msteams-procurement.send-message"
with:
channel_id: "{{notify_channel}}"
message: "{{get-expiring-contracts.count}} contracts expiring within {{days_ahead}} days. Renewal tasks created in ServiceNow."
consumes:
- type: http
namespace: ariba
baseUri: "https://openapi.ariba.com/api/contract/v1"
authentication:
type: apikey
key: "APIKey"
value: "$secrets.ariba_api_key"
placement: header
resources:
- name: contracts
path: "/contracts"
inputParameters:
- name: daysUntilExpiry
in: query
operations:
- name: get-expiring-contracts
method: GET
- type: http
namespace: servicenow-contracts
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams-procurement
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Retrieves supplier data from SAP Ariba, runs a risk scoring query in Snowflake, and updates the supplier record in Salesforce with the risk assessment results.
naftiko: "0.5"
info:
label: "SAP Ariba Supplier Risk Assessment"
description: "Retrieves supplier data from SAP Ariba, runs a risk scoring query in Snowflake, and updates the supplier record in Salesforce with the risk assessment results."
tags:
- procurement
- sap-ariba
- snowflake
- salesforce
capability:
exposes:
- type: mcp
namespace: supplier-risk
port: 8080
tools:
- name: assess-supplier-risk
description: "Given a supplier ID, retrieves SAP Ariba supplier data, runs Snowflake risk scoring, and updates Salesforce."
inputParameters:
- name: supplier_id
in: body
type: string
description: "The SAP Ariba supplier identifier."
steps:
- name: get-supplier
type: call
call: "sap-ariba.get-supplier-profile"
with:
supplierId: "{{supplier_id}}"
- name: run-risk-scoring
type: call
call: "snowflake-procurement.query-supplier-risk"
with:
supplier_id: "{{supplier_id}}"
supplier_country: "{{get-supplier.country}}"
- name: update-salesforce
type: call
call: "salesforce-procurement.update-supplier"
with:
supplierId: "{{supplier_id}}"
Risk_Score__c: "{{run-risk-scoring.risk_score}}"
Risk_Category__c: "{{run-risk-scoring.risk_category}}"
consumes:
- type: http
namespace: sap-ariba
baseUri: "https://openapi.ariba.com/api/supplier-management/v1"
authentication:
type: bearer
token: "$secrets.ariba_token"
resources:
- name: suppliers
path: "/suppliers/{{supplierId}}"
inputParameters:
- name: supplierId
in: path
operations:
- name: get-supplier-profile
method: GET
- type: http
namespace: snowflake-procurement
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: supplier_id
in: body
- name: supplier_country
in: body
operations:
- name: query-supplier-risk
method: POST
- type: http
namespace: salesforce-procurement
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: suppliers
path: "/sobjects/Supplier__c/{{supplierId}}"
inputParameters:
- name: supplierId
in: path
operations:
- name: update-supplier
method: PATCH
Retrieves pending expense reports from SAP Concur and triggers approval for reports that meet policy thresholds, notifying the submitter via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Approval"
description: "Retrieves pending expense reports from SAP Concur and triggers approval for reports that meet policy thresholds, notifying the submitter via Microsoft Teams."
tags:
- finance
- expense-management
- sap-concur
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: finance-expense
port: 8080
tools:
- name: approve-expense-report
description: "Given a SAP Concur expense report ID, validates policy compliance and submits approval, then notifies the submitter via Teams. Use when a manager or automated process needs to approve travel and expense claims."
inputParameters:
- name: expense_report_id
in: body
type: string
description: "The SAP Concur expense report ID to approve."
- name: submitter_teams_id
in: body
type: string
description: "The Microsoft Teams user ID of the expense report submitter."
steps:
- name: get-report
type: call
call: "concur.get-expense-report"
with:
id: "{{expense_report_id}}"
- name: approve-report
type: call
call: "concur.approve-expense-report"
with:
id: "{{expense_report_id}}"
status: "APPROVED"
- name: notify-submitter
type: call
call: "msteams-finance.send-message"
with:
user_id: "{{submitter_teams_id}}"
message: "Your expense report {{expense_report_id}} ({{get-report.total}}) has been approved."
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/{{id}}"
inputParameters:
- name: id
in: path
- name: status
in: body
operations:
- name: get-expense-report
method: GET
- name: approve-expense-report
method: PATCH
- type: http
namespace: msteams-finance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chat-messages
path: "/users/{{user_id}}/chats/messages"
inputParameters:
- name: user_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Retrieves the current balance for a specified general ledger account from SAP S/4HANA for finance and accounting review.
naftiko: "0.5"
info:
label: "SAP General Ledger Balance Lookup"
description: "Retrieves the current balance for a specified general ledger account from SAP S/4HANA for finance and accounting review."
tags:
- finance
- sap
- sap-s4hana
- general-ledger
capability:
exposes:
- type: mcp
namespace: gl-balance
port: 8080
tools:
- name: get-gl-balance
description: "Given a GL account number and company code, returns the current balance and currency from SAP S/4HANA. Use for finance team inquiries."
inputParameters:
- name: gl_account
in: body
type: string
description: "The general ledger account number."
- name: company_code
in: body
type: string
description: "The SAP company code."
call: "sap-s4.get-gl-balance"
with:
GLAccount: "{{gl_account}}"
CompanyCode: "{{company_code}}"
outputParameters:
- name: balance
type: number
mapping: "$.EndingBalanceAmtInCoCodeCrcy"
- name: currency
type: string
mapping: "$.CompanyCodeCurrency"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://jpmorgan-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
authentication:
type: basic
username: "$secrets.sap_s4_username"
password: "$secrets.sap_s4_password"
resources:
- name: gl-items
path: "/A_JournalEntryItemBasic"
inputParameters:
- name: GLAccount
in: query
- name: CompanyCode
in: query
operations:
- name: get-gl-balance
method: GET
Retrieves invoice details from SAP, cross-references with Snowflake payment records, and creates a ServiceNow task for discrepancies.
naftiko: "0.5"
info:
label: "SAP Invoice Reconciliation Workflow"
description: "Retrieves invoice details from SAP, cross-references with Snowflake payment records, and creates a ServiceNow task for discrepancies."
tags:
- finance
- sap
- sap-s4hana
- snowflake
- servicenow
capability:
exposes:
- type: mcp
namespace: invoice-recon
port: 8080
tools:
- name: reconcile-invoice
description: "Given an SAP invoice number, retrieves invoice details, checks Snowflake payment records, and creates a ServiceNow task if discrepancies are found."
inputParameters:
- name: invoice_number
in: body
type: string
description: "The SAP invoice document number."
steps:
- name: get-invoice
type: call
call: "sap-s4.get-invoice"
with:
InvoiceDocument: "{{invoice_number}}"
- name: check-payment
type: call
call: "snowflake-finance.query-payment-match"
with:
invoice_number: "{{invoice_number}}"
amount: "{{get-invoice.InvoiceGrossAmount}}"
- name: create-recon-task
type: call
call: "servicenow-tasks.create-task"
with:
short_description: "Invoice reconciliation: {{invoice_number}}"
description: "Invoice amount: {{get-invoice.InvoiceGrossAmount}}\nPayment match: {{check-payment.match_status}}\nDifference: {{check-payment.difference}}"
assignment_group: "Accounts Payable"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://jpmorgan-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_s4_username"
password: "$secrets.sap_s4_password"
resources:
- name: invoices
path: "/A_SupplierInvoice('{{InvoiceDocument}}')"
inputParameters:
- name: InvoiceDocument
in: path
operations:
- name: get-invoice
method: GET
- type: http
namespace: snowflake-finance
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: invoice_number
in: body
- name: amount
in: body
operations:
- name: query-payment-match
method: POST
- type: http
namespace: servicenow-tasks
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Retrieves a SAP S/4HANA purchase order by PO number, returning vendor, line items, and approval status for finance and procurement review.
naftiko: "0.5"
info:
label: "SAP Purchase Order Lookup"
description: "Retrieves a SAP S/4HANA purchase order by PO number, returning vendor, line items, and approval status for finance and procurement review."
tags:
- finance
- procurement
- sap
- sap-s4hana
capability:
exposes:
- type: mcp
namespace: procurement
port: 8080
tools:
- name: get-purchase-order
description: "Given a SAP purchase order number, returns vendor name, total value, line items, and approval status from SAP S/4HANA. Use when an agent or analyst needs to verify PO status."
inputParameters:
- name: po_number
in: body
type: string
description: "The SAP purchase order number (e.g., 4500012345)."
call: "sap-s4.get-purchase-order"
with:
PurchaseOrder: "{{po_number}}"
outputParameters:
- name: vendor_name
type: string
mapping: "$.Supplier"
- name: total_net_amount
type: number
mapping: "$.NetAmount"
- name: status
type: string
mapping: "$.ProcessingStatus"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://jpmorgan-s4.sap.com/sap/opu/odata/sap/MM_PUR_PO_MAINT_V2_SRV"
authentication:
type: basic
username: "$secrets.sap_s4_username"
password: "$secrets.sap_s4_password"
resources:
- name: purchase-orders
path: "/PurchaseOrder/{{PurchaseOrder}}"
inputParameters:
- name: PurchaseOrder
in: path
operations:
- name: get-purchase-order
method: GET
Retrieves vendor master data from SAP S/4HANA by vendor number for procurement and accounts payable verification.
naftiko: "0.5"
info:
label: "SAP Vendor Master Lookup"
description: "Retrieves vendor master data from SAP S/4HANA by vendor number for procurement and accounts payable verification."
tags:
- finance
- sap
- sap-s4hana
- vendor-management
capability:
exposes:
- type: mcp
namespace: vendor-master
port: 8080
tools:
- name: get-vendor
description: "Given a SAP vendor number, returns the vendor name, payment terms, and bank details. Use for AP inquiries and vendor verification."
inputParameters:
- name: vendor_number
in: body
type: string
description: "The SAP vendor master number."
call: "sap-s4.get-vendor"
with:
Supplier: "{{vendor_number}}"
outputParameters:
- name: vendor_name
type: string
mapping: "$.SupplierName"
- name: payment_terms
type: string
mapping: "$.PaymentTerms"
- name: country
type: string
mapping: "$.Country"
consumes:
- type: http
namespace: sap-s4
baseUri: "https://jpmorgan-s4.sap.com/sap/opu/odata/sap/API_BUSINESS_PARTNER"
authentication:
type: basic
username: "$secrets.sap_s4_username"
password: "$secrets.sap_s4_password"
resources:
- name: suppliers
path: "/A_Supplier/{{Supplier}}"
inputParameters:
- name: Supplier
in: path
operations:
- name: get-vendor
method: GET
Retrieves approved invoices from SAP, initiates payment processing via Snowflake records, and notifies the AP team via Microsoft Teams.
naftiko: "0.5"
info:
label: "SAP Vendor Payment Processing"
description: "Retrieves approved invoices from SAP, initiates payment processing via Snowflake records, and notifies the AP team via Microsoft Teams."
tags:
- finance
- sap
- sap-s4hana
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: vendor-payment
port: 8080
tools:
- name: process-vendor-payment
description: "Given an SAP invoice number, retrieves invoice data, logs the payment to Snowflake, and notifies the AP team."
inputParameters:
- name: invoice_number
in: body
type: string
description: "The SAP invoice document number."
steps:
- name: get-invoice
type: call
call: "sap-s4.get-invoice-detail"
with:
InvoiceDocument: "{{invoice_number}}"
- name: log-payment
type: call
call: "snowflake-finance.insert-payment"
with:
table: "FINANCE.VENDOR_PAYMENTS"
invoice_number: "{{invoice_number}}"
amount: "{{get-invoice.InvoiceGrossAmount}}"
vendor: "{{get-invoice.SupplierName}}"
- name: notify-ap
type: call
call: "msteams-finance.send-message"
with:
channel_id: "$secrets.ap_channel_id"
message: "Payment processed for invoice {{invoice_number}}: {{get-invoice.InvoiceGrossAmount}} to {{get-invoice.SupplierName}}."
consumes:
- type: http
namespace: sap-s4
baseUri: "https://jpmorgan-s4.sap.com/sap/opu/odata/sap/API_SUPPLIERINVOICE_PROCESS_SRV"
authentication:
type: basic
username: "$secrets.sap_s4_username"
password: "$secrets.sap_s4_password"
resources:
- name: invoices
path: "/A_SupplierInvoice('{{InvoiceDocument}}')"
inputParameters:
- name: InvoiceDocument
in: path
operations:
- name: get-invoice-detail
method: GET
- type: http
namespace: snowflake-finance
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-payment
method: POST
- type: http
namespace: msteams-finance
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Retrieves change request details from ServiceNow including approval status and implementation window for release management.
naftiko: "0.5"
info:
label: "ServiceNow Change Request Lookup"
description: "Retrieves change request details from ServiceNow including approval status and implementation window for release management."
tags:
- itsm
- servicenow
- change-management
- lookup
capability:
exposes:
- type: mcp
namespace: change-request
port: 8080
tools:
- name: get-change-request
description: "Given a ServiceNow change request number, returns the approval status, risk level, and planned start/end times. Use for release coordination."
inputParameters:
- name: change_number
in: body
type: string
description: "The ServiceNow change request number (e.g., CHG0012345)."
call: "servicenow-changes.get-change"
with:
number: "{{change_number}}"
outputParameters:
- name: approval_status
type: string
mapping: "$.result[0].approval"
- name: risk
type: string
mapping: "$.result[0].risk"
- name: planned_start
type: string
mapping: "$.result[0].start_date"
consumes:
- type: http
namespace: servicenow-changes
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: changes
path: "/table/change_request"
inputParameters:
- name: number
in: query
operations:
- name: get-change
method: GET
Creates and routes a ServiceNow change request for planned infrastructure or application changes, enforcing the standard approval workflow before execution.
naftiko: "0.5"
info:
label: "ServiceNow Change Request Management"
description: "Creates and routes a ServiceNow change request for planned infrastructure or application changes, enforcing the standard approval workflow before execution."
tags:
- itsm
- change-management
- servicenow
capability:
exposes:
- type: mcp
namespace: change-management
port: 8080
tools:
- name: create-change-request
description: "Given a change description, affected system, and planned start time, creates a ServiceNow change request and returns the change ticket number. Invoke before any planned infrastructure modification."
inputParameters:
- name: short_description
in: body
type: string
description: "A short description of the planned change."
- name: affected_ci
in: body
type: string
description: "The configuration item (CI) name of the affected system."
- name: planned_start
in: body
type: string
description: "Planned start time for the change in ISO 8601 format."
call: "servicenow-change.create-change-request"
with:
short_description: "{{short_description}}"
cmdb_ci: "{{affected_ci}}"
start_date: "{{planned_start}}"
outputParameters:
- name: change_number
type: string
mapping: "$.result.number"
- name: sys_id
type: string
mapping: "$.result.sys_id"
consumes:
- type: http
namespace: servicenow-change
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: change-requests
path: "/table/change_request"
inputParameters:
- name: short_description
in: body
- name: cmdb_ci
in: body
- name: start_date
in: body
operations:
- name: create-change-request
method: POST
Retrieves the current status, priority, and assignment details of a ServiceNow incident for IT operations triage.
naftiko: "0.5"
info:
label: "ServiceNow Incident Status Lookup"
description: "Retrieves the current status, priority, and assignment details of a ServiceNow incident for IT operations triage."
tags:
- itsm
- servicenow
- incident-management
- lookup
capability:
exposes:
- type: mcp
namespace: incident-lookup
port: 8080
tools:
- name: get-incident-status
description: "Given a ServiceNow incident number, returns the current state, priority, assigned group, and short description. Use for IT support inquiries."
inputParameters:
- name: incident_number
in: body
type: string
description: "The ServiceNow incident number (e.g., INC0012345)."
call: "servicenow-incidents.get-incident"
with:
number: "{{incident_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result[0].state"
- name: priority
type: string
mapping: "$.result[0].priority"
- name: assigned_to
type: string
mapping: "$.result[0].assigned_to.display_value"
consumes:
- type: http
namespace: servicenow-incidents
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: number
in: query
operations:
- name: get-incident
method: GET
Queries Snowflake for the current credit exposure summary for a given counterparty.
naftiko: "0.5"
info:
label: "Snowflake Credit Exposure Lookup"
description: "Queries Snowflake for the current credit exposure summary for a given counterparty."
tags:
- risk
- snowflake
- credit-exposure
- counterparty
capability:
exposes:
- type: mcp
namespace: credit-exposure
port: 8080
tools:
- name: get-exposure
description: "Given a counterparty ID, returns the total credit exposure, limit, and utilization percentage from Snowflake. Use for risk desk inquiries."
inputParameters:
- name: counterparty_id
in: body
type: string
description: "The counterparty identifier."
call: "snowflake-risk.query-exposure"
with:
counterparty: "{{counterparty_id}}"
outputParameters:
- name: total_exposure
type: number
mapping: "$.data[0].TOTAL_EXPOSURE"
- name: credit_limit
type: number
mapping: "$.data[0].CREDIT_LIMIT"
- name: utilization_pct
type: number
mapping: "$.data[0].UTILIZATION_PCT"
consumes:
- type: http
namespace: snowflake-risk
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: counterparty
in: body
operations:
- name: query-exposure
method: POST
Queries Snowflake for the daily profit and loss summary for a given trading desk and date.
naftiko: "0.5"
info:
label: "Snowflake Daily PnL Report Lookup"
description: "Queries Snowflake for the daily profit and loss summary for a given trading desk and date."
tags:
- trading
- snowflake
- pnl
- reporting
capability:
exposes:
- type: mcp
namespace: pnl-report
port: 8080
tools:
- name: get-daily-pnl
description: "Given a trading desk code and date, returns the daily PnL summary from Snowflake. Use for end-of-day trading reviews."
inputParameters:
- name: desk_code
in: body
type: string
description: "The trading desk identifier code."
- name: report_date
in: body
type: string
description: "The report date in YYYY-MM-DD format."
call: "snowflake-pnl.query-pnl"
with:
desk: "{{desk_code}}"
date: "{{report_date}}"
outputParameters:
- name: total_pnl
type: number
mapping: "$.data[0].TOTAL_PNL"
- name: realized_pnl
type: number
mapping: "$.data[0].REALIZED_PNL"
consumes:
- type: http
namespace: snowflake-pnl
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: desk
in: body
- name: date
in: body
operations:
- name: query-pnl
method: POST
Monitors Snowflake tables for data quality anomalies and creates a ServiceNow data engineering incident when row counts or null rates breach configured thresholds.
naftiko: "0.5"
info:
label: "Snowflake Data Quality Alert"
description: "Monitors Snowflake tables for data quality anomalies and creates a ServiceNow data engineering incident when row counts or null rates breach configured thresholds."
tags:
- data
- analytics
- data-quality
- snowflake
- servicenow
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: check-snowflake-data-quality
description: "Given a Snowflake table name and expected minimum row count, queries the table metadata and creates a ServiceNow incident if quality thresholds are breached. Invoke during scheduled data pipeline monitoring runs."
inputParameters:
- name: table_name
in: body
type: string
description: "The fully qualified Snowflake table name (database.schema.table)."
- name: min_row_count
in: body
type: integer
description: "The minimum expected row count; alert if below this threshold."
steps:
- name: get-table-stats
type: call
call: "snowflake.query-table-stats"
with:
table: "{{table_name}}"
- name: create-data-incident
type: call
call: "servicenow-data.create-incident"
with:
short_description: "Data quality breach in {{table_name}}: row count {{get-table-stats.row_count}} below threshold {{min_row_count}}"
category: "Data Engineering"
urgency: "2"
consumes:
- type: http
namespace: snowflake
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: table
in: body
operations:
- name: query-table-stats
method: POST
- type: http
namespace: servicenow-data
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
- name: urgency
in: body
operations:
- name: create-incident
method: POST
Detects Snowflake ETL pipeline failures, creates a ServiceNow incident, and notifies the data engineering team via Microsoft Teams with failure details.
naftiko: "0.5"
info:
label: "Snowflake ETL Pipeline Failure Alert"
description: "Detects Snowflake ETL pipeline failures, creates a ServiceNow incident, and notifies the data engineering team via Microsoft Teams with failure details."
tags:
- data-engineering
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: etl-failure
port: 8080
tools:
- name: handle-etl-failure
description: "Given a Snowflake task name and failure details, creates a ServiceNow incident and alerts the data engineering team via Teams."
inputParameters:
- name: task_name
in: body
type: string
description: "The Snowflake task name that failed."
- name: error_message
in: body
type: string
description: "The ETL pipeline error message."
steps:
- name: get-task-history
type: call
call: "snowflake-admin.query-task-history"
with:
task_name: "{{task_name}}"
- name: create-incident
type: call
call: "servicenow-data.create-incident"
with:
short_description: "ETL failure: {{task_name}}"
description: "Task: {{task_name}}\nError: {{error_message}}\nLast success: {{get-task-history.last_success_time}}"
urgency: "2"
- name: alert-data-team
type: call
call: "msteams-data.send-message"
with:
channel_id: "$secrets.data_engineering_channel_id"
message: "ETL failure: {{task_name}}. Error: {{error_message}}. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: snowflake-admin
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: task_name
in: body
operations:
- name: query-task-history
method: POST
- type: http
namespace: servicenow-data
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Queries Snowflake for the current liquidity coverage ratio and net stable funding ratio for treasury management.
naftiko: "0.5"
info:
label: "Snowflake Liquidity Position Lookup"
description: "Queries Snowflake for the current liquidity coverage ratio and net stable funding ratio for treasury management."
tags:
- risk
- snowflake
- treasury
- liquidity
capability:
exposes:
- type: mcp
namespace: liquidity-position
port: 8080
tools:
- name: get-liquidity-metrics
description: "Given a business unit code and reporting date, returns LCR and NSFR metrics from Snowflake. Use for treasury and ALM reviews."
inputParameters:
- name: business_unit
in: body
type: string
description: "The business unit code."
- name: report_date
in: body
type: string
description: "The reporting date in YYYY-MM-DD format."
call: "snowflake-treasury.query-liquidity"
with:
unit: "{{business_unit}}"
date: "{{report_date}}"
outputParameters:
- name: lcr
type: number
mapping: "$.data[0].LCR"
- name: nsfr
type: number
mapping: "$.data[0].NSFR"
consumes:
- type: http
namespace: snowflake-treasury
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: unit
in: body
- name: date
in: body
operations:
- name: query-liquidity
method: POST
Queries Snowflake for the details and status of a payment transaction by reference number.
naftiko: "0.5"
info:
label: "Snowflake Payment Transaction Lookup"
description: "Queries Snowflake for the details and status of a payment transaction by reference number."
tags:
- payments
- snowflake
- transaction-management
- lookup
capability:
exposes:
- type: mcp
namespace: payment-lookup
port: 8080
tools:
- name: get-payment-transaction
description: "Given a payment reference number, returns the transaction status, amount, currency, and beneficiary from Snowflake. Use for payment operations inquiries."
inputParameters:
- name: payment_ref
in: body
type: string
description: "The payment reference number."
call: "snowflake-payments.query-transaction"
with:
payment_ref: "{{payment_ref}}"
outputParameters:
- name: status
type: string
mapping: "$.data[0].STATUS"
- name: amount
type: number
mapping: "$.data[0].AMOUNT"
- name: currency
type: string
mapping: "$.data[0].CURRENCY"
consumes:
- type: http
namespace: snowflake-payments
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: payment_ref
in: body
operations:
- name: query-transaction
method: POST
Queries Snowflake for the current regulatory capital ratios including CET1, Tier 1, and total capital for a given reporting date.
naftiko: "0.5"
info:
label: "Snowflake Regulatory Capital Lookup"
description: "Queries Snowflake for the current regulatory capital ratios including CET1, Tier 1, and total capital for a given reporting date."
tags:
- compliance
- snowflake
- regulatory-capital
- risk
capability:
exposes:
- type: mcp
namespace: capital-ratios
port: 8080
tools:
- name: get-capital-ratios
description: "Given a reporting date, returns the CET1, Tier 1, and total capital ratios from Snowflake. Use for regulatory reporting and risk oversight."
inputParameters:
- name: report_date
in: body
type: string
description: "The reporting date in YYYY-MM-DD format."
call: "snowflake-capital.query-ratios"
with:
date: "{{report_date}}"
outputParameters:
- name: cet1_ratio
type: number
mapping: "$.data[0].CET1_RATIO"
- name: tier1_ratio
type: number
mapping: "$.data[0].TIER1_RATIO"
- name: total_capital_ratio
type: number
mapping: "$.data[0].TOTAL_CAPITAL_RATIO"
consumes:
- type: http
namespace: snowflake-capital
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: date
in: body
operations:
- name: query-ratios
method: POST
Runs a Snowflake query to produce a regulatory reporting cohort snapshot for compliance teams and stores the result summary in a SharePoint document library.
naftiko: "0.5"
info:
label: "Snowflake Regulatory Reporting Cohort Snapshot"
description: "Runs a Snowflake query to produce a regulatory reporting cohort snapshot for compliance teams and stores the result summary in a SharePoint document library."
tags:
- data
- analytics
- regulatory-reporting
- compliance
- snowflake
- sharepoint
capability:
exposes:
- type: mcp
namespace: regulatory-data
port: 8080
tools:
- name: snapshot-regulatory-cohort
description: "Given a reporting period and regulatory cohort name, executes a Snowflake query to generate the cohort snapshot and uploads the result to a SharePoint document library. Invoke for periodic regulatory submissions (CCAR, DFAST, etc.)."
inputParameters:
- name: cohort_name
in: body
type: string
description: "The name of the regulatory cohort to snapshot (e.g., CCAR_2025_Q1)."
- name: reporting_period
in: body
type: string
description: "The reporting period in YYYY-QN format (e.g., 2025-Q1)."
- name: sharepoint_site_id
in: body
type: string
description: "The SharePoint site ID where the snapshot should be stored."
steps:
- name: run-cohort-query
type: call
call: "snowflake-reg.execute-statement"
with:
statement: "SELECT * FROM regulatory.{{cohort_name}} WHERE period = '{{reporting_period}}'"
- name: store-snapshot
type: call
call: "sharepoint-reg.create-folder"
with:
site_id: "{{sharepoint_site_id}}"
folder_name: "{{cohort_name}}_{{reporting_period}}"
consumes:
- type: http
namespace: snowflake-reg
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: statement
in: body
operations:
- name: execute-statement
method: POST
- type: http
namespace: sharepoint-reg
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
- name: folder_name
in: body
operations:
- name: create-folder
method: POST
Queries Snowflake for the settlement status of a trade by trade reference number for operations review.
naftiko: "0.5"
info:
label: "Snowflake Trade Settlement Status Lookup"
description: "Queries Snowflake for the settlement status of a trade by trade reference number for operations review."
tags:
- trading
- snowflake
- settlement
- operations
capability:
exposes:
- type: mcp
namespace: settlement-status
port: 8080
tools:
- name: get-settlement-status
description: "Given a trade reference number, returns the settlement status, value date, and counterparty from Snowflake. Use for ops desk inquiries."
inputParameters:
- name: trade_ref
in: body
type: string
description: "The trade reference number."
call: "snowflake-ops.query-settlement"
with:
trade_ref: "{{trade_ref}}"
outputParameters:
- name: settlement_status
type: string
mapping: "$.data[0].SETTLEMENT_STATUS"
- name: value_date
type: string
mapping: "$.data[0].VALUE_DATE"
consumes:
- type: http
namespace: snowflake-ops
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: trade_ref
in: body
operations:
- name: query-settlement
method: POST
Queries Snowflake for the latest Value-at-Risk calculation for a given portfolio and confidence level.
naftiko: "0.5"
info:
label: "Snowflake VaR Calculation Lookup"
description: "Queries Snowflake for the latest Value-at-Risk calculation for a given portfolio and confidence level."
tags:
- risk
- snowflake
- var
- market-risk
capability:
exposes:
- type: mcp
namespace: var-lookup
port: 8080
tools:
- name: get-var
description: "Given a portfolio ID and confidence level, returns the latest VaR figure and calculation date from Snowflake. Use for market risk monitoring."
inputParameters:
- name: portfolio_id
in: body
type: string
description: "The portfolio identifier."
- name: confidence_level
in: body
type: string
description: "The VaR confidence level (e.g., 99)."
call: "snowflake-risk.query-var"
with:
portfolio: "{{portfolio_id}}"
confidence: "{{confidence_level}}"
outputParameters:
- name: var_amount
type: number
mapping: "$.data[0].VAR_AMOUNT"
- name: calc_date
type: string
mapping: "$.data[0].CALC_DATE"
consumes:
- type: http
namespace: snowflake-risk
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: portfolio
in: body
- name: confidence
in: body
operations:
- name: query-var
method: POST
Queries Splunk for recent authentication events for a given user to support security investigations.
naftiko: "0.5"
info:
label: "Splunk Authentication Event Lookup"
description: "Queries Splunk for recent authentication events for a given user to support security investigations."
tags:
- security
- splunk
- authentication
- lookup
capability:
exposes:
- type: mcp
namespace: auth-events
port: 8080
tools:
- name: get-auth-events
description: "Given a username, returns recent authentication events from Splunk including timestamps, source IPs, and outcomes. Use for security inquiries."
inputParameters:
- name: username
in: body
type: string
description: "The username to look up authentication events for."
call: "splunk-search.get-events"
with:
search: "search index=auth user={{username}} earliest=-24h"
outputParameters:
- name: event_count
type: number
mapping: "$.results.length"
- name: last_login
type: string
mapping: "$.results[0]._time"
consumes:
- type: http
namespace: splunk-search
baseUri: "https://jpmorgan-splunk.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search-jobs
path: "/search/jobs/export"
inputParameters:
- name: search
in: query
operations:
- name: get-events
method: GET
When Splunk detects a high-severity security event, correlates the alert with Palo Alto Networks firewall logs and opens a CrowdStrike-informed ServiceNow security incident.
naftiko: "0.5"
info:
label: "Splunk Security Event Triage"
description: "When Splunk detects a high-severity security event, correlates the alert with Palo Alto Networks firewall logs and opens a CrowdStrike-informed ServiceNow security incident."
tags:
- security
- observability
- incident-response
- splunk
- palo-alto-networks
- servicenow
capability:
exposes:
- type: mcp
namespace: security-ops
port: 8080
tools:
- name: triage-security-event
description: "Given a Splunk alert ID and source IP, queries Palo Alto Networks for firewall context and creates a priority-1 ServiceNow security incident. Invoke when Splunk SIEM raises a high-severity alert."
inputParameters:
- name: splunk_alert_id
in: body
type: string
description: "The Splunk alert ID for the security event."
- name: source_ip
in: body
type: string
description: "The source IP address of the suspicious activity."
steps:
- name: get-firewall-context
type: call
call: "paloalto.get-security-policy"
with:
source_ip: "{{source_ip}}"
- name: create-security-incident
type: call
call: "servicenow-soc.create-incident"
with:
short_description: "High-severity security event from {{source_ip}} (Splunk: {{splunk_alert_id}})"
category: "Security"
urgency: "1"
consumes:
- type: http
namespace: paloalto
baseUri: "https://jpmorgan-fw.internal/restapi/v10.1"
authentication:
type: apikey
key: "X-PAN-KEY"
value: "$secrets.paloalto_api_key"
placement: header
resources:
- name: security-policies
path: "/Objects/Addresses"
inputParameters:
- name: source_ip
in: query
operations:
- name: get-security-policy
method: GET
- type: http
namespace: servicenow-soc
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_username"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
inputParameters:
- name: short_description
in: body
- name: category
in: body
- name: urgency
in: body
operations:
- name: create-incident
method: POST
Executes a stress testing scenario by running calculations in Snowflake, generating an AI analysis via Anthropic Claude, and creating a ServiceNow review task for the risk committee.
naftiko: "0.5"
info:
label: "Stress Testing Scenario Execution"
description: "Executes a stress testing scenario by running calculations in Snowflake, generating an AI analysis via Anthropic Claude, and creating a ServiceNow review task for the risk committee."
tags:
- risk
- stress-testing
- snowflake
- anthropic
- servicenow
capability:
exposes:
- type: mcp
namespace: stress-testing
port: 8080
tools:
- name: execute-stress-test
description: "Given a scenario name and parameters, runs Snowflake stress calculations, generates an AI analysis, and creates a review task."
inputParameters:
- name: scenario_name
in: body
type: string
description: "The stress test scenario name (e.g., rate-shock-200bp, credit-crisis)."
- name: portfolio_scope
in: body
type: string
description: "The portfolio scope: all, trading-book, or banking-book."
steps:
- name: run-stress-calc
type: call
call: "snowflake-risk.execute-stress-scenario"
with:
scenario: "{{scenario_name}}"
scope: "{{portfolio_scope}}"
- name: generate-analysis
type: call
call: "anthropic-ai.create-message"
with:
model: "claude-sonnet-4-20250514"
prompt: "Analyze stress test results for scenario {{scenario_name}} on {{portfolio_scope}}: PnL impact={{run-stress-calc.pnl_impact}}, Capital impact={{run-stress-calc.capital_impact}}, Worst-hit desk={{run-stress-calc.worst_desk}}"
- name: create-review-task
type: call
call: "servicenow-risk.create-task"
with:
short_description: "Stress test review: {{scenario_name}} ({{portfolio_scope}})"
description: "{{generate-analysis.content}}"
assignment_group: "Risk Committee"
consumes:
- type: http
namespace: snowflake-risk
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: scenario
in: body
- name: scope
in: body
operations:
- name: execute-stress-scenario
method: POST
- type: http
namespace: anthropic-ai
baseUri: "https://api.anthropic.com/v1"
authentication:
type: bearer
token: "$secrets.anthropic_api_key"
resources:
- name: messages
path: "/messages"
operations:
- name: create-message
method: POST
- type: http
namespace: servicenow-risk
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Reconciles SWIFT payment statuses by querying Snowflake for outbound messages, checking confirmations, and creating ServiceNow tasks for unconfirmed payments.
naftiko: "0.5"
info:
label: "SWIFT Payment Status Reconciliation"
description: "Reconciles SWIFT payment statuses by querying Snowflake for outbound messages, checking confirmations, and creating ServiceNow tasks for unconfirmed payments."
tags:
- payments
- swift
- snowflake
- servicenow
capability:
exposes:
- type: mcp
namespace: swift-recon
port: 8080
tools:
- name: reconcile-swift-payments
description: "Given a payment date range, queries Snowflake for SWIFT messages, identifies unconfirmed payments, and creates ServiceNow tasks."
inputParameters:
- name: start_date
in: body
type: string
description: "The start date in YYYY-MM-DD format."
- name: end_date
in: body
type: string
description: "The end date in YYYY-MM-DD format."
steps:
- name: get-outbound-messages
type: call
call: "snowflake-swift.query-outbound"
with:
start_date: "{{start_date}}"
end_date: "{{end_date}}"
- name: check-confirmations
type: call
call: "snowflake-swift.query-confirmations"
with:
start_date: "{{start_date}}"
end_date: "{{end_date}}"
- name: create-recon-task
type: call
call: "servicenow-payments.create-task"
with:
short_description: "SWIFT reconciliation: {{start_date}} to {{end_date}}"
description: "Outbound messages: {{get-outbound-messages.count}}\nConfirmed: {{check-confirmations.confirmed_count}}\nUnconfirmed: {{check-confirmations.unconfirmed_count}}"
assignment_group: "Payment Operations"
consumes:
- type: http
namespace: snowflake-swift
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: start_date
in: body
- name: end_date
in: body
operations:
- name: query-outbound
method: POST
- name: query-confirmations
method: POST
- type: http
namespace: servicenow-payments
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Triggers a Terraform Cloud workspace run to provision or update cloud infrastructure and reports the plan status to the platform engineering team in Microsoft Teams.
naftiko: "0.5"
info:
label: "Terraform Cloud Infrastructure Provisioning"
description: "Triggers a Terraform Cloud workspace run to provision or update cloud infrastructure and reports the plan status to the platform engineering team in Microsoft Teams."
tags:
- cloud
- infra
- terraform
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: infra-provisioning
port: 8080
tools:
- name: trigger-terraform-run
description: "Given a Terraform Cloud workspace ID, triggers a new plan-and-apply run and posts the run status to the specified Teams channel. Invoke when infrastructure changes need to be applied from a merged pull request."
inputParameters:
- name: workspace_id
in: body
type: string
description: "The Terraform Cloud workspace ID to trigger a run on."
- name: message
in: body
type: string
description: "A human-readable message describing the reason for this infrastructure change."
- name: teams_channel_id
in: body
type: string
description: "The Teams channel ID to notify with the run result."
steps:
- name: trigger-run
type: call
call: "terraform.create-run"
with:
workspace_id: "{{workspace_id}}"
message: "{{message}}"
- name: notify-platform-team
type: call
call: "msteams-infra.send-message"
with:
channel_id: "{{teams_channel_id}}"
message: "Terraform run triggered on workspace {{workspace_id}}: {{message}}. Run ID: {{trigger-run.id}}."
consumes:
- type: http
namespace: terraform
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: runs
path: "/runs"
inputParameters:
- name: workspace_id
in: body
- name: message
in: body
operations:
- name: create-run
method: POST
- type: http
namespace: msteams-infra
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Detects Terraform infrastructure drift, creates a ServiceNow change request for remediation, and notifies the cloud engineering team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Terraform Infrastructure Drift Detection"
description: "Detects Terraform infrastructure drift, creates a ServiceNow change request for remediation, and notifies the cloud engineering team via Microsoft Teams."
tags:
- devops
- terraform
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: infra-drift
port: 8080
tools:
- name: handle-infrastructure-drift
description: "Given a Terraform workspace with detected drift, retrieves drift details, creates a ServiceNow change request, and alerts the cloud team."
inputParameters:
- name: workspace_name
in: body
type: string
description: "The Terraform Cloud workspace name."
- name: drift_resource_count
in: body
type: number
description: "The number of resources with drift."
steps:
- name: get-drift-details
type: call
call: "terraform-cloud.get-workspace-drift"
with:
workspace: "{{workspace_name}}"
- name: create-change
type: call
call: "servicenow-cloud.create-change"
with:
short_description: "Infrastructure drift: {{workspace_name}} ({{drift_resource_count}} resources)"
description: "Workspace: {{workspace_name}}\nDrifted resources: {{drift_resource_count}}\nLast apply: {{get-drift-details.last_apply_time}}"
type: "Standard"
- name: notify-cloud-team
type: call
call: "msteams-cloud.send-message"
with:
channel_id: "$secrets.cloud_channel_id"
message: "Infrastructure drift detected in {{workspace_name}}: {{drift_resource_count}} resources drifted. Change: {{create-change.number}}."
consumes:
- type: http
namespace: terraform-cloud
baseUri: "https://app.terraform.io/api/v2"
authentication:
type: bearer
token: "$secrets.terraform_token"
resources:
- name: workspaces
path: "/organizations/jpmorgan/workspaces/{{workspace}}"
inputParameters:
- name: workspace
in: path
operations:
- name: get-workspace-drift
method: GET
- type: http
namespace: servicenow-cloud
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: msteams-cloud
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Captures a confirmed trade execution in Salesforce, logs the trade details to Snowflake for risk analytics, and notifies the operations team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Trade Execution Confirmation Workflow"
description: "Captures a confirmed trade execution in Salesforce, logs the trade details to Snowflake for risk analytics, and notifies the operations team via Microsoft Teams."
tags:
- trading
- salesforce
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: trade-confirmation
port: 8080
tools:
- name: confirm-trade-execution
description: "Given trade details, creates a Salesforce trade record, logs to Snowflake for risk analytics, and sends a Teams notification to operations."
inputParameters:
- name: trade_id
in: body
type: string
description: "The unique trade identifier."
- name: asset_class
in: body
type: string
description: "The asset class (e.g., equities, fixed-income, fx)."
- name: notional_amount
in: body
type: number
description: "The notional amount of the trade."
- name: counterparty
in: body
type: string
description: "The counterparty name."
steps:
- name: create-trade-record
type: call
call: "salesforce-trades.create-trade"
with:
TradeId__c: "{{trade_id}}"
Asset_Class__c: "{{asset_class}}"
Notional__c: "{{notional_amount}}"
Counterparty__c: "{{counterparty}}"
- name: log-to-snowflake
type: call
call: "snowflake-trades.insert-record"
with:
table: "TRADING.TRADE_EXECUTIONS"
trade_id: "{{trade_id}}"
asset_class: "{{asset_class}}"
notional: "{{notional_amount}}"
- name: notify-ops
type: call
call: "msteams-ops.send-message"
with:
channel_id: "$secrets.ops_channel_id"
message: "Trade {{trade_id}} confirmed: {{asset_class}} {{notional_amount}} with {{counterparty}}."
consumes:
- type: http
namespace: salesforce-trades
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: trades
path: "/sobjects/Trade__c"
operations:
- name: create-trade
method: POST
- type: http
namespace: snowflake-trades
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-record
method: POST
- 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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Detects failed trade settlements in Snowflake, creates a ServiceNow incident, and escalates to the operations team via Microsoft Teams for resolution.
naftiko: "0.5"
info:
label: "Trade Settlement Failure Escalation"
description: "Detects failed trade settlements in Snowflake, creates a ServiceNow incident, and escalates to the operations team via Microsoft Teams for resolution."
tags:
- trading
- settlement
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: settlement-failure
port: 8080
tools:
- name: escalate-settlement-failure
description: "Given a trade reference with settlement failure, retrieves details from Snowflake, creates a ServiceNow incident, and alerts the ops team via Teams."
inputParameters:
- name: trade_ref
in: body
type: string
description: "The failed trade reference number."
- name: failure_reason
in: body
type: string
description: "The settlement failure reason code."
steps:
- name: get-trade-details
type: call
call: "snowflake-ops.query-trade"
with:
trade_ref: "{{trade_ref}}"
- name: create-incident
type: call
call: "servicenow-incidents.create-incident"
with:
short_description: "Settlement failure: {{trade_ref}}"
description: "Trade: {{trade_ref}}\nReason: {{failure_reason}}\nCounterparty: {{get-trade-details.counterparty}}\nValue: {{get-trade-details.notional}}"
urgency: "2"
- name: escalate-to-ops
type: call
call: "msteams-ops.send-message"
with:
channel_id: "$secrets.ops_channel_id"
message: "Settlement failure for {{trade_ref}}: {{failure_reason}}. Incident: {{create-incident.number}}."
consumes:
- type: http
namespace: snowflake-ops
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: trade_ref
in: body
operations:
- name: query-trade
method: POST
- type: http
namespace: servicenow-incidents
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- 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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Generates a trading desk capacity report by pulling staffing data from Workday, trade volumes from Snowflake, and distributing the report via Microsoft Teams.
naftiko: "0.5"
info:
label: "Trading Desk Capacity Planning Report"
description: "Generates a trading desk capacity report by pulling staffing data from Workday, trade volumes from Snowflake, and distributing the report via Microsoft Teams."
tags:
- trading
- reporting
- workday
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: desk-capacity
port: 8080
tools:
- name: generate-capacity-report
description: "Given a desk code and reporting period, retrieves Workday headcount, Snowflake trade volumes, and sends a capacity report via Teams."
inputParameters:
- name: desk_code
in: body
type: string
description: "The trading desk identifier."
- name: period
in: body
type: string
description: "The reporting period (e.g., 2025-Q4)."
steps:
- name: get-headcount
type: call
call: "workday-hr.get-desk-headcount"
with:
deptCode: "{{desk_code}}"
- name: get-volumes
type: call
call: "snowflake-trading.query-desk-volumes"
with:
desk: "{{desk_code}}"
period: "{{period}}"
- name: send-report
type: call
call: "msteams-trading.send-message"
with:
channel_id: "$secrets.trading_mgmt_channel_id"
message: "Capacity report for {{desk_code}} ({{period}}):\nHeadcount: {{get-headcount.total}}\nTrade volume: {{get-volumes.total_trades}}\nTrades per trader: {{get-volumes.trades_per_trader}}"
consumes:
- type: http
namespace: workday-hr
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/jpmorgan"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: departments
path: "/departments/{{deptCode}}/headcount"
inputParameters:
- name: deptCode
in: path
operations:
- name: get-desk-headcount
method: GET
- type: http
namespace: snowflake-trading
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: desk
in: body
- name: period
in: body
operations:
- name: query-desk-volumes
method: POST
- type: http
namespace: msteams-trading
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Reconciles daily cash positions by querying Snowflake for bank balances, cross-referencing with SAP GL entries, and creating a ServiceNow task for discrepancies.
naftiko: "0.5"
info:
label: "Treasury Cash Position Reconciliation"
description: "Reconciles daily cash positions by querying Snowflake for bank balances, cross-referencing with SAP GL entries, and creating a ServiceNow task for discrepancies."
tags:
- treasury
- finance
- snowflake
- sap
- servicenow
capability:
exposes:
- type: mcp
namespace: cash-recon
port: 8080
tools:
- name: reconcile-cash-positions
description: "Given a reporting date and entity code, queries Snowflake bank balances, checks SAP GL, and creates a ServiceNow task for breaks."
inputParameters:
- name: report_date
in: body
type: string
description: "The reconciliation date in YYYY-MM-DD format."
- name: entity_code
in: body
type: string
description: "The legal entity code."
steps:
- name: get-bank-balances
type: call
call: "snowflake-treasury.query-bank-balances"
with:
date: "{{report_date}}"
entity: "{{entity_code}}"
- name: get-gl-balances
type: call
call: "sap-s4.get-cash-gl-balances"
with:
CompanyCode: "{{entity_code}}"
PostingDate: "{{report_date}}"
- name: create-recon-task
type: call
call: "servicenow-treasury.create-task"
with:
short_description: "Cash reconciliation: {{entity_code}} ({{report_date}})"
description: "Bank balance: {{get-bank-balances.total_balance}}\nGL balance: {{get-gl-balances.total_balance}}\nDifference: {{get-bank-balances.difference}}"
assignment_group: "Treasury Operations"
consumes:
- type: http
namespace: snowflake-treasury
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: date
in: body
- name: entity
in: body
operations:
- name: query-bank-balances
method: POST
- type: http
namespace: sap-s4
baseUri: "https://jpmorgan-s4.sap.com/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC_SRV"
authentication:
type: basic
username: "$secrets.sap_s4_username"
password: "$secrets.sap_s4_password"
resources:
- name: gl-items
path: "/A_JournalEntryItemBasic"
inputParameters:
- name: CompanyCode
in: query
- name: PostingDate
in: query
operations:
- name: get-cash-gl-balances
method: GET
- type: http
namespace: servicenow-treasury
baseUri: "https://jpmorgan.service-now.com/api/now"
authentication:
type: bearer
token: "$secrets.servicenow_token"
resources:
- name: tasks
path: "/table/task"
operations:
- name: create-task
method: POST
Generates a wealth client portfolio performance report by querying returns from Snowflake, fetching client details from Salesforce, and delivering via Microsoft Teams.
naftiko: "0.5"
info:
label: "Wealth Client Performance Report"
description: "Generates a wealth client portfolio performance report by querying returns from Snowflake, fetching client details from Salesforce, and delivering via Microsoft Teams."
tags:
- wealth
- reporting
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: client-performance
port: 8080
tools:
- name: generate-performance-report
description: "Given a client account ID and period, queries Snowflake for portfolio returns, fetches Salesforce client details, and sends the report via Teams."
inputParameters:
- name: account_id
in: body
type: string
description: "The Salesforce client account ID."
- name: period
in: body
type: string
description: "The reporting period (e.g., 2025-Q4)."
steps:
- name: get-performance
type: call
call: "snowflake-wealth.query-portfolio-performance"
with:
account_id: "{{account_id}}"
period: "{{period}}"
- name: get-client
type: call
call: "salesforce-wealth.get-account"
with:
accountId: "{{account_id}}"
- name: send-report
type: call
call: "msteams-wealth.send-message"
with:
channel_id: "$secrets.wealth_channel_id"
message: "Performance Report: {{get-client.Name}} ({{period}})\nReturn: {{get-performance.total_return}}%\nBenchmark: {{get-performance.benchmark_return}}%\nAlpha: {{get-performance.alpha}}%\nAUM: {{get-performance.ending_aum}}"
consumes:
- type: http
namespace: snowflake-wealth
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: account_id
in: body
- name: period
in: body
operations:
- name: query-portfolio-performance
method: POST
- type: http
namespace: salesforce-wealth
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: accounts
path: "/sobjects/Account/{{accountId}}"
inputParameters:
- name: accountId
in: path
operations:
- name: get-account
method: GET
- type: http
namespace: msteams-wealth
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Detects portfolio drift beyond threshold in Snowflake, retrieves client preferences from Salesforce, and notifies the wealth advisor via Microsoft Teams with rebalancing recommendations.
naftiko: "0.5"
info:
label: "Wealth Client Portfolio Rebalance Alert"
description: "Detects portfolio drift beyond threshold in Snowflake, retrieves client preferences from Salesforce, and notifies the wealth advisor via Microsoft Teams with rebalancing recommendations."
tags:
- wealth
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: portfolio-rebalance
port: 8080
tools:
- name: alert-portfolio-drift
description: "Given a client portfolio ID, checks drift in Snowflake, fetches client preferences from Salesforce, and alerts the wealth advisor via Teams."
inputParameters:
- name: portfolio_id
in: body
type: string
description: "The portfolio identifier."
- name: drift_threshold
in: body
type: number
description: "The drift percentage threshold."
steps:
- name: check-drift
type: call
call: "snowflake-wealth.query-drift"
with:
portfolio: "{{portfolio_id}}"
threshold: "{{drift_threshold}}"
- name: get-client-prefs
type: call
call: "salesforce-wealth.get-portfolio-account"
with:
portfolioId: "{{portfolio_id}}"
- name: notify-advisor
type: call
call: "msteams-wealth.send-message"
with:
channel_id: "$secrets.wealth_channel_id"
message: "Portfolio {{portfolio_id}} drift alert: {{check-drift.max_drift}}% exceeds threshold. Client risk profile: {{get-client-prefs.Risk_Profile__c}}."
consumes:
- type: http
namespace: snowflake-wealth
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: portfolio
in: body
- name: threshold
in: body
operations:
- name: query-drift
method: POST
- type: http
namespace: salesforce-wealth
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: portfolio-accounts
path: "/sobjects/Portfolio__c/{{portfolioId}}"
inputParameters:
- name: portfolioId
in: path
operations:
- name: get-portfolio-account
method: GET
- type: http
namespace: msteams-wealth
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Identifies tax loss harvesting opportunities in Snowflake for wealth management portfolios, retrieves client preferences from Salesforce, and notifies the wealth advisor via Microsoft Teams.
naftiko: "0.5"
info:
label: "Wealth Tax Lot Harvesting Alert"
description: "Identifies tax loss harvesting opportunities in Snowflake for wealth management portfolios, retrieves client preferences from Salesforce, and notifies the wealth advisor via Microsoft Teams."
tags:
- wealth
- tax
- snowflake
- salesforce
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: tax-harvesting
port: 8080
tools:
- name: alert-tax-harvesting-opportunity
description: "Given a portfolio ID, scans Snowflake for unrealized losses, checks Salesforce client preferences, and alerts the advisor via Teams."
inputParameters:
- name: portfolio_id
in: body
type: string
description: "The portfolio identifier."
steps:
- name: scan-losses
type: call
call: "snowflake-wealth.query-unrealized-losses"
with:
portfolio: "{{portfolio_id}}"
- name: get-client-prefs
type: call
call: "salesforce-wealth.get-client-tax-preferences"
with:
portfolioId: "{{portfolio_id}}"
- name: notify-advisor
type: call
call: "msteams-wealth.send-message"
with:
channel_id: "$secrets.wealth_channel_id"
message: "Tax loss harvesting opportunity for portfolio {{portfolio_id}}: {{scan-losses.total_unrealized_loss}} in unrealized losses across {{scan-losses.position_count}} positions."
consumes:
- type: http
namespace: snowflake-wealth
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
inputParameters:
- name: portfolio
in: body
operations:
- name: query-unrealized-losses
method: POST
- type: http
namespace: salesforce-wealth
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: portfolio-accounts
path: "/sobjects/Portfolio__c/{{portfolioId}}"
inputParameters:
- name: portfolioId
in: path
operations:
- name: get-client-tax-preferences
method: GET
- type: http
namespace: msteams-wealth
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Processes a high-value wire transfer approval by updating the payment status in Salesforce and notifying the treasury team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Wire Transfer Approval and Notification"
description: "Processes a high-value wire transfer approval by updating the payment status in Salesforce and notifying the treasury team via Microsoft Teams."
tags:
- payments
- salesforce
- microsoft-teams
- treasury
capability:
exposes:
- type: mcp
namespace: wire-approval
port: 8080
tools:
- name: approve-wire-transfer
description: "Given a wire transfer ID and approval decision, updates the payment record in Salesforce and notifies the treasury team via Teams."
inputParameters:
- name: wire_id
in: body
type: string
description: "The wire transfer record ID in Salesforce."
- name: approval_status
in: body
type: string
description: "The approval decision: approved or rejected."
- name: approver_name
in: body
type: string
description: "The name of the approver."
steps:
- name: update-wire-status
type: call
call: "salesforce-payments.update-wire"
with:
wireId: "{{wire_id}}"
Approval_Status__c: "{{approval_status}}"
Approved_By__c: "{{approver_name}}"
- name: notify-treasury
type: call
call: "msteams-treasury.send-message"
with:
channel_id: "$secrets.treasury_channel_id"
message: "Wire {{wire_id}} {{approval_status}} by {{approver_name}}."
consumes:
- type: http
namespace: salesforce-payments
baseUri: "https://jpmorgan.my.salesforce.com/services/data/v58.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: wires
path: "/sobjects/Wire_Transfer__c/{{wireId}}"
inputParameters:
- name: wireId
in: path
operations:
- name: update-wire
method: PATCH
- type: http
namespace: msteams-treasury
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Pulls budget-versus-actual variance data from Workday for a cost center and posts a formatted variance summary to the finance team's Microsoft Teams channel.
naftiko: "0.5"
info:
label: "Workday Budget Variance Reporter"
description: "Pulls budget-versus-actual variance data from Workday for a cost center and posts a formatted variance summary to the finance team's Microsoft Teams channel."
tags:
- finance
- budgeting
- reporting
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: budget-reporting
port: 8080
tools:
- name: report-budget-variance
description: "Given a Workday cost center ID and fiscal period, retrieves budget-versus-actual data and posts a variance summary to the finance team's Teams channel. Invoke for monthly budget review cycles."
inputParameters:
- name: cost_center_id
in: body
type: string
description: "The Workday cost center ID to report on."
- name: fiscal_period
in: body
type: string
description: "The fiscal period to report in YYYY-MM format."
- name: finance_channel_id
in: body
type: string
description: "The Teams channel ID for the finance team."
steps:
- name: get-variance
type: call
call: "workday-budget.get-budget-variance"
with:
cost_center: "{{cost_center_id}}"
period: "{{fiscal_period}}"
- name: post-variance-summary
type: call
call: "msteams-budget.send-message"
with:
channel_id: "{{finance_channel_id}}"
message: "Budget variance for {{cost_center_id}} ({{fiscal_period}}): Budget {{get-variance.budget}}, Actual {{get-variance.actual}}, Variance {{get-variance.variance_pct}}%."
consumes:
- type: http
namespace: workday-budget
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: budget-variances
path: "/costCenters/{{cost_center}}/budgetVariance"
inputParameters:
- name: cost_center
in: path
- name: period
in: query
operations:
- name: get-budget-variance
method: GET
- type: http
namespace: msteams-budget
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Retrieves pending compensation change requests from Workday and routes them for manager approval, notifying the approver via Microsoft Teams with a direct action link.
naftiko: "0.5"
info:
label: "Workday Compensation Review Approval"
description: "Retrieves pending compensation change requests from Workday and routes them for manager approval, notifying the approver via Microsoft Teams with a direct action link."
tags:
- hr
- compensation
- approval
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-compensation
port: 8080
tools:
- name: route-compensation-approval
description: "Given a Workday compensation change request ID and the approver's Teams user ID, fetches the request details and sends an approval notification to the manager in Teams. Invoke when a compensation change event requires human approval."
inputParameters:
- name: compensation_request_id
in: body
type: string
description: "The Workday compensation change request ID."
- name: approver_teams_id
in: body
type: string
description: "The Microsoft Teams user ID of the approving manager."
steps:
- name: get-comp-request
type: call
call: "workday-comp.get-compensation-change"
with:
request_id: "{{compensation_request_id}}"
- name: notify-approver
type: call
call: "msteams-comp.send-message"
with:
user_id: "{{approver_teams_id}}"
message: "Compensation change approval required for {{get-comp-request.employee_name}}: new salary {{get-comp-request.new_amount}}. Request ID: {{compensation_request_id}}."
consumes:
- type: http
namespace: workday-comp
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: compensation-changes
path: "/compensationChangeRequests/{{request_id}}"
inputParameters:
- name: request_id
in: path
operations:
- name: get-compensation-change
method: GET
- type: http
namespace: msteams-comp
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: chat-messages
path: "/users/{{user_id}}/chats/messages"
inputParameters:
- name: user_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Queries Workday for employees with overdue mandatory compliance training (e.g., AML, KYC, Code of Conduct) and sends reminder notifications via Microsoft Teams.
naftiko: "0.5"
info:
label: "Workday Compliance Training Tracker"
description: "Queries Workday for employees with overdue mandatory compliance training (e.g., AML, KYC, Code of Conduct) and sends reminder notifications via Microsoft Teams."
tags:
- hr
- compliance
- training
- workday
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-compliance-training
port: 8080
tools:
- name: remind-overdue-training
description: "Given a Workday learning course ID and the number of days overdue, fetches the list of non-compliant employees and sends personalized Teams reminders. Invoke for mandatory financial services compliance training (AML, KYC, Code of Conduct)."
inputParameters:
- name: course_id
in: body
type: string
description: "The Workday learning course ID for the mandatory training."
- name: days_overdue
in: body
type: integer
description: "Minimum number of days overdue to include in the reminder sweep."
steps:
- name: get-overdue-employees
type: call
call: "workday-learning.get-course-enrollments"
with:
course_id: "{{course_id}}"
status: "NOT_COMPLETED"
days_overdue: "{{days_overdue}}"
- name: send-reminder
type: call
call: "msteams-training.send-message"
with:
channel_id: "compliance-training"
message: "Mandatory training reminder: {{get-overdue-employees.count}} employees are {{days_overdue}}+ days overdue for course {{course_id}}. Managers have been notified."
consumes:
- type: http
namespace: workday-learning
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: course-enrollments
path: "/learningCourses/{{course_id}}/enrollments"
inputParameters:
- name: course_id
in: path
- name: status
in: query
- name: days_overdue
in: query
operations:
- name: get-course-enrollments
method: GET
- type: http
namespace: msteams-training
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Retrieves an employee profile from Workday by employee ID including role, department, and manager details.
naftiko: "0.5"
info:
label: "Workday Employee Profile Lookup"
description: "Retrieves an employee profile from Workday by employee ID including role, department, and manager details."
tags:
- hr
- workday
- employee-management
- lookup
capability:
exposes:
- type: mcp
namespace: employee-profile
port: 8080
tools:
- name: get-employee
description: "Given a Workday employee ID, returns the employee name, title, department, and manager. Use for HR inquiries and organizational lookups."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
call: "workday-hr.get-worker"
with:
workerId: "{{employee_id}}"
outputParameters:
- name: full_name
type: string
mapping: "$.Worker.Name"
- name: title
type: string
mapping: "$.Worker.JobTitle"
- name: department
type: string
mapping: "$.Worker.Department"
consumes:
- type: http
namespace: workday-hr
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/jpmorgan"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{workerId}}"
inputParameters:
- name: workerId
in: path
operations:
- name: get-worker
method: GET
Processes employee promotions by updating Workday records, adjusting Okta access groups, and notifying HR and the employee manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Workday Promotion and Access Update"
description: "Processes employee promotions by updating Workday records, adjusting Okta access groups, and notifying HR and the employee manager via Microsoft Teams."
tags:
- hr
- workday
- okta
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: promotion-update
port: 8080
tools:
- name: process-promotion
description: "Given employee and promotion details, updates Workday job profile, adjusts Okta group membership, and notifies HR and the manager."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID."
- name: new_title
in: body
type: string
description: "The new job title."
- name: new_level
in: body
type: string
description: "The new job level/band."
steps:
- name: update-workday
type: call
call: "workday-hr.update-job-profile"
with:
workerId: "{{employee_id}}"
jobTitle: "{{new_title}}"
jobLevel: "{{new_level}}"
- name: update-okta-groups
type: call
call: "okta-groups.update-membership"
with:
userId: "{{employee_id}}"
newGroup: "{{new_level}}-access"
- name: notify-hr
type: call
call: "msteams-hr.send-message"
with:
channel_id: "$secrets.hr_channel_id"
message: "Promotion processed: {{employee_id}} promoted to {{new_title}} ({{new_level}}). Okta groups updated."
consumes:
- type: http
namespace: workday-hr
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/jpmorgan"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{workerId}}/jobProfile"
inputParameters:
- name: workerId
in: path
operations:
- name: update-job-profile
method: PATCH
- type: http
namespace: okta-groups
baseUri: "https://jpmorgan.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_token"
resources:
- name: group-membership
path: "/groups/{{newGroup}}/users/{{userId}}"
inputParameters:
- name: userId
in: path
- name: newGroup
in: path
operations:
- name: update-membership
method: PUT
- 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/{{channel_id}}/channels/General/messages"
inputParameters:
- name: channel_id
in: path
- name: message
in: body
operations:
- name: send-message
method: POST
Processes employee terminations by retrieving Workday separation details, revoking Okta access, disabling GitHub accounts, and logging to Snowflake for audit.
naftiko: "0.5"
info:
label: "Workday Termination Access Revocation"
description: "Processes employee terminations by retrieving Workday separation details, revoking Okta access, disabling GitHub accounts, and logging to Snowflake for audit."
tags:
- hr
- workday
- okta
- github
- snowflake
capability:
exposes:
- type: mcp
namespace: termination-revocation
port: 8080
tools:
- name: process-termination-revocation
description: "Given a terminated employee ID, retrieves Workday details, revokes Okta and GitHub access, and logs the revocation to Snowflake."
inputParameters:
- name: employee_id
in: body
type: string
description: "The Workday employee ID of the terminated employee."
steps:
- name: get-employee
type: call
call: "workday-hr.get-terminated-worker"
with:
workerId: "{{employee_id}}"
- name: revoke-okta
type: call
call: "okta-users.deactivate-user"
with:
userId: "{{get-employee.email}}"
- name: disable-github
type: call
call: "github-org.remove-member"
with:
org: "jpmorgan-chase"
username: "{{get-employee.github_username}}"
- name: log-revocation
type: call
call: "snowflake-audit.insert-record"
with:
table: "HR.ACCESS_REVOCATIONS"
employee_id: "{{employee_id}}"
email: "{{get-employee.email}}"
consumes:
- type: http
namespace: workday-hr
baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/jpmorgan"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{workerId}}"
inputParameters:
- name: workerId
in: path
operations:
- name: get-terminated-worker
method: GET
- type: http
namespace: okta-users
baseUri: "https://jpmorgan.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_token"
resources:
- name: users
path: "/users/{{userId}}/lifecycle/deactivate"
inputParameters:
- name: userId
in: path
operations:
- name: deactivate-user
method: POST
- type: http
namespace: github-org
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: members
path: "/orgs/{{org}}/members/{{username}}"
inputParameters:
- name: org
in: path
- name: username
in: path
operations:
- name: remove-member
method: DELETE
- type: http
namespace: snowflake-audit
baseUri: "https://jpmorgan.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-record
method: POST