Jpmorgan Chase Capabilities

Naftiko 0.5 capability definitions for Jpmorgan Chase - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

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