ABN AMRO Capabilities

Naftiko 0.5 capability definitions for ABN AMRO - 100 capabilities showing integration workflows and service orchestrations.

Sort
Expand

Reconciles ADP payroll data with Workday employee records and Snowflake cost center budgets, creating ServiceNow tasks for discrepancies found during the monthly payroll cycle.

naftiko: "0.5"
info:
  label: "ADP Payroll Reconciliation"
  description: "Reconciles ADP payroll data with Workday employee records and Snowflake cost center budgets, creating ServiceNow tasks for discrepancies found during the monthly payroll cycle."
  tags:
    - hr
    - payroll
    - adp
    - workday
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-payroll
      port: 8080
      tools:
        - name: reconcile-payroll
          description: "Given a pay period, reconcile ADP payroll with Workday and Snowflake budget data, flagging discrepancies."
          inputParameters:
            - name: pay_period
              in: body
              type: string
              description: "The pay period in YYYY-MM format."
            - name: business_unit
              in: body
              type: string
              description: "The business unit to reconcile."
          steps:
            - name: get-payroll-data
              type: call
              call: "adp.get-payroll-summary"
              with:
                pay_period: "{{pay_period}}"
                business_unit: "{{business_unit}}"
            - name: get-headcount
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "HR_WH"
                database: "HR_DB"
                query: "SELECT department, COUNT(*) as headcount, SUM(budgeted_salary) as budget_total FROM employee_budget WHERE business_unit = '{{business_unit}}' AND period = '{{pay_period}}' GROUP BY department"
            - name: create-reconciliation-task
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_payroll_reconciliation"
                short_description: "Payroll reconciliation: {{business_unit}} — {{pay_period}}"
                description: "ADP total: {{get-payroll-data.total_gross}}. Budget total from Snowflake. Review and resolve discrepancies."
                assigned_group: "HR_Payroll"
  consumes:
    - type: http
      namespace: adp
      baseUri: "https://api.adp.com/hr/v2"
      authentication:
        type: bearer
        token: "$secrets.adp_token"
      resources:
        - name: payroll
          path: "/workers/payroll-summary?payPeriod={{pay_period}}&businessUnit={{business_unit}}"
          inputParameters:
            - name: pay_period
              in: query
            - name: business_unit
              in: query
          operations:
            - name: get-payroll-summary
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

On AML alert, enriches with customer data from Salesforce, checks sanctions lists, creates investigation case in ServiceNow, and notifies compliance via Teams.

naftiko: "0.5"
info:
  label: "AML Alert Investigation Pipeline"
  description: "On AML alert, enriches with customer data from Salesforce, checks sanctions lists, creates investigation case in ServiceNow, and notifies compliance via Teams."
  tags:
    - aml
    - compliance
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: aml
      port: 8080
      tools:
        - name: aml_alert_investigation_pipeline
          description: "Orchestrate aml alert investigation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-alert
              type: call
              call: "aml.get-alert"
              with:
                alert_id: "{{resource_id}}"
            - name: get-customer
              type: call
              call: "salesforce.get-customer"
              with:
                customer_id: "{{get-alert.customer_id}}"
            - name: create-case
              type: call
              call: "servicenow.create-case"
              with:
                short_description: "AML investigation: {{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "compliance"
                text: "AML alert {{resource_id}} for {{get-customer.name}}. Case: {{create-case.number}}"

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abn-amro.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

When a transaction monitoring alert fires, retrieves alert details from the AML system, enriches with customer data from Salesforce, checks Bloomberg sanctions, and creates a Jira investigation ticket for the financial crime team.

naftiko: "0.5"
info:
  label: "AML Transaction Monitoring Alert Triage"
  description: "When a transaction monitoring alert fires, retrieves alert details from the AML system, enriches with customer data from Salesforce, checks Bloomberg sanctions, and creates a Jira investigation ticket for the financial crime team."
  tags:
    - compliance
    - aml
    - transaction-monitoring
    - salesforce
    - bloomberg
    - jira
capability:
  exposes:
    - type: mcp
      namespace: compliance-aml
      port: 8080
      tools:
        - name: triage-aml-alert
          description: "Given an AML alert ID, enrich with customer data, run sanctions check, and open a Jira investigation case."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The AML system alert identifier."
            - name: customer_id
              in: body
              type: string
              description: "The Salesforce account ID associated with the flagged transaction."
          steps:
            - name: get-alert
              type: call
              call: "core-banking.get-aml-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: get-customer
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{customer_id}}"
            - name: sanctions-check
              type: call
              call: "bloomberg.search-sanctions"
              with:
                entity_name: "{{get-customer.name}}"
                country: "{{get-customer.billing_country}}"
            - name: create-investigation
              type: call
              call: "jira.create-issue"
              with:
                project_key: "FINCRIME"
                issuetype: "Investigation"
                summary: "[AML Alert] {{get-alert.rule_name}} — {{get-customer.name}}"
                description: "Alert: {{alert_id}}\nRule: {{get-alert.rule_name}}\nAmount: {{get-alert.amount}} {{get-alert.currency}}\nCustomer: {{get-customer.name}}\nSanctions match: {{sanctions-check.match_status}}\nRisk score: {{sanctions-check.risk_score}}"
  consumes:
    - type: http
      namespace: core-banking
      baseUri: "https://api.abnamro.com/v1/aml"
      authentication:
        type: bearer
        token: "$secrets.core_banking_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-aml-alert
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://abnamro.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: sanctions
          path: "/sanctions/screen"
          operations:
            - name: search-sanctions
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abnamro.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Generates annual client review documents from portfolio data, compliance records, and performance metrics, and sends to advisors.

naftiko: "0.5"
info:
  label: "Annual Review Document Generator"
  description: "Generates annual client review documents from portfolio data, compliance records, and performance metrics, and sends to advisors."
  tags:
    - client-management
    - documents
    - snowflake
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: client-management
      port: 8080
      tools:
        - name: annual_review_document_generator
          description: "Orchestrate annual review document generator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Queries Apache Kafka cluster metadata for a given topic, returning partition count, replication factor, and consumer group lag for banking event streaming.

naftiko: "0.5"
info:
  label: "Apache Kafka Topic Lookup"
  description: "Queries Apache Kafka cluster metadata for a given topic, returning partition count, replication factor, and consumer group lag for banking event streaming."
  tags:
    - messaging
    - event-streaming
    - apache-kafka
capability:
  exposes:
    - type: mcp
      namespace: event-platform
      port: 8080
      tools:
        - name: get-topic-info
          description: "Look up Kafka topic metadata. Returns partition count, replication factor, and consumer lag."
          inputParameters:
            - name: topic_name
              in: body
              type: string
              description: "The Kafka topic name."
            - name: cluster
              in: body
              type: string
              description: "The Kafka cluster identifier."
          call: "kafka.get-topic"
          with:
            topic_name: "{{topic_name}}"
            cluster: "{{cluster}}"
          outputParameters:
            - name: partition_count
              type: string
              mapping: "$.topic.partitions"
            - name: replication_factor
              type: string
              mapping: "$.topic.replicationFactor"
  consumes:
    - type: http
      namespace: kafka
      baseUri: "https://kafka-rest.abnamro.com/v3"
      authentication:
        type: bearer
        token: "$secrets.kafka_rest_token"
      resources:
        - name: topics
          path: "/clusters/{{cluster}}/topics/{{topic_name}}"
          inputParameters:
            - name: cluster
              in: path
            - name: topic_name
              in: path
          operations:
            - name: get-topic
              method: GET

Scans API gateway for deprecated endpoints, identifies consuming applications, sends deprecation notices via email, creates migration tasks in Jira, and updates Confluence docs.

naftiko: "0.5"
info:
  label: "API Deprecation Notification Pipeline"
  description: "Scans API gateway for deprecated endpoints, identifies consuming applications, sends deprecation notices via email, creates migration tasks in Jira, and updates Confluence docs."
  tags:
    - api-management
    - jira
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: api-management
      port: 8080
      tools:
        - name: api_deprecation_notification_pipeline
          description: "Orchestrate api deprecation notification pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: scan-apis
              type: call
              call: "kong.get-deprecated-routes"
              with:
                gateway_id: "{{resource_id}}"
            - name: identify-consumers
              type: call
              call: "apigee.get-consumers"
              with:
                route_id: "{{scan-apis.route_id}}"
            - name: create-migration
              type: call
              call: "jira.create-issue"
              with:
                project: "API"
                summary: "Migrate from deprecated API: {{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "api-platform"
                text: "API deprecation: {{resource_id}}. Migration ticket: {{create-migration.key}}"

  consumes:
    - type: http
      namespace: jira
      baseUri: "https://abn-amro.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://abn-amro.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Retrieves a secret value from Azure Key Vault for secure credential injection in downstream banking system integrations.

naftiko: "0.5"
info:
  label: "Azure Key Vault Secret Retrieval"
  description: "Retrieves a secret value from Azure Key Vault for secure credential injection in downstream banking system integrations."
  tags:
    - security
    - secrets-management
    - azure-key-vault
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: get-secret
          description: "Retrieve a secret from Azure Key Vault by name. Returns the secret value and version."
          inputParameters:
            - name: secret_name
              in: body
              type: string
              description: "The name of the secret in Azure Key Vault."
          call: "keyvault.get-secret"
          with:
            secret_name: "{{secret_name}}"
          outputParameters:
            - name: value
              type: string
              mapping: "$.value"
            - name: version
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: keyvault
      baseUri: "https://abnamro-vault.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_keyvault_token"
      resources:
        - name: secrets
          path: "/secrets/{{secret_name}}?api-version=7.4"
          inputParameters:
            - name: secret_name
              in: path
          operations:
            - name: get-secret
              method: GET

Executes read-only queries against ABN AMRO Azure SQL databases for reporting.

naftiko: "0.5"
info:
  label: "Azure SQL Query Runner"
  description: "Executes read-only queries against ABN AMRO Azure SQL databases for reporting."
  tags:
    - data
    - azure
    - sql
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: run-sql-query
          description: "Execute a SQL query and return results."
          inputParameters:
            - name: sql_query
              in: body
              type: string
              description: "The sql_query to look up." 
          call: "snowflake.get-sql_query"
          with:
            sql_query: "{{sql_query}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abn-amro.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: azure_sql_query_runner
              method: GET

Retrieves portfolio positions and valuations from Bloomberg AIM for a given portfolio and valuation date, returning total NAV, position count, and top holdings.

naftiko: "0.5"
info:
  label: "Bloomberg AIM Portfolio Valuation"
  description: "Retrieves portfolio positions and valuations from Bloomberg AIM for a given portfolio and valuation date, returning total NAV, position count, and top holdings."
  tags:
    - asset-management
    - portfolio
    - bloomberg-aim
capability:
  exposes:
    - type: mcp
      namespace: portfolio-management
      port: 8080
      tools:
        - name: get-portfolio-valuation
          description: "Look up portfolio valuation from Bloomberg AIM. Returns NAV, position count, and top holdings by weight."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Bloomberg AIM portfolio identifier."
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date in YYYY-MM-DD format."
          call: "bloomberg-aim.get-valuation"
          with:
            portfolio_id: "{{portfolio_id}}"
            valuation_date: "{{valuation_date}}"
          outputParameters:
            - name: nav
              type: string
              mapping: "$.portfolio.nav"
            - name: position_count
              type: string
              mapping: "$.portfolio.positionCount"
            - name: currency
              type: string
              mapping: "$.portfolio.baseCurrency"
  consumes:
    - type: http
      namespace: bloomberg-aim
      baseUri: "https://api.bloomberg.com/aim/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_aim_token"
      resources:
        - name: portfolios
          path: "/portfolios/{{portfolio_id}}/valuations?date={{valuation_date}}"
          inputParameters:
            - name: portfolio_id
              in: path
            - name: valuation_date
              in: query
          operations:
            - name: get-valuation
              method: GET

Retrieves real-time market data for a given security from Bloomberg Enterprise Data, checks for significant price movements against Snowflake historical data, and alerts the trading desk in Microsoft Teams if volatility thresholds are breached.

naftiko: "0.5"
info:
  label: "Bloomberg Market Data Lookup with Risk Check"
  description: "Retrieves real-time market data for a given security from Bloomberg Enterprise Data, checks for significant price movements against Snowflake historical data, and alerts the trading desk in Microsoft Teams if volatility thresholds are breached."
  tags:
    - trading
    - market-data
    - bloomberg-enterprise-data
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trading-data
      port: 8080
      tools:
        - name: get-security-quote-with-check
          description: "Look up real-time market data for a security by Bloomberg ticker, compare against historical volatility, and alert if thresholds are breached."
          inputParameters:
            - name: ticker
              in: body
              type: string
              description: "Bloomberg ticker symbol (e.g., ABNA NA Equity)."
            - name: volatility_threshold
              in: body
              type: number
              description: "Percentage threshold for volatility alerts."
          steps:
            - name: get-quote
              type: call
              call: "bloomberg.get-quote"
              with:
                ticker: "{{ticker}}"
            - name: get-historical
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "TRADING_WH"
                database: "MARKET_DATA_DB"
                query: "SELECT AVG(close_price) as avg_price, STDDEV(close_price) as std_price FROM price_history WHERE ticker = '{{ticker}}' AND trade_date >= DATEADD(day, -30, CURRENT_DATE())"
            - name: alert-desk
              type: call
              call: "msteams.send-message"
              with:
                channel: "trading-desk-alerts"
                text: "Market data alert: {{ticker}} | Last: {{get-quote.last_price}} | 30d avg: {{get-historical.avg_price}} | Std: {{get-historical.std_price}} | Threshold: {{volatility_threshold}}%"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: quotes
          path: "/market/quotes/{{ticker}}"
          inputParameters:
            - name: ticker
              in: path
          operations:
            - name: get-quote
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Fetches real-time market data from Bloomberg Terminal API for ABN AMRO trading desks.

naftiko: "0.5"
info:
  label: "Bloomberg Terminal Data Fetch"
  description: "Fetches real-time market data from Bloomberg Terminal API for ABN AMRO trading desks."
  tags:
    - trading
    - bloomberg
    - market-data
capability:
  exposes:
    - type: mcp
      namespace: trading
      port: 8080
      tools:
        - name: get-market-data
          description: "Fetch Bloomberg market data by ticker."
          inputParameters:
            - name: ticker
              in: body
              type: string
              description: "The ticker to look up." 
          call: "salesforce.get-ticker"
          with:
            ticker: "{{ticker}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abn-amro.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: bloomberg_terminal_data_fetch
              method: GET

On PR merge, runs SAST scan via SonarQube, checks dependency vulnerabilities, validates container image, approves or blocks deployment, and notifies dev team.

naftiko: "0.5"
info:
  label: "CI/CD Security Gate Pipeline"
  description: "On PR merge, runs SAST scan via SonarQube, checks dependency vulnerabilities, validates container image, approves or blocks deployment, and notifies dev team."
  tags:
    - devops
    - security
    - github
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: devops
      port: 8080
      tools:
        - name: cicd_security_gate_pipeline
          description: "Orchestrate ci/cd security gate pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-pr
              type: call
              call: "github.get-pull-request"
              with:
                pr_id: "{{resource_id}}"
            - name: run-sast
              type: call
              call: "sonarqube.analyze-project"
              with:
                project_key: "{{get-pr.repo}}"
            - name: check-deps
              type: call
              call: "snyk.test-project"
              with:
                project_id: "{{get-pr.repo}}"
            - name: notify
              type: call
              call: "slack.send-message"
              with:
                channel: "security-reviews"
                text: "Security gate for {{resource_id}}: SAST {{run-sast.status}}, Deps {{check-deps.issues}}"

  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: github-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abn-amro.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Identifies incomplete client records, creates remediation tasks, tracks completion progress, and reports to client data management.

naftiko: "0.5"
info:
  label: "Client Data Remediation Pipeline"
  description: "Identifies incomplete client records, creates remediation tasks, tracks completion progress, and reports to client data management."
  tags:
    - data-quality
    - client-data
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: client_data_remediation_pipeline
          description: "Orchestrate client data remediation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Validates client identity, screens against sanctions lists, creates client record in Salesforce, provisions ServiceNow access, and notifies relationship manager.

naftiko: "0.5"
info:
  label: "Client Onboarding KYC Pipeline"
  description: "Validates client identity, screens against sanctions lists, creates client record in Salesforce, provisions ServiceNow access, and notifies relationship manager."
  tags:
    - kyc
    - onboarding
    - salesforce
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: kyc
      port: 8080
      tools:
        - name: client_onboarding_kyc_pipeline
          description: "Orchestrate client onboarding kyc pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: validate-identity
              type: call
              call: "kyc.validate-client"
              with:
                client_id: "{{resource_id}}"
            - name: screen-sanctions
              type: call
              call: "sanctions.check-lists"
              with:
                name: "{{validate-identity.legal_name}}"
            - name: create-client
              type: call
              call: "salesforce.create-account"
              with:
                name: "{{validate-identity.legal_name}}"
                kyc_status: "{{screen-sanctions.result}}"
            - name: notify
              type: call
              call: "slack.send-message"
              with:
                channel: "client-onboarding"
                text: "KYC complete for {{resource_id}}: {{screen-sanctions.result}}"

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abn-amro.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Triggers portfolio rebalancing based on drift analysis, executes trades, updates positions, generates client reports, and notifies advisors.

naftiko: "0.5"
info:
  label: "Client Portfolio Rebalancing Pipeline"
  description: "Triggers portfolio rebalancing based on drift analysis, executes trades, updates positions, generates client reports, and notifies advisors."
  tags:
    - wealth-management
    - portfolio
    - snowflake
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: wealth-management
      port: 8080
      tools:
        - name: client_portfolio_rebalancing_pipeline
          description: "Orchestrate client portfolio rebalancing pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Aggregates client information from Salesforce CRM, Bloomberg financial data, and Snowflake transaction history to produce a unified 360-degree view for relationship managers.

naftiko: "0.5"
info:
  label: "Client Relationship 360 View"
  description: "Aggregates client information from Salesforce CRM, Bloomberg financial data, and Snowflake transaction history to produce a unified 360-degree view for relationship managers."
  tags:
    - client-management
    - crm
    - salesforce
    - bloomberg
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: client-360
      port: 8080
      tools:
        - name: get-client-360
          description: "Given a client Salesforce ID, aggregate CRM data, Bloomberg financials, and transaction history into a unified view."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The Salesforce account ID for the client."
          steps:
            - name: get-crm-data
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{client_id}}"
            - name: get-financials
              type: call
              call: "bloomberg.get-company"
              with:
                company_name: "{{get-crm-data.name}}"
            - name: get-transactions
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "CRM_WH"
                database: "CLIENT_DB"
                query: "SELECT product_type, SUM(volume) as total_volume, COUNT(*) as txn_count FROM client_transactions WHERE client_id = '{{client_id}}' AND txn_date >= DATEADD(month, -12, CURRENT_DATE()) GROUP BY product_type"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abnamro.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: companies
          path: "/companies/search"
          operations:
            - name: get-company
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Scans Azure and AWS configurations, validates against CIS benchmarks, creates findings in Jira, and notifies cloud security team.

naftiko: "0.5"
info:
  label: "Cloud Security Posture Assessment"
  description: "Scans Azure and AWS configurations, validates against CIS benchmarks, creates findings in Jira, and notifies cloud security team."
  tags:
    - security
    - cloud
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: cloud_security_posture_assessment
          description: "Orchestrate cloud security posture assessment workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Orchestrates collateral valuation by pulling positions from the core banking system, fetching market prices from Bloomberg, computing haircuts via Databricks, and updating the collateral management system in Snowflake.

naftiko: "0.5"
info:
  label: "Collateral Valuation Pipeline"
  description: "Orchestrates collateral valuation by pulling positions from the core banking system, fetching market prices from Bloomberg, computing haircuts via Databricks, and updating the collateral management system in Snowflake."
  tags:
    - collateral-management
    - risk-management
    - bloomberg
    - databricks
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: collateral
      port: 8080
      tools:
        - name: revalue-collateral
          description: "Given a collateral pool ID and valuation date, revalue all positions using market data and apply regulatory haircuts."
          inputParameters:
            - name: pool_id
              in: body
              type: string
              description: "The collateral pool identifier."
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date in YYYY-MM-DD format."
          steps:
            - name: get-positions
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "COLLATERAL_WH"
                database: "COLLATERAL_DB"
                query: "SELECT security_id, quantity, collateral_type FROM collateral_positions WHERE pool_id = '{{pool_id}}'"
            - name: get-market-prices
              type: call
              call: "bloomberg.get-bulk-prices"
              with:
                securities: "{{get-positions.security_ids}}"
                date: "{{valuation_date}}"
            - name: compute-haircuts
              type: call
              call: "databricks.run-job"
              with:
                job_id: "collateral-haircut-model"
                parameters:
                  pool_id: "{{pool_id}}"
                  valuation_date: "{{valuation_date}}"
            - name: update-valuations
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "COLLATERAL_WH"
                database: "COLLATERAL_DB"
                query: "CALL sp_update_collateral_valuations('{{pool_id}}', '{{valuation_date}}')"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: bulk-prices
          path: "/market/prices/bulk"
          operations:
            - name: get-bulk-prices
              method: POST
    - type: http
      namespace: databricks
      baseUri: "https://adb-abnamro.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST

Searches ABN AMRO Confluence knowledge base for articles matching a query.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Search"
  description: "Searches ABN AMRO Confluence knowledge base for articles matching a query."
  tags:
    - collaboration
    - confluence
    - knowledge-base
capability:
  exposes:
    - type: mcp
      namespace: collaboration
      port: 8080
      tools:
        - name: search-articles
          description: "Search Confluence articles by query."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The search_query to look up." 
          call: "confluence.get-search_query"
          with:
            search_query: "{{search_query}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://abn-amro.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence_knowledge_search
              method: GET

Processes corporate actions for portfolio adjustments, updates positions in trading systems, reconciles in Snowflake, and notifies portfolio managers.

naftiko: "0.5"
info:
  label: "Corporate Action Processing Pipeline"
  description: "Processes corporate actions for portfolio adjustments, updates positions in trading systems, reconciles in Snowflake, and notifies portfolio managers."
  tags:
    - trading
    - corporate-actions
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trading
      port: 8080
      tools:
        - name: corporate_action_processing_pipeline
          description: "Orchestrate corporate action processing pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Monitors corporate lending covenant compliance by pulling financial ratios from Snowflake, comparing against covenant thresholds, and alerting the credit team via Jira and Microsoft Teams when breaches are detected.

naftiko: "0.5"
info:
  label: "Corporate Lending Covenant Monitoring"
  description: "Monitors corporate lending covenant compliance by pulling financial ratios from Snowflake, comparing against covenant thresholds, and alerting the credit team via Jira and Microsoft Teams when breaches are detected."
  tags:
    - lending
    - credit-risk
    - covenant-monitoring
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lending-covenants
      port: 8080
      tools:
        - name: check-covenant-compliance
          description: "Given a facility ID and reporting date, check covenant compliance and alert on breaches."
          inputParameters:
            - name: facility_id
              in: body
              type: string
              description: "The lending facility identifier."
            - name: reporting_date
              in: body
              type: string
              description: "The covenant test date in YYYY-MM-DD format."
            - name: borrower_name
              in: body
              type: string
              description: "The borrower legal entity name."
          steps:
            - name: get-financial-ratios
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "LENDING_WH"
                database: "LENDING_DB"
                query: "SELECT covenant_type, actual_value, threshold_value, CASE WHEN actual_value > threshold_value THEN 'BREACH' ELSE 'COMPLIANT' END as status FROM covenant_monitoring WHERE facility_id = '{{facility_id}}' AND test_date = '{{reporting_date}}'"
            - name: create-breach-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "CREDIT"
                issuetype: "Task"
                summary: "[Covenant Check] {{borrower_name}} — {{facility_id}} — {{reporting_date}}"
                description: "Covenant compliance check for {{borrower_name}} ({{facility_id}}) as of {{reporting_date}}.\nResults: {{get-financial-ratios.row_count}} covenants tested.\nReview financial ratios and escalate any breaches."
            - name: notify-credit-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "credit-monitoring"
                text: "Covenant check complete: {{borrower_name}} ({{facility_id}}) — {{reporting_date}}. Jira: {{create-breach-ticket.key}}. Review results for potential breaches."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abnamro.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Receives credit application, runs scoring model in Snowflake, checks exposure limits, generates decision in ServiceNow, and notifies the credit committee.

naftiko: "0.5"
info:
  label: "Credit Decision Engine Pipeline"
  description: "Receives credit application, runs scoring model in Snowflake, checks exposure limits, generates decision in ServiceNow, and notifies the credit committee."
  tags:
    - credit
    - lending
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: credit
      port: 8080
      tools:
        - name: credit_decision_engine_pipeline
          description: "Orchestrate credit decision engine pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-application
              type: call
              call: "lending.get-credit-app"
              with:
                app_id: "{{resource_id}}"
            - name: run-scoring
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "CALL credit_score('{{resource_id}}')"
                warehouse: "CREDIT_WH"
            - name: create-decision
              type: call
              call: "servicenow.create-record"
              with:
                table: "credit_decisions"
                app_id: "{{resource_id}}"
                score: "{{run-scoring.score}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "credit-committee"
                text: "Credit decision for {{resource_id}}: Score {{run-scoring.score}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abn-amro.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Pulls credit exposure data from Snowflake, aggregates by counterparty, and publishes a summary dashboard refresh to Power BI for the risk management team.

naftiko: "0.5"
info:
  label: "Credit Risk Exposure Report"
  description: "Pulls credit exposure data from Snowflake, aggregates by counterparty, and publishes a summary dashboard refresh to Power BI for the risk management team."
  tags:
    - risk-management
    - credit-risk
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: risk-credit
      port: 8080
      tools:
        - name: refresh-credit-exposure
          description: "Given a reporting date and portfolio segment, query Snowflake for exposure data and trigger a Power BI dataset refresh."
          inputParameters:
            - name: reporting_date
              in: body
              type: string
              description: "The reporting date in YYYY-MM-DD format."
            - name: portfolio_segment
              in: body
              type: string
              description: "Portfolio segment: corporate, retail, or sme."
          steps:
            - name: query-exposures
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "RISK_WH"
                database: "RISK_DB"
                query: "SELECT counterparty, SUM(exposure) as total_exposure, MAX(pd) as max_pd FROM credit_exposures WHERE report_date = '{{reporting_date}}' AND segment = '{{portfolio_segment}}' GROUP BY counterparty ORDER BY total_exposure DESC"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "risk-management-workspace"
                dataset_id: "credit-exposure-daily"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Receives complaint from Zendesk, enriches with client history from Salesforce, creates resolution workflow in ServiceNow, and sends response via email.

naftiko: "0.5"
info:
  label: "Customer Complaint Resolution Pipeline"
  description: "Receives complaint from Zendesk, enriches with client history from Salesforce, creates resolution workflow in ServiceNow, and sends response via email."
  tags:
    - customer-service
    - zendesk
    - salesforce
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: customer-service
      port: 8080
      tools:
        - name: customer_complaint_resolution_pipeline
          description: "Orchestrate customer complaint resolution pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-complaint
              type: call
              call: "zendesk.get-ticket"
              with:
                ticket_id: "{{resource_id}}"
            - name: get-history
              type: call
              call: "salesforce.get-client-history"
              with:
                client_id: "{{get-complaint.client_id}}"
            - name: create-resolution
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Complaint resolution: {{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "client-service"
                text: "Complaint {{resource_id}} resolution started. Client: {{get-history.name}}"

  consumes:
    - type: http
      namespace: zendesk
      baseUri: "https://abn-amro.zendesk.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.zendesk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: zendesk-op
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://abn-amro.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Audits data catalog completeness, validates data classifications, creates remediation tasks, and notifies data stewards.

naftiko: "0.5"
info:
  label: "Data Catalog Governance Pipeline"
  description: "Audits data catalog completeness, validates data classifications, creates remediation tasks, and notifies data stewards."
  tags:
    - data-governance
    - catalog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: data_catalog_governance_pipeline
          description: "Orchestrate data catalog governance pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Traces data lineage from Snowflake, identifies downstream dependencies in Alation catalog, assesses impact of schema changes, creates change requests in ServiceNow.

naftiko: "0.5"
info:
  label: "Data Lineage Impact Analyzer"
  description: "Traces data lineage from Snowflake, identifies downstream dependencies in Alation catalog, assesses impact of schema changes, creates change requests in ServiceNow."
  tags:
    - data-governance
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: data_lineage_impact_analyzer
          description: "Orchestrate data lineage impact analyzer workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-lineage
              type: call
              call: "snowflake.get-lineage"
              with:
                table: "{{resource_id}}"
            - name: get-dependencies
              type: call
              call: "alation.get-downstream"
              with:
                table: "{{resource_id}}"
            - name: create-change
              type: call
              call: "servicenow.create-change"
              with:
                short_description: "Schema change impact: {{resource_id}}"
                downstream_count: "{{get-dependencies.count}}"
            - name: notify
              type: call
              call: "slack.send-message"
              with:
                channel: "data-eng"
                text: "Impact analysis for {{resource_id}}: {{get-dependencies.count}} downstream consumers"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abn-amro.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

When a Datadog monitor triggers a critical alert for a banking service, creates a Jira incident ticket and posts a notification to the engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Alert to Jira Incident"
  description: "When a Datadog monitor triggers a critical alert for a banking service, creates a Jira incident ticket and posts a notification to the engineering Microsoft Teams channel."
  tags:
    - observability
    - incident-management
    - datadog
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: handle-datadog-alert
          description: "Given a Datadog alert ID, create a Jira incident and notify the engineering team in Microsoft Teams."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Datadog monitor alert ID."
            - name: service_name
              in: body
              type: string
              description: "The affected banking service name."
            - name: severity
              in: body
              type: string
              description: "Alert severity: critical, warning, or info."
          steps:
            - name: get-alert-details
              type: call
              call: "datadog.get-monitor"
              with:
                monitor_id: "{{alert_id}}"
            - name: create-incident
              type: call
              call: "jira.create-issue"
              with:
                project_key: "INC"
                issuetype: "Incident"
                summary: "[{{severity}}] {{service_name}} — {{get-alert-details.name}}"
                description: "Datadog alert {{alert_id}} triggered.\nService: {{service_name}}\nSeverity: {{severity}}\nMessage: {{get-alert-details.message}}\nMonitor URL: {{get-alert-details.url}}"
                priority: "{{severity}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "platform-engineering-alerts"
                text: "Incident Created: {{create-incident.key}} | {{service_name}} | {{severity}} | {{get-alert-details.name}} | Jira: {{create-incident.url}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.eu/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://abnamro.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves the service dependency map from Datadog for ABN AMRO microservices.

naftiko: "0.5"
info:
  label: "Datadog Service Map Lookup"
  description: "Retrieves the service dependency map from Datadog for ABN AMRO microservices."
  tags:
    - observability
    - datadog
    - service-map
capability:
  exposes:
    - type: mcp
      namespace: observability
      port: 8080
      tools:
        - name: get-service-map
          description: "Get Datadog service map for a service."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The service_name to look up." 
          call: "datadog.get-service_name"
          with:
            service_name: "{{service_name}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog_service_map_lookup
              method: GET

Calculates derivatives portfolio risk metrics by extracting positions from Snowflake, computing Greeks and VaR via Databricks ML models, publishing to Power BI, and alerting the risk desk when thresholds are breached.

naftiko: "0.5"
info:
  label: "Derivatives Risk Calculation Pipeline"
  description: "Calculates derivatives portfolio risk metrics by extracting positions from Snowflake, computing Greeks and VaR via Databricks ML models, publishing to Power BI, and alerting the risk desk when thresholds are breached."
  tags:
    - risk-management
    - derivatives
    - trading
    - snowflake
    - databricks
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: risk-derivatives
      port: 8080
      tools:
        - name: calculate-derivatives-risk
          description: "Given a portfolio and valuation date, compute Greeks and VaR for the derivatives book and alert on threshold breaches."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The derivatives portfolio identifier."
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date in YYYY-MM-DD format."
            - name: var_confidence
              in: body
              type: string
              description: "VaR confidence level: 95 or 99."
          steps:
            - name: extract-positions
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "RISK_WH"
                database: "DERIVATIVES_DB"
                query: "SELECT * FROM derivatives_positions WHERE portfolio_id = '{{portfolio_id}}' AND position_date = '{{valuation_date}}'"
            - name: compute-risk
              type: call
              call: "databricks.run-job"
              with:
                job_id: "derivatives-risk-engine"
                parameters:
                  portfolio_id: "{{portfolio_id}}"
                  valuation_date: "{{valuation_date}}"
                  confidence: "{{var_confidence}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "trading-risk-workspace"
                dataset_id: "derivatives-risk-daily"
            - name: alert-risk-desk
              type: call
              call: "msteams.send-message"
              with:
                channel: "trading-risk-alerts"
                text: "Derivatives risk calculation complete: Portfolio {{portfolio_id}} for {{valuation_date}}. VaR({{var_confidence}}%): {{compute-risk.var_amount}}. Delta: {{compute-risk.total_delta}}. Gamma: {{compute-risk.total_gamma}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: databricks
      baseUri: "https://adb-abnamro.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Tracks digital banking user flows, identifies friction points in Snowflake, creates improvement tasks in Jira, and notifies product.

naftiko: "0.5"
info:
  label: "Digital Banking User Journey Analyzer"
  description: "Tracks digital banking user flows, identifies friction points in Snowflake, creates improvement tasks in Jira, and notifies product."
  tags:
    - digital-banking
    - analytics
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: digital-banking
      port: 8080
      tools:
        - name: digital_banking_user_journey_analyzer
          description: "Orchestrate digital banking user journey analyzer workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Detects digital banking incidents via monitoring, creates war room in Teams, gathers diagnostics from Splunk, and coordinates resolution.

naftiko: "0.5"
info:
  label: "Digital Channel Incident Response"
  description: "Detects digital banking incidents via monitoring, creates war room in Teams, gathers diagnostics from Splunk, and coordinates resolution."
  tags:
    - incident-response
    - digital
    - splunk
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: digital_channel_incident_response
          description: "Orchestrate digital channel incident response workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Queries Dynatrace for application performance metrics, compares against historical baselines in Snowflake, and creates a Jira performance ticket when degradation is detected.

naftiko: "0.5"
info:
  label: "Dynatrace Performance Baseline Comparison"
  description: "Queries Dynatrace for application performance metrics, compares against historical baselines in Snowflake, and creates a Jira performance ticket when degradation is detected."
  tags:
    - observability
    - performance
    - dynatrace
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: observability-metrics
      port: 8080
      tools:
        - name: check-performance-baseline
          description: "Query Dynatrace for metrics, compare against Snowflake baselines, and create a Jira ticket on degradation."
          inputParameters:
            - name: entity_id
              in: body
              type: string
              description: "The Dynatrace entity ID of the service."
            - name: service_name
              in: body
              type: string
              description: "Human-readable service name."
            - name: time_range
              in: body
              type: string
              description: "Time range for metrics (e.g., last2h, last24h, last7d)."
          steps:
            - name: get-current-metrics
              type: call
              call: "dynatrace.get-metrics"
              with:
                entity_id: "{{entity_id}}"
                time_range: "{{time_range}}"
            - name: get-baseline
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "OPS_WH"
                database: "OBSERVABILITY_DB"
                query: "SELECT avg_response_time, avg_error_rate, p95_response_time FROM service_baselines WHERE entity_id = '{{entity_id}}'"
            - name: create-perf-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "PERF"
                issuetype: "Task"
                summary: "[Performance] {{service_name}} — baseline deviation"
                description: "Service: {{service_name}} ({{entity_id}})\nCurrent response time: {{get-current-metrics.response_time_ms}}ms\nBaseline: {{get-baseline.avg_response_time}}ms\nCurrent error rate: {{get-current-metrics.error_rate}}%\nBaseline error rate: {{get-baseline.avg_error_rate}}%"
  consumes:
    - type: http
      namespace: dynatrace
      baseUri: "https://abnamro.live.dynatrace.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.dynatrace_token"
      resources:
        - name: metrics
          path: "/metrics/query?entityId={{entity_id}}&from={{time_range}}"
          inputParameters:
            - name: entity_id
              in: query
            - name: time_range
              in: query
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abnamro.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Searches Elasticsearch for application logs by service name and time range, returning matching log entries for troubleshooting banking system issues.

naftiko: "0.5"
info:
  label: "Elasticsearch Log Search"
  description: "Searches Elasticsearch for application logs by service name and time range, returning matching log entries for troubleshooting banking system issues."
  tags:
    - observability
    - logging
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: log-search
      port: 8080
      tools:
        - name: search-logs
          description: "Search Elasticsearch logs by service name and time range. Returns matching log entries."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The service name to search logs for."
            - name: time_range
              in: body
              type: string
              description: "Time range (e.g., 1h, 6h, 24h)."
            - name: log_level
              in: body
              type: string
              description: "Log level filter: ERROR, WARN, INFO, DEBUG."
          call: "elasticsearch.search"
          with:
            index: "logs-{{service_name}}-*"
            query: "level:{{log_level}} AND @timestamp:[now-{{time_range}} TO now]"
          outputParameters:
            - name: hit_count
              type: string
              mapping: "$.hits.total.value"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://es.abnamro.com:9200"
      authentication:
        type: basic
        username: "$secrets.elasticsearch_user"
        password: "$secrets.elasticsearch_password"
      resources:
        - name: search
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search
              method: POST

Searches ABN AMRO transaction logs in Elasticsearch by criteria.

naftiko: "0.5"
info:
  label: "Elasticsearch Transaction Search"
  description: "Searches ABN AMRO transaction logs in Elasticsearch by criteria."
  tags:
    - data
    - elasticsearch
    - transactions
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: search-transactions
          description: "Search transactions by query."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The search_query to look up." 
          call: "elasticsearch.get-search_query"
          with:
            search_query: "{{search_query}}"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://abn-amro-es.com:9200"
      authentication:
        type: bearer
        token: "$secrets.elasticsearch_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: elasticsearch_transaction_sear
              method: GET

On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions Azure Active Directory account, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "Employee Onboarding Orchestrator"
  description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions Azure Active Directory account, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - azure-active-directory
    - 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 onboarding across ServiceNow, Azure AD, and Microsoft Teams."
          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 employee start date in YYYY-MM-DD format."
            - name: department
              in: body
              type: string
              description: "The department the new hire is joining."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                category: "hr_onboarding"
                assigned_group: "IT_Onboarding"
                description: "Onboarding for {{get-employee.full_name}} starting {{start_date}} in {{department}}."
            - name: provision-account
              type: call
              call: "azuread.create-user"
              with:
                display_name: "{{get-employee.full_name}}"
                user_principal_name: "{{get-employee.work_email}}"
                department: "{{department}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to ABN AMRO, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}. Your Azure AD account has been provisioned."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd3-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://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

On role change in Workday, updates SailPoint access, modifies Okta groups, adjusts ServiceNow assignments, and notifies the employee and manager.

naftiko: "0.5"
info:
  label: "Employee Role Transfer Orchestrator"
  description: "On role change in Workday, updates SailPoint access, modifies Okta groups, adjusts ServiceNow assignments, and notifies the employee and manager."
  tags:
    - hr
    - workday
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: employee_role_transfer_orchestrator
          description: "Orchestrate employee role transfer orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-transfer
              type: call
              call: "workday.get-transfer"
              with:
                transfer_id: "{{resource_id}}"
            - name: update-access
              type: call
              call: "sailpoint.update-roles"
              with:
                user_id: "{{get-transfer.employee_id}}"
                new_role: "{{get-transfer.new_role}}"
            - name: update-tickets
              type: call
              call: "servicenow.update-assignments"
              with:
                employee_id: "{{get-transfer.employee_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "hr-ops"
                text: "Transfer {{resource_id}} processed for {{get-transfer.employee_name}}"

  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/abn-amro"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Monitors employee personal trading activity, validates against restricted lists, creates compliance cases, and notifies compliance officer.

naftiko: "0.5"
info:
  label: "Employee Trading Compliance Monitor"
  description: "Monitors employee personal trading activity, validates against restricted lists, creates compliance cases, and notifies compliance officer."
  tags:
    - compliance
    - employee-trading
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: employee_trading_compliance_monitor
          description: "Orchestrate employee trading compliance monitor workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

When a critical banking service goes down, sends mass notifications via Everbridge to affected stakeholders and creates a ServiceNow major incident record.

naftiko: "0.5"
info:
  label: "Everbridge Mass Notification for IT Incidents"
  description: "When a critical banking service goes down, sends mass notifications via Everbridge to affected stakeholders and creates a ServiceNow major incident record."
  tags:
    - incident-management
    - business-continuity
    - everbridge
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: crisis-management
      port: 8080
      tools:
        - name: trigger-mass-notification
          description: "Given an incident description and impacted service, send Everbridge notifications, create a ServiceNow major incident, and post to Teams."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The name of the impacted banking service."
            - name: incident_summary
              in: body
              type: string
              description: "Brief description of the incident."
            - name: severity
              in: body
              type: string
              description: "Incident severity: P1, P2, P3."
            - name: contact_group
              in: body
              type: string
              description: "The Everbridge contact group to notify."
          steps:
            - name: send-notification
              type: call
              call: "everbridge.send-notification"
              with:
                notification_type: "Standard"
                subject: "[{{severity}}] {{service_name}} — Service Disruption"
                body: "{{incident_summary}}"
                contact_group: "{{contact_group}}"
            - name: create-major-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "[{{severity}}] {{service_name}} — {{incident_summary}}"
                impact: "1"
                urgency: "1"
                assigned_group: "Major_Incident_Management"
                category: "service_disruption"
            - name: post-to-teams
              type: call
              call: "msteams.send-message"
              with:
                channel: "major-incidents"
                text: "MAJOR INCIDENT: {{severity}} | {{service_name}} | {{incident_summary}} | ServiceNow: {{create-major-incident.number}} | Everbridge notification sent to {{contact_group}}"
  consumes:
    - type: http
      namespace: everbridge
      baseUri: "https://api.everbridge.net/rest"
      authentication:
        type: bearer
        token: "$secrets.everbridge_token"
      resources:
        - name: notifications
          path: "/notifications"
          operations:
            - name: send-notification
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

When a real-time fraud detection model flags a suspicious transaction in Snowflake, enriches the alert with customer data from Salesforce, blocks the card via Mastercard API, and notifies the fraud operations team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Fraud Detection Alert Pipeline"
  description: "When a real-time fraud detection model flags a suspicious transaction in Snowflake, enriches the alert with customer data from Salesforce, blocks the card via Mastercard API, and notifies the fraud operations team in Microsoft Teams."
  tags:
    - fraud-detection
    - security
    - snowflake
    - salesforce
    - mastercard
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fraud-ops
      port: 8080
      tools:
        - name: handle-fraud-alert
          description: "Given a fraud alert ID, enrich with customer data, optionally block the card, and notify fraud ops."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The fraud detection alert ID from the ML pipeline."
            - name: customer_id
              in: body
              type: string
              description: "The Salesforce customer account ID."
            - name: card_number_token
              in: body
              type: string
              description: "Tokenized card number for Mastercard API."
            - name: block_card
              in: body
              type: string
              description: "Whether to block the card: true or false."
          steps:
            - name: get-alert-data
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "FRAUD_WH"
                database: "FRAUD_DB"
                query: "SELECT * FROM fraud_alerts WHERE alert_id = '{{alert_id}}'"
            - name: get-customer
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{customer_id}}"
            - name: block-card
              type: call
              call: "mastercard.block-card"
              with:
                card_token: "{{card_number_token}}"
                reason: "fraud_suspected"
            - name: notify-fraud-ops
              type: call
              call: "msteams.send-message"
              with:
                channel: "fraud-operations"
                text: "Fraud Alert: {{alert_id}} | Customer: {{get-customer.name}} | Card blocked: {{block_card}} | Transaction details from Snowflake query. Review immediately."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://abnamro.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: mastercard
      baseUri: "https://api.mastercard.com/fraud/v1"
      authentication:
        type: bearer
        token: "$secrets.mastercard_token"
      resources:
        - name: cards
          path: "/cards/block"
          operations:
            - name: block-card
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

On fraud alert, collects transaction history from core banking, enriches with customer profile from Salesforce, creates investigation in ServiceNow, and escalates via PagerDuty.

naftiko: "0.5"
info:
  label: "Fraud Investigation Workflow"
  description: "On fraud alert, collects transaction history from core banking, enriches with customer profile from Salesforce, creates investigation in ServiceNow, and escalates via PagerDuty."
  tags:
    - fraud
    - investigation
    - salesforce
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: fraud
      port: 8080
      tools:
        - name: fraud_investigation_workflow
          description: "Orchestrate fraud investigation workflow workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-transactions
              type: call
              call: "corebanking.get-history"
              with:
                account_id: "{{resource_id}}"
            - name: get-profile
              type: call
              call: "salesforce.get-customer"
              with:
                account_id: "{{resource_id}}"
            - name: create-investigation
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Fraud investigation: {{resource_id}}"
            - name: escalate
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Fraud alert: {{resource_id}} - {{get-profile.name}}"

  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abn-amro.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: salesforce-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty-op
              method: POST

Monitors FX hedging positions, calculates effectiveness in Snowflake, generates reports, creates alerts for breaches, and notifies treasury.

naftiko: "0.5"
info:
  label: "FX Hedging Position Monitor"
  description: "Monitors FX hedging positions, calculates effectiveness in Snowflake, generates reports, creates alerts for breaches, and notifies treasury."
  tags:
    - fx
    - hedging
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fx
      port: 8080
      tools:
        - name: fx_hedging_position_monitor
          description: "Orchestrate fx hedging position monitor workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Executes a foreign exchange spot trade through Reuters, validates the rate against Bloomberg market data, books the trade in the core banking system, and confirms execution to the trader via Microsoft Teams.

naftiko: "0.5"
info:
  label: "FX Spot Trade Execution"
  description: "Executes a foreign exchange spot trade through Reuters, validates the rate against Bloomberg market data, books the trade in the core banking system, and confirms execution to the trader via Microsoft Teams."
  tags:
    - trading
    - foreign-exchange
    - reuters
    - bloomberg
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trading-fx
      port: 8080
      tools:
        - name: execute-fx-spot
          description: "Given a currency pair and notional, validate the rate, execute on Reuters, book internally, and confirm to the trader."
          inputParameters:
            - name: currency_pair
              in: body
              type: string
              description: "Currency pair (e.g., EUR/USD)."
            - name: direction
              in: body
              type: string
              description: "Trade direction: buy or sell (base currency)."
            - name: notional
              in: body
              type: number
              description: "Notional amount in base currency."
            - name: trader_upn
              in: body
              type: string
              description: "The UPN of the executing trader."
          steps:
            - name: get-market-rate
              type: call
              call: "bloomberg.get-fx-rate"
              with:
                currency_pair: "{{currency_pair}}"
            - name: execute-trade
              type: call
              call: "reuters.execute-fx-spot"
              with:
                currency_pair: "{{currency_pair}}"
                direction: "{{direction}}"
                notional: "{{notional}}"
            - name: book-trade
              type: call
              call: "core-banking.book-fx-trade"
              with:
                trade_id: "{{execute-trade.trade_id}}"
                currency_pair: "{{currency_pair}}"
                rate: "{{execute-trade.executed_rate}}"
                notional: "{{notional}}"
                direction: "{{direction}}"
            - name: confirm-trader
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{trader_upn}}"
                text: "FX Spot executed: {{direction}} {{notional}} {{currency_pair}} at {{execute-trade.executed_rate}}. Trade ID: {{execute-trade.trade_id}}. Booked: {{book-trade.booking_ref}}. Settlement: {{execute-trade.value_date}}."
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: fx-rates
          path: "/market/fx/{{currency_pair}}"
          inputParameters:
            - name: currency_pair
              in: path
          operations:
            - name: get-fx-rate
              method: GET
    - type: http
      namespace: reuters
      baseUri: "https://api.refinitiv.com/trading/fx/v1"
      authentication:
        type: bearer
        token: "$secrets.reuters_token"
      resources:
        - name: spot-orders
          path: "/spot/execute"
          operations:
            - name: execute-fx-spot
              method: POST
    - type: http
      namespace: core-banking
      baseUri: "https://api.abnamro.com/v1/trading"
      authentication:
        type: bearer
        token: "$secrets.core_banking_token"
      resources:
        - name: fx-bookings
          path: "/fx/book"
          operations:
            - name: book-fx-trade
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Processes a GDPR data subject access request by searching for personal data across Salesforce, Snowflake, and ServiceNow, compiling results, and creating a Jira task for the DPO team to review and respond.

naftiko: "0.5"
info:
  label: "GDPR Data Subject Access Request Pipeline"
  description: "Processes a GDPR data subject access request by searching for personal data across Salesforce, Snowflake, and ServiceNow, compiling results, and creating a Jira task for the DPO team to review and respond."
  tags:
    - privacy
    - gdpr
    - data-protection
    - salesforce
    - snowflake
    - servicenow
    - jira
capability:
  exposes:
    - type: mcp
      namespace: privacy-gdpr
      port: 8080
      tools:
        - name: process-dsar
          description: "Given a data subject email and request type, search for personal data across systems and create a review task."
          inputParameters:
            - name: subject_email
              in: body
              type: string
              description: "The email address of the data subject."
            - name: request_type
              in: body
              type: string
              description: "DSAR type: access, erasure, portability, or rectification."
            - name: request_reference
              in: body
              type: string
              description: "The DSAR reference number."
          steps:
            - name: search-crm
              type: call
              call: "salesforce.search-contacts"
              with:
                email: "{{subject_email}}"
            - name: search-data-warehouse
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "PRIVACY_WH"
                database: "CUSTOMER_DB"
                query: "SELECT data_category, record_count, last_updated FROM data_inventory WHERE email = '{{subject_email}}'"
            - name: search-itsm
              type: call
              call: "servicenow.search-records"
              with:
                table: "sys_user"
                query: "email={{subject_email}}"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "PRIVACY"
                issuetype: "Task"
                summary: "[DSAR] {{request_type}} — {{subject_email}} — {{request_reference}}"
                description: "DSAR {{request_type}} request {{request_reference}}.\nSubject: {{subject_email}}\nSalesforce records: {{search-crm.total_size}}\nSnowflake categories found: {{search-data-warehouse.row_count}}\nServiceNow records: {{search-itsm.count}}\nDeadline: 30 days from request receipt."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abnamro.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/parameterizedSearch/?q={{email}}&sobject=Contact&Contact.fields=Id,Name,Email"
          inputParameters:
            - name: email
              in: query
          operations:
            - name: search-contacts
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}?sysparm_query={{query}}"
          inputParameters:
            - name: table
              in: path
            - name: query
              in: query
          operations:
            - name: search-records
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://abnamro.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Checks the review status and approval state of a GitHub pull request.

naftiko: "0.5"
info:
  label: "GitHub PR Review Status"
  description: "Checks the review status and approval state of a GitHub pull request."
  tags:
    - devops
    - github
    - code-review
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-pr-status
          description: "Get PR review status by number."
          inputParameters:
            - name: pr_number
              in: body
              type: string
              description: "The pr_number to look up." 
          call: "github.get-pr_number"
          with:
            pr_number: "{{pr_number}}"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: github_pr_review_status
              method: GET

Retrieves the status of a GitHub pull request including checks, review status, and merge readiness for banking application repositories.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Status"
  description: "Retrieves the status of a GitHub pull request including checks, review status, and merge readiness for banking application repositories."
  tags:
    - devops
    - code-review
    - github
capability:
  exposes:
    - type: mcp
      namespace: source-control
      port: 8080
      tools:
        - name: get-pr-status
          description: "Look up a GitHub pull request by repo and PR number. Returns status, checks, and review state."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format."
            - name: pr_number
              in: body
              type: string
              description: "The pull request number."
          call: "github.get-pull-request"
          with:
            repo: "{{repo}}"
            pr_number: "{{pr_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.state"
            - name: mergeable
              type: string
              mapping: "$.mergeable"
            - name: title
              type: string
              mapping: "$.title"
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pull-requests
          path: "/repos/{{repo}}/pulls/{{pr_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: get-pull-request
              method: GET

Retrieves the current status of Grafana alerts for ABN AMRO infrastructure monitoring.

naftiko: "0.5"
info:
  label: "Grafana Alert Status"
  description: "Retrieves the current status of Grafana alerts for ABN AMRO infrastructure monitoring."
  tags:
    - monitoring
    - grafana
    - alerting
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: get-alert-status
          description: "Get Grafana alert status by rule ID."
          inputParameters:
            - name: rule_id
              in: body
              type: string
              description: "The rule_id to look up." 
          call: "grafana.get-rule_id"
          with:
            rule_id: "{{rule_id}}"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://abn-amro-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana_alert_status
              method: GET

Deploys a Helm chart to Azure Kubernetes Service for banking microservices, triggers a SonarQube quality gate check beforehand, and notifies the platform team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Helm Chart Deployment to AKS"
  description: "Deploys a Helm chart to Azure Kubernetes Service for banking microservices, triggers a SonarQube quality gate check beforehand, and notifies the platform team in Microsoft Teams."
  tags:
    - devops
    - deployment
    - helm
    - azure-kubernetes-service
    - sonarqube
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: k8s-deploy
      port: 8080
      tools:
        - name: deploy-helm-chart
          description: "Given a chart name, version, and target namespace, validate quality gate, deploy to AKS, and notify the team."
          inputParameters:
            - name: chart_name
              in: body
              type: string
              description: "The Helm chart name."
            - name: chart_version
              in: body
              type: string
              description: "The Helm chart version to deploy."
            - name: k8s_namespace
              in: body
              type: string
              description: "The Kubernetes namespace to deploy into."
            - name: project_key
              in: body
              type: string
              description: "The SonarQube project key for quality gate verification."
          steps:
            - name: check-quality-gate
              type: call
              call: "sonarqube.get-quality-gate"
              with:
                project_key: "{{project_key}}"
            - name: deploy-chart
              type: call
              call: "azuredevops.run-pipeline"
              with:
                project: "banking-services"
                pipeline_id: "helm-deploy"
                variables:
                  chart: "{{chart_name}}"
                  version: "{{chart_version}}"
                  namespace: "{{k8s_namespace}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "platform-deployments"
                text: "Helm deploy: {{chart_name}}:{{chart_version}} to {{k8s_namespace}}. Quality gate: {{check-quality-gate.status}}. Pipeline run: {{deploy-chart.run_id}}."
  consumes:
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.abnamro.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status?projectKey={{project_key}}"
          inputParameters:
            - name: project_key
              in: query
          operations:
            - name: get-quality-gate
              method: GET
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/abnamro"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_token"
      resources:
        - name: pipelines
          path: "/{{project}}/_apis/pipelines/{{pipeline_id}}/runs?api-version=7.1"
          inputParameters:
            - name: project
              in: path
            - name: pipeline_id
              in: path
          operations:
            - name: run-pipeline
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

On P1 incident, creates a Teams channel, pulls recent deployments from GitHub, gathers logs from Splunk, creates a bridge call, and updates StatusPage.

naftiko: "0.5"
info:
  label: "Incident War Room Orchestrator"
  description: "On P1 incident, creates a Teams channel, pulls recent deployments from GitHub, gathers logs from Splunk, creates a bridge call, and updates StatusPage."
  tags:
    - incident-management
    - github
    - splunk
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-management
      port: 8080
      tools:
        - name: incident_war_room_orchestrator
          description: "Orchestrate incident war room orchestrator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-incident
              type: call
              call: "pagerduty.get-incident"
              with:
                incident_id: "{{resource_id}}"
            - name: get-deployments
              type: call
              call: "github.get-recent-deployments"
              with:
                repo: "{{get-incident.service}}"
            - name: get-logs
              type: call
              call: "splunk.search-logs"
              with:
                query: "{{get-incident.service}} error"
                time_range: "-1h"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "war-room"
                text: "P1: {{get-incident.title}}. Recent deploys: {{get-deployments.count}}. Errors: {{get-logs.count}}"

  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty-op
              method: POST
    - type: http
      namespace: github
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: github-op
              method: POST
    - type: http
      namespace: splunk
      baseUri: "https://abn-amro-splunk.com/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: splunk-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Triggers an Informatica data quality profiling job, stores quality scores in Snowflake for trend analysis, and alerts the data governance team in Microsoft Teams when quality thresholds are breached.

naftiko: "0.5"
info:
  label: "Informatica Data Quality Pipeline with Reporting"
  description: "Triggers an Informatica data quality profiling job, stores quality scores in Snowflake for trend analysis, and alerts the data governance team in Microsoft Teams when quality thresholds are breached."
  tags:
    - data-quality
    - data-management
    - informatica
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-quality-profile-with-reporting
          description: "Trigger Informatica quality profiling, store scores in Snowflake, and alert on threshold breaches."
          inputParameters:
            - name: task_name
              in: body
              type: string
              description: "The Informatica data quality task name."
            - name: data_domain
              in: body
              type: string
              description: "The data domain to profile (e.g., customer, transaction, risk)."
            - name: quality_threshold
              in: body
              type: number
              description: "Minimum acceptable quality score percentage."
          steps:
            - name: run-profiling
              type: call
              call: "informatica.start-quality-task"
              with:
                task_name: "{{task_name}}"
                data_domain: "{{data_domain}}"
            - name: store-results
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "DQ_WH"
                database: "DATA_QUALITY_DB"
                query: "INSERT INTO dq_scores (domain, task_name, run_id, score, profiled_at) VALUES ('{{data_domain}}', '{{task_name}}', '{{run-profiling.run_id}}', '{{run-profiling.quality_score}}', CURRENT_TIMESTAMP())"
            - name: notify-governance
              type: call
              call: "msteams.send-message"
              with:
                channel: "data-governance"
                text: "Data Quality: {{data_domain}} ({{task_name}}) | Run: {{run-profiling.run_id}} | Score: {{run-profiling.quality_score}}% | Threshold: {{quality_threshold}}%"
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://dm-eu.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: jobs
          path: "/job"
          operations:
            - name: start-quality-task
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Fetches yield curve data from Bloomberg, runs VaR calculations in Snowflake, generates risk report in Power BI, and notifies treasury via Teams.

naftiko: "0.5"
info:
  label: "Interest Rate Risk Calculator"
  description: "Fetches yield curve data from Bloomberg, runs VaR calculations in Snowflake, generates risk report in Power BI, and notifies treasury via Teams."
  tags:
    - risk
    - treasury
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: risk
      port: 8080
      tools:
        - name: interest_rate_risk_calculator
          description: "Orchestrate interest rate risk calculator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-yield-curve
              type: call
              call: "bloomberg.get-yield-curve"
              with:
                currency: "{{resource_id}}"
            - name: calculate-var
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "CALL calculate_var('{{resource_id}}')"
                warehouse: "RISK_WH"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "interest_rate_risk"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "treasury"
                text: "IR risk report updated for {{resource_id}}. VaR: {{calculate-var.var_amount}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abn-amro.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Validates proposed trades against investment guidelines, checks exposure limits in Snowflake, approves or blocks, and logs decisions.

naftiko: "0.5"
info:
  label: "Investment Compliance Pre-Trade Check"
  description: "Validates proposed trades against investment guidelines, checks exposure limits in Snowflake, approves or blocks, and logs decisions."
  tags:
    - compliance
    - trading
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: investment_compliance_pre_trade_check
          description: "Orchestrate investment compliance pre-trade check workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Validates change request in ServiceNow, runs pre-deployment tests, executes Terraform plan, monitors Datadog health, and sends post-change report.

naftiko: "0.5"
info:
  label: "IT Change Management Pipeline"
  description: "Validates change request in ServiceNow, runs pre-deployment tests, executes Terraform plan, monitors Datadog health, and sends post-change report."
  tags:
    - change-management
    - servicenow
    - datadog
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: change-management
      port: 8080
      tools:
        - name: it_change_management_pipeline
          description: "Orchestrate it change management pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-change
              type: call
              call: "servicenow.get-change"
              with:
                change_id: "{{resource_id}}"
            - name: run-tests
              type: call
              call: "postman.run-collection"
              with:
                collection_id: "pre_change_{{resource_id}}"
            - name: check-health
              type: call
              call: "datadog.get-monitors"
              with:
                tag: "change:{{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "change-mgmt"
                text: "Change {{resource_id}} executed. Health: {{check-health.status}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Retrieves a Jira issue by key, returning summary, status, assignee, and priority for project tracking.

naftiko: "0.5"
info:
  label: "Jira Issue Lookup"
  description: "Retrieves a Jira issue by key, returning summary, status, assignee, and priority for project tracking."
  tags:
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: project-tracking
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Look up a Jira issue by key. Returns summary, status, assignee, priority, and created date."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key (e.g., RISK-1234)."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
            - name: assignee
              type: string
              mapping: "$.fields.assignee.displayName"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://abnamro.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Retrieves the current sprint status and velocity for an ABN AMRO engineering team board.

naftiko: "0.5"
info:
  label: "Jira Sprint Status"
  description: "Retrieves the current sprint status and velocity for an ABN AMRO engineering team board."
  tags:
    - devops
    - jira
    - agile
capability:
  exposes:
    - type: mcp
      namespace: engineering
      port: 8080
      tools:
        - name: get-sprint
          description: "Get current sprint status by board ID."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "The board_id to look up." 
          call: "jira.get-board_id"
          with:
            board_id: "{{board_id}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://abn-amro.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira_sprint_status
              method: GET

Queries active user sessions in Keycloak, cross-references with Azure AD sign-in logs for anomalous locations, and creates a security incident in ServiceNow when suspicious sessions are detected.

naftiko: "0.5"
info:
  label: "Keycloak Suspicious Session Audit"
  description: "Queries active user sessions in Keycloak, cross-references with Azure AD sign-in logs for anomalous locations, and creates a security incident in ServiceNow when suspicious sessions are detected."
  tags:
    - identity-management
    - authentication
    - keycloak
    - azure-active-directory
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: identity-sessions
      port: 8080
      tools:
        - name: audit-user-sessions
          description: "List Keycloak sessions, check Azure AD sign-in logs for anomalies, and create a ServiceNow security incident if suspicious."
          inputParameters:
            - name: realm
              in: body
              type: string
              description: "The Keycloak realm name."
            - name: user_id
              in: body
              type: string
              description: "The Keycloak user ID."
            - name: user_principal_name
              in: body
              type: string
              description: "The user's Azure AD UPN for sign-in log lookup."
          steps:
            - name: get-sessions
              type: call
              call: "keycloak.get-sessions"
              with:
                realm: "{{realm}}"
                user_id: "{{user_id}}"
            - name: get-signin-logs
              type: call
              call: "azuread.get-signin-logs"
              with:
                user_principal_name: "{{user_principal_name}}"
            - name: create-security-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "[Session Audit] Suspicious activity — {{user_principal_name}}"
                description: "User: {{user_principal_name}}\nKeycloak sessions: {{get-sessions.session_count}}\nRecent sign-in locations: {{get-signin-logs.locations}}\nReview for potential account compromise."
                assigned_group: "Security_Operations_Center"
                category: "security_audit"
  consumes:
    - type: http
      namespace: keycloak
      baseUri: "https://auth.abnamro.com/admin/realms"
      authentication:
        type: bearer
        token: "$secrets.keycloak_admin_token"
      resources:
        - name: sessions
          path: "/{{realm}}/users/{{user_id}}/sessions"
          inputParameters:
            - name: realm
              in: path
            - name: user_id
              in: path
          operations:
            - name: get-sessions
              method: GET
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: signin-logs
          path: "/auditLogs/signIns?$filter=userPrincipalName eq '{{user_principal_name}}'&$top=10"
          inputParameters:
            - name: user_principal_name
              in: query
          operations:
            - name: get-signin-logs
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Performs Know Your Customer screening by querying Salesforce for client data, running sanctions checks against Bloomberg Enterprise Data, and logging results in ServiceNow for compliance audit.

naftiko: "0.5"
info:
  label: "KYC Customer Screening"
  description: "Performs Know Your Customer screening by querying Salesforce for client data, running sanctions checks against Bloomberg Enterprise Data, and logging results in ServiceNow for compliance audit."
  tags:
    - compliance
    - kyc
    - salesforce
    - bloomberg-enterprise-data
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance-kyc
      port: 8080
      tools:
        - name: screen-customer
          description: "Given a customer ID, retrieve Salesforce profile, check Bloomberg sanctions, and log screening outcome in ServiceNow."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Salesforce account ID for the customer."
            - name: screening_type
              in: body
              type: string
              description: "Type of screening: initial, periodic, or event-triggered."
          steps:
            - name: get-customer
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{customer_id}}"
            - name: check-sanctions
              type: call
              call: "bloomberg.search-sanctions"
              with:
                entity_name: "{{get-customer.name}}"
                country: "{{get-customer.billing_country}}"
            - name: log-screening
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_kyc_screening"
                short_description: "KYC {{screening_type}} screening: {{get-customer.name}}"
                description: "Customer: {{get-customer.name}} ({{customer_id}}). Sanctions result: {{check-sanctions.match_status}}. Score: {{check-sanctions.risk_score}}."
                assigned_group: "Compliance_KYC"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abnamro.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: sanctions
          path: "/sanctions/screen"
          operations:
            - name: search-sanctions
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Runs a liquidity stress test scenario by extracting positions from Snowflake, applying shock parameters, computing liquidity coverage ratio via Databricks, and publishing results to Power BI with compliance notification.

naftiko: "0.5"
info:
  label: "Liquidity Stress Test Orchestrator"
  description: "Runs a liquidity stress test scenario by extracting positions from Snowflake, applying shock parameters, computing liquidity coverage ratio via Databricks, and publishing results to Power BI with compliance notification."
  tags:
    - risk-management
    - liquidity
    - stress-testing
    - snowflake
    - databricks
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: risk-liquidity
      port: 8080
      tools:
        - name: run-liquidity-stress-test
          description: "Given a scenario name and stress parameters, run liquidity stress test across Snowflake and Databricks, publish results, and notify risk committee."
          inputParameters:
            - name: scenario_name
              in: body
              type: string
              description: "Stress scenario name (e.g., market_crash_2008, idiosyncratic_run)."
            - name: shock_severity
              in: body
              type: string
              description: "Shock severity: mild, moderate, or severe."
            - name: reporting_date
              in: body
              type: string
              description: "Reporting date in YYYY-MM-DD format."
          steps:
            - name: extract-positions
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "RISK_WH"
                database: "TREASURY_DB"
                query: "SELECT * FROM liquidity_positions WHERE report_date = '{{reporting_date}}'"
            - name: run-model
              type: call
              call: "databricks.run-job"
              with:
                job_id: "liquidity-stress-model"
                parameters:
                  scenario: "{{scenario_name}}"
                  severity: "{{shock_severity}}"
                  position_data: "{{extract-positions.statement_handle}}"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "risk-management-workspace"
                dataset_id: "liquidity-stress-results"
            - name: notify-risk-committee
              type: call
              call: "msteams.send-message"
              with:
                channel: "risk-committee"
                text: "Liquidity stress test complete: {{scenario_name}} ({{shock_severity}}) for {{reporting_date}}. Databricks run: {{run-model.run_id}}. Dashboard refreshed. Review results in Power BI."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: databricks
      baseUri: "https://adb-abnamro.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Orchestrates a new loan application by pulling applicant data from Salesforce, running credit scoring via Snowflake ML models, creating a ServiceNow case for underwriting review, and notifying the relationship manager in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Loan Application Processing Pipeline"
  description: "Orchestrates a new loan application by pulling applicant data from Salesforce, running credit scoring via Snowflake ML models, creating a ServiceNow case for underwriting review, and notifying the relationship manager in Microsoft Teams."
  tags:
    - lending
    - loan-origination
    - salesforce
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lending
      port: 8080
      tools:
        - name: process-loan-application
          description: "Given a loan application ID and applicant Salesforce ID, orchestrate credit scoring and underwriting workflow."
          inputParameters:
            - name: application_id
              in: body
              type: string
              description: "The loan application reference number."
            - name: applicant_id
              in: body
              type: string
              description: "The Salesforce account ID of the applicant."
            - name: loan_amount
              in: body
              type: number
              description: "Requested loan amount in EUR."
            - name: loan_type
              in: body
              type: string
              description: "Loan type: mortgage, corporate, sme, or consumer."
          steps:
            - name: get-applicant
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{applicant_id}}"
            - name: run-credit-score
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "LENDING_WH"
                database: "LENDING_DB"
                query: "SELECT credit_score, pd_estimate, lgd_estimate FROM ml_credit_scores WHERE customer_id = '{{applicant_id}}' ORDER BY scored_at DESC LIMIT 1"
            - name: create-case
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_loan_underwriting"
                short_description: "Loan underwriting: {{get-applicant.name}} — EUR {{loan_amount}}"
                description: "Application: {{application_id}}\nApplicant: {{get-applicant.name}}\nType: {{loan_type}}\nAmount: EUR {{loan_amount}}\nCredit score: {{run-credit-score.credit_score}}\nPD: {{run-credit-score.pd_estimate}}"
                assigned_group: "Underwriting_{{loan_type}}"
            - name: notify-rm
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-applicant.owner_email}}"
                text: "Loan application {{application_id}} for {{get-applicant.name}} (EUR {{loan_amount}}) is now in underwriting. Credit score: {{run-credit-score.credit_score}}. ServiceNow case: {{create-case.number}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abnamro.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Validates incoming market data feeds against expected patterns, identifies anomalies in Snowflake, creates alerts in PagerDuty, and logs quality metrics in Grafana.

naftiko: "0.5"
info:
  label: "Market Data Quality Monitor"
  description: "Validates incoming market data feeds against expected patterns, identifies anomalies in Snowflake, creates alerts in PagerDuty, and logs quality metrics in Grafana."
  tags:
    - market-data
    - quality
    - snowflake
    - pagerduty
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: market-data
      port: 8080
      tools:
        - name: market_data_quality_monitor
          description: "Orchestrate market data quality monitor workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: validate-feeds
              type: call
              call: "bloomberg.validate-feed"
              with:
                feed_id: "{{resource_id}}"
            - name: check-anomalies
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "CALL check_market_data_quality('{{resource_id}}')"
                warehouse: "MARKET_WH"
            - name: create-alert
              type: call
              call: "pagerduty.create-incident"
              with:
                title: "Market data quality: {{resource_id}}"
                severity: "{{check-anomalies.severity}}"
            - name: log-metrics
              type: call
              call: "grafana.push-metrics"
              with:
                dashboard_uid: "market-data-quality"
                quality_score: "{{check-anomalies.score}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abn-amro.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty-op
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://abn-amro-grafana.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_api_key" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: grafana-op
              method: POST

Computes daily Value-at-Risk across the trading book by pulling positions from Snowflake, running Monte Carlo simulation in Databricks, storing results, and publishing the risk report to Power BI with breach alerts.

naftiko: "0.5"
info:
  label: "Market Risk VaR Reporting Pipeline"
  description: "Computes daily Value-at-Risk across the trading book by pulling positions from Snowflake, running Monte Carlo simulation in Databricks, storing results, and publishing the risk report to Power BI with breach alerts."
  tags:
    - risk-management
    - market-risk
    - var
    - snowflake
    - databricks
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: risk-market
      port: 8080
      tools:
        - name: compute-daily-var
          description: "Given a trading book and date, compute VaR using Monte Carlo simulation and publish results."
          inputParameters:
            - name: trading_book
              in: body
              type: string
              description: "The trading book identifier."
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date in YYYY-MM-DD format."
            - name: simulation_count
              in: body
              type: number
              description: "Number of Monte Carlo simulations (e.g., 10000)."
          steps:
            - name: extract-positions
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "RISK_WH"
                database: "TRADING_DB"
                query: "SELECT * FROM trading_positions WHERE book_id = '{{trading_book}}' AND position_date = '{{valuation_date}}'"
            - name: run-simulation
              type: call
              call: "databricks.run-job"
              with:
                job_id: "monte-carlo-var"
                parameters:
                  book_id: "{{trading_book}}"
                  date: "{{valuation_date}}"
                  simulations: "{{simulation_count}}"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "risk-management-workspace"
                dataset_id: "market-risk-var-daily"
            - name: alert-risk-management
              type: call
              call: "msteams.send-message"
              with:
                channel: "market-risk"
                text: "Daily VaR computed: {{trading_book}} for {{valuation_date}}. VaR(99%): {{run-simulation.var_99}}. VaR(95%): {{run-simulation.var_95}}. Simulations: {{simulation_count}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: databricks
      baseUri: "https://adb-abnamro.azuredatabricks.net/api/2.1"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

When Microsoft Defender raises a security alert, enriches with Azure AD user context, creates a ServiceNow security incident, and notifies the SOC team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Microsoft Defender Threat Alert Triage"
  description: "When Microsoft Defender raises a security alert, enriches with Azure AD user context, creates a ServiceNow security incident, and notifies the SOC team in Microsoft Teams."
  tags:
    - security
    - threat-detection
    - microsoft-defender
    - azure-active-directory
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: triage-defender-alert
          description: "Given a Defender alert ID, enrich with user context, create a security incident, and notify the SOC."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Microsoft Defender alert ID."
            - name: user_principal_name
              in: body
              type: string
              description: "The UPN of the affected user."
          steps:
            - name: get-alert
              type: call
              call: "defender.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: get-user-context
              type: call
              call: "azuread.get-user"
              with:
                user_principal_name: "{{user_principal_name}}"
            - name: create-security-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "[Security] {{get-alert.title}} — {{get-user-context.display_name}}"
                description: "Defender Alert: {{alert_id}}\nSeverity: {{get-alert.severity}}\nCategory: {{get-alert.category}}\nUser: {{get-user-context.display_name}} ({{user_principal_name}})\nDepartment: {{get-user-context.department}}\nDescription: {{get-alert.description}}"
                assigned_group: "Security_Operations_Center"
                impact: "2"
            - name: notify-soc
              type: call
              call: "msteams.send-message"
              with:
                channel: "soc-alerts"
                text: "Security Alert: {{get-alert.title}} | Severity: {{get-alert.severity}} | User: {{get-user-context.display_name}} | ServiceNow: {{create-security-incident.number}}"
  consumes:
    - type: http
      namespace: defender
      baseUri: "https://api.security.microsoft.com/api"
      authentication:
        type: bearer
        token: "$secrets.defender_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_principal_name}}"
          inputParameters:
            - name: user_principal_name
              in: path
          operations:
            - name: get-user
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Queries Microsoft Entra for conditional access policies applied to a user, returning policy names, grant controls, and session controls for security audit.

naftiko: "0.5"
info:
  label: "Microsoft Entra Conditional Access Policy Check"
  description: "Queries Microsoft Entra for conditional access policies applied to a user, returning policy names, grant controls, and session controls for security audit."
  tags:
    - security
    - identity-management
    - microsoft-entra
capability:
  exposes:
    - type: mcp
      namespace: identity-security
      port: 8080
      tools:
        - name: get-conditional-access
          description: "List conditional access policies affecting a user. Returns policy names, states, and grant conditions."
          inputParameters:
            - name: user_principal_name
              in: body
              type: string
              description: "The user principal name (UPN) to check policies for."
          call: "entra.get-policies"
          with:
            user_principal_name: "{{user_principal_name}}"
          outputParameters:
            - name: policy_count
              type: string
              mapping: "$.value.length"
  consumes:
    - type: http
      namespace: entra
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: policies
          path: "/identity/conditionalAccess/policies?$filter=conditions/users/includeUsers/any(u:u eq '{{user_principal_name}}')"
          inputParameters:
            - name: user_principal_name
              in: query
          operations:
            - name: get-policies
              method: GET

Triggers a Microsoft Purview data classification scan on a specified data source and returns scan status and discovered sensitive data types for data governance compliance.

naftiko: "0.5"
info:
  label: "Microsoft Purview Data Classification Scan"
  description: "Triggers a Microsoft Purview data classification scan on a specified data source and returns scan status and discovered sensitive data types for data governance compliance."
  tags:
    - data-governance
    - classification
    - microsoft-purview
capability:
  exposes:
    - type: mcp
      namespace: data-governance
      port: 8080
      tools:
        - name: trigger-classification-scan
          description: "Trigger a Purview classification scan on a data source. Returns scan run ID and status."
          inputParameters:
            - name: data_source_name
              in: body
              type: string
              description: "The Purview registered data source name."
            - name: scan_name
              in: body
              type: string
              description: "The scan definition name."
          call: "purview.run-scan"
          with:
            data_source_name: "{{data_source_name}}"
            scan_name: "{{scan_name}}"
          outputParameters:
            - name: run_id
              type: string
              mapping: "$.scanRunId"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: purview
      baseUri: "https://abnamro-purview.purview.azure.com"
      authentication:
        type: bearer
        token: "$secrets.purview_token"
      resources:
        - name: scans
          path: "/scan/datasources/{{data_source_name}}/scans/{{scan_name}}/runs?api-version=2023-09-01"
          inputParameters:
            - name: data_source_name
              in: path
            - name: scan_name
              in: path
          operations:
            - name: run-scan
              method: POST

Receives mortgage application, runs credit check, validates documents in SharePoint, creates workflow in ServiceNow, and notifies the applicant via email.

naftiko: "0.5"
info:
  label: "Mortgage Application Processor"
  description: "Receives mortgage application, runs credit check, validates documents in SharePoint, creates workflow in ServiceNow, and notifies the applicant via email."
  tags:
    - lending
    - mortgage
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lending
      port: 8080
      tools:
        - name: mortgage_application_processor
          description: "Orchestrate mortgage application processor workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-application
              type: call
              call: "lending.get-application"
              with:
                app_id: "{{resource_id}}"
            - name: run-credit-check
              type: call
              call: "creditbureau.check-score"
              with:
                ssn: "{{get-application.ssn}}"
            - name: create-workflow
              type: call
              call: "servicenow.create-request"
              with:
                short_description: "Mortgage: {{resource_id}}"
                credit_score: "{{run-credit-check.score}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "lending-ops"
                text: "Mortgage {{resource_id}} processed. Score: {{run-credit-check.score}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Queries the MuleSoft Anypoint Platform for API deployment status and health metrics, compares against SLA thresholds in Datadog, and creates a ServiceNow incident when error rates exceed acceptable levels.

naftiko: "0.5"
info:
  label: "MuleSoft API Health Check with Incident Creation"
  description: "Queries the MuleSoft Anypoint Platform for API deployment status and health metrics, compares against SLA thresholds in Datadog, and creates a ServiceNow incident when error rates exceed acceptable levels."
  tags:
    - api-management
    - integration
    - mulesoft
    - datadog
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: api-gateway
      port: 8080
      tools:
        - name: check-api-health-with-escalation
          description: "Check MuleSoft API health, compare against Datadog SLA metrics, and create a ServiceNow incident on degradation."
          inputParameters:
            - name: api_id
              in: body
              type: string
              description: "The MuleSoft Anypoint API instance ID."
            - name: environment
              in: body
              type: string
              description: "Deployment environment: sandbox or production."
            - name: error_rate_threshold
              in: body
              type: number
              description: "Error rate threshold percentage for escalation."
          steps:
            - name: get-api-status
              type: call
              call: "mulesoft.get-api-status"
              with:
                api_id: "{{api_id}}"
                environment: "{{environment}}"
            - name: get-datadog-metrics
              type: call
              call: "datadog.get-metrics"
              with:
                query: "avg:mulesoft.api.error_rate{api_id:{{api_id}},env:{{environment}}}"
                time_range: "1h"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "API degradation: {{api_id}} in {{environment}}"
                description: "MuleSoft API {{api_id}} ({{environment}}) is degraded.\nStatus: {{get-api-status.status}}\nError rate: {{get-datadog-metrics.error_rate}}%\nThreshold: {{error_rate_threshold}}%"
                assigned_group: "API_Platform"
                category: "api_degradation"
  consumes:
    - type: http
      namespace: mulesoft
      baseUri: "https://anypoint.mulesoft.com/apimanager/api/v1"
      authentication:
        type: bearer
        token: "$secrets.mulesoft_token"
      resources:
        - name: apis
          path: "/organizations/{{org_id}}/environments/{{environment}}/apis/{{api_id}}"
          inputParameters:
            - name: api_id
              in: path
            - name: environment
              in: path
          operations:
            - name: get-api-status
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.eu/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Reconciles nostro accounts with correspondent banks, identifies breaks in Snowflake, creates resolution tickets, and notifies operations.

naftiko: "0.5"
info:
  label: "Nostro Reconciliation Pipeline"
  description: "Reconciles nostro accounts with correspondent banks, identifies breaks in Snowflake, creates resolution tickets, and notifies operations."
  tags:
    - operations
    - reconciliation
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: operations
      port: 8080
      tools:
        - name: nostro_reconciliation_pipeline
          description: "Orchestrate nostro reconciliation pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Checks if a user has access to a specific Okta application at ABN AMRO.

naftiko: "0.5"
info:
  label: "Okta Application Assignment Check"
  description: "Checks if a user has access to a specific Okta application at ABN AMRO."
  tags:
    - security
    - okta
    - access-management
capability:
  exposes:
    - type: mcp
      namespace: identity
      port: 8080
      tools:
        - name: check-app-access
          description: "Check user application access in Okta."
          inputParameters:
            - name: user_email
              in: body
              type: string
              description: "The user_email to look up." 
          call: "okta.get-user_email"
          with:
            user_email: "{{user_email}}"
  consumes:
    - type: http
      namespace: okta
      baseUri: "https://abn-amro.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
        header: "Authorization" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: okta_application_assignment_ch
              method: GET

Queries distributed traces from the OpenTelemetry-backed tracing backend for a given trace ID, returning span details and latency breakdown for banking microservice debugging.

naftiko: "0.5"
info:
  label: "OpenTelemetry Trace Lookup"
  description: "Queries distributed traces from the OpenTelemetry-backed tracing backend for a given trace ID, returning span details and latency breakdown for banking microservice debugging."
  tags:
    - observability
    - tracing
    - opentelemetry
capability:
  exposes:
    - type: mcp
      namespace: distributed-tracing
      port: 8080
      tools:
        - name: get-trace
          description: "Look up a distributed trace by trace ID. Returns span tree, total duration, and error spans."
          inputParameters:
            - name: trace_id
              in: body
              type: string
              description: "The OpenTelemetry trace ID (32-char hex)."
          call: "otel.get-trace"
          with:
            trace_id: "{{trace_id}}"
          outputParameters:
            - name: span_count
              type: string
              mapping: "$.spans.length"
            - name: total_duration_ms
              type: string
              mapping: "$.duration"
  consumes:
    - type: http
      namespace: otel
      baseUri: "https://tracing.abnamro.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.otel_token"
      resources:
        - name: traces
          path: "/traces/{{trace_id}}"
          inputParameters:
            - name: trace_id
              in: path
          operations:
            - name: get-trace
              method: GET

Captures operational risk events, categorizes by Basel taxonomy, calculates capital charges in Snowflake, and notifies risk management.

naftiko: "0.5"
info:
  label: "Operational Risk Event Pipeline"
  description: "Captures operational risk events, categorizes by Basel taxonomy, calculates capital charges in Snowflake, and notifies risk management."
  tags:
    - risk
    - operational-risk
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: risk
      port: 8080
      tools:
        - name: operational_risk_event_pipeline
          description: "Orchestrate operational risk event pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Retrieves the current on-call schedule for ABN AMRO incident response teams.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule"
  description: "Retrieves the current on-call schedule for ABN AMRO incident response teams."
  tags:
    - devops
    - pagerduty
    - on-call
capability:
  exposes:
    - type: mcp
      namespace: incident-mgmt
      port: 8080
      tools:
        - name: get-on-call
          description: "Get current on-call schedule by policy."
          inputParameters:
            - name: policy_id
              in: body
              type: string
              description: "The policy_id to look up." 
          call: "pagerduty.get-policy_id"
          with:
            policy_id: "{{policy_id}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: pagerduty_on_call_schedule
              method: GET

Extracts payment batches from SWIFT, reconciles against core banking ledger, identifies breaks, creates Jira tickets, and reports to operations.

naftiko: "0.5"
info:
  label: "Payment Processing Reconciliation"
  description: "Extracts payment batches from SWIFT, reconciles against core banking ledger, identifies breaks, creates Jira tickets, and reports to operations."
  tags:
    - payments
    - reconciliation
    - jira
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payments
      port: 8080
      tools:
        - name: payment_processing_reconciliation
          description: "Orchestrate payment processing reconciliation workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-payments
              type: call
              call: "swift.get-batch"
              with:
                batch_id: "{{resource_id}}"
            - name: reconcile
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "CALL reconcile_payments('{{resource_id}}')"
                warehouse: "PAYMENTS_WH"
            - name: create-breaks
              type: call
              call: "jira.create-issue"
              with:
                project: "PAY"
                summary: "Payment breaks: batch {{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "payment-ops"
                text: "Reconciliation complete for batch {{resource_id}}. Breaks: {{reconcile.break_count}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abn-amro.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abn-amro.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: jira-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Queries a SEPA or SWIFT payment transaction status from the core banking system, checks processing SLA compliance against Snowflake benchmarks, and escalates overdue payments via ServiceNow.

naftiko: "0.5"
info:
  label: "Payment Transaction Status with SLA Check"
  description: "Queries a SEPA or SWIFT payment transaction status from the core banking system, checks processing SLA compliance against Snowflake benchmarks, and escalates overdue payments via ServiceNow."
  tags:
    - payments
    - banking
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: payments
      port: 8080
      tools:
        - name: get-payment-status-with-sla
          description: "Look up a payment transaction by reference, check SLA compliance, and escalate if overdue."
          inputParameters:
            - name: payment_reference
              in: body
              type: string
              description: "The unique payment reference or end-to-end ID."
            - name: expected_sla_hours
              in: body
              type: number
              description: "Expected SLA in hours for payment settlement."
          steps:
            - name: get-payment
              type: call
              call: "core-banking.get-payment"
              with:
                reference: "{{payment_reference}}"
            - name: check-sla
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "PAYMENTS_WH"
                database: "PAYMENTS_DB"
                query: "SELECT TIMESTAMPDIFF(hour, initiated_at, CURRENT_TIMESTAMP()) as hours_elapsed FROM payment_tracking WHERE reference = '{{payment_reference}}'"
            - name: escalate-overdue
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_payment_escalation"
                short_description: "Payment SLA breach: {{payment_reference}}"
                description: "Payment {{payment_reference}} status: {{get-payment.status}}. Hours elapsed: {{check-sla.hours_elapsed}}. Expected SLA: {{expected_sla_hours}} hours."
                assigned_group: "Payment_Operations"
  consumes:
    - type: http
      namespace: core-banking
      baseUri: "https://api.abnamro.com/v1/payments"
      authentication:
        type: bearer
        token: "$secrets.core_banking_token"
      resources:
        - name: transactions
          path: "/transactions/{{reference}}"
          inputParameters:
            - name: reference
              in: path
          operations:
            - name: get-payment
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Triggers a Postman collection run for banking API regression tests, logs results to Snowflake for trend analysis, and notifies the QA team in Microsoft Teams with pass/fail summary.

naftiko: "0.5"
info:
  label: "Postman API Regression Suite with Reporting"
  description: "Triggers a Postman collection run for banking API regression tests, logs results to Snowflake for trend analysis, and notifies the QA team in Microsoft Teams with pass/fail summary."
  tags:
    - testing
    - api-testing
    - postman
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: api-testing
      port: 8080
      tools:
        - name: run-api-regression-suite
          description: "Run a Postman collection, log results to Snowflake, and notify the QA team."
          inputParameters:
            - name: collection_id
              in: body
              type: string
              description: "The Postman collection UID."
            - name: environment_id
              in: body
              type: string
              description: "The Postman environment UID."
            - name: suite_name
              in: body
              type: string
              description: "Human-readable test suite name."
          steps:
            - name: run-tests
              type: call
              call: "postman.run-collection"
              with:
                collection: "{{collection_id}}"
                environment: "{{environment_id}}"
            - name: log-results
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "QA_WH"
                database: "QA_DB"
                query: "INSERT INTO api_test_results (suite_name, run_id, status, executed_at) VALUES ('{{suite_name}}', '{{run-tests.run_id}}', '{{run-tests.status}}', CURRENT_TIMESTAMP())"
            - name: notify-qa
              type: call
              call: "msteams.send-message"
              with:
                channel: "qa-api-testing"
                text: "API Regression: {{suite_name}} | Run: {{run-tests.run_id}} | Status: {{run-tests.status}} | Results logged to Snowflake."
  consumes:
    - type: http
      namespace: postman
      baseUri: "https://api.getpostman.com"
      authentication:
        type: bearer
        token: "$secrets.postman_api_key"
      resources:
        - name: collection-runs
          path: "/collections/{{collection}}/runs"
          inputParameters:
            - name: collection
              in: path
          operations:
            - name: run-collection
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a Power BI dataset refresh, validates the refresh completed successfully by checking status, and notifies the analytics team in Microsoft Teams with the result.

naftiko: "0.5"
info:
  label: "Power BI Dashboard Refresh with Validation"
  description: "Triggers a Power BI dataset refresh, validates the refresh completed successfully by checking status, and notifies the analytics team in Microsoft Teams with the result."
  tags:
    - analytics
    - reporting
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: refresh-and-validate-powerbi
          description: "Trigger a Power BI dataset refresh, check completion status, and notify the analytics team."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
            - name: report_name
              in: body
              type: string
              description: "Human-readable report name for notifications."
          steps:
            - name: trigger-refresh
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
            - name: check-status
              type: call
              call: "powerbi.get-refresh-history"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "analytics-reports"
                text: "Power BI refresh: {{report_name}} | Status: {{check-status.status}} | Duration: {{check-status.duration}} | Dataset: {{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
            - name: get-refresh-history
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Checks the last refresh status of a Power BI dataset used for ABN AMRO reporting.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the last refresh status of a Power BI dataset used for ABN AMRO reporting."
  tags:
    - analytics
    - power-bi
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: analytics
      port: 8080
      tools:
        - name: get-refresh-status
          description: "Get Power BI dataset refresh status."
          inputParameters:
            - name: dataset_id
              in: body
              type: string
              description: "The dataset_id to look up." 
          call: "powerbi.get-dataset_id"
          with:
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: power_bi_dataset_refresh_statu
              method: GET

Queries Prometheus for active alerts on Kubernetes-hosted banking microservices, enriches with Datadog APM trace data, and creates Jira incident tickets for critical alerts.

naftiko: "0.5"
info:
  label: "Prometheus Alert Triage and Escalation"
  description: "Queries Prometheus for active alerts on Kubernetes-hosted banking microservices, enriches with Datadog APM trace data, and creates Jira incident tickets for critical alerts."
  tags:
    - observability
    - alerting
    - prometheus
    - datadog
    - jira
capability:
  exposes:
    - type: mcp
      namespace: monitoring
      port: 8080
      tools:
        - name: triage-prometheus-alerts
          description: "Query Prometheus alerts, enrich with Datadog traces, and create Jira incidents for critical ones."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "The Kubernetes namespace to filter alerts."
            - name: severity_filter
              in: body
              type: string
              description: "Minimum severity to triage: critical, warning, or info."
          steps:
            - name: get-alerts
              type: call
              call: "prometheus.query-alerts"
              with:
                namespace: "{{namespace}}"
            - name: get-traces
              type: call
              call: "datadog.get-traces"
              with:
                service: "{{namespace}}"
                time_range: "1h"
            - name: create-incident
              type: call
              call: "jira.create-issue"
              with:
                project_key: "INC"
                issuetype: "Incident"
                summary: "[Prometheus] {{namespace}} — {{get-alerts.alert_count}} active alerts"
                description: "Namespace: {{namespace}}\nActive alerts: {{get-alerts.alert_count}}\nSeverity filter: {{severity_filter}}\nDatadog traces available for correlation."
  consumes:
    - type: http
      namespace: prometheus
      baseUri: "https://prometheus.abnamro.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.prometheus_token"
      resources:
        - name: alerts
          path: "/alerts?filter=namespace%3D{{namespace}}"
          inputParameters:
            - name: namespace
              in: query
          operations:
            - name: query-alerts
              method: GET
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.eu/api/v2"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: traces
          path: "/traces?service={{service}}&timeRange={{time_range}}"
          inputParameters:
            - name: service
              in: query
            - name: time_range
              in: query
          operations:
            - name: get-traces
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://abnamro.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Extracts position data from trading systems, calculates RWA in Snowflake, generates Basel III reports, files with DNB via API, and notifies risk management.

naftiko: "0.5"
info:
  label: "Regulatory Capital Reporting Pipeline"
  description: "Extracts position data from trading systems, calculates RWA in Snowflake, generates Basel III reports, files with DNB via API, and notifies risk management."
  tags:
    - regulatory
    - capital
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory
      port: 8080
      tools:
        - name: regulatory_capital_reporting_pipeline
          description: "Orchestrate regulatory capital reporting pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-positions
              type: call
              call: "trading.get-positions"
              with:
                date: "{{resource_id}}"
            - name: calculate-rwa
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "CALL calculate_rwa('{{resource_id}}')"
                warehouse: "CAPITAL_WH"
            - name: file-report
              type: call
              call: "servicenow.create-record"
              with:
                table: "regulatory_filings"
                report_date: "{{resource_id}}"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "risk-management"
                text: "Capital report filed for {{resource_id}}. RWA: {{calculate-rwa.total_rwa}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abn-amro.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Extracts regulatory reporting data from Snowflake, transforms via Informatica, and loads into Oracle for DNB (Dutch Central Bank) submission, notifying compliance via Microsoft Teams upon completion.

naftiko: "0.5"
info:
  label: "Regulatory Reporting Data Pipeline"
  description: "Extracts regulatory reporting data from Snowflake, transforms via Informatica, and loads into Oracle for DNB (Dutch Central Bank) submission, notifying compliance via Microsoft Teams upon completion."
  tags:
    - regulatory-compliance
    - reporting
    - snowflake
    - informatica
    - oracle-cloud
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: regulatory-reporting
      port: 8080
      tools:
        - name: run-regulatory-extract
          description: "Given a report type and period, extract data from Snowflake, trigger Informatica transformation, and notify compliance team."
          inputParameters:
            - name: report_type
              in: body
              type: string
              description: "Regulatory report type: corep, finrep, anacredit, or srep."
            - name: reporting_period
              in: body
              type: string
              description: "Reporting period in YYYY-QN format (e.g., 2026-Q1)."
          steps:
            - name: extract-data
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "REG_REPORTING_WH"
                database: "REGULATORY_DB"
                query: "CALL sp_extract_{{report_type}}('{{reporting_period}}')"
            - name: trigger-transform
              type: call
              call: "informatica.start-task"
              with:
                task_name: "{{report_type}}_transform_{{reporting_period}}"
                task_type: "mapping"
            - name: notify-compliance
              type: call
              call: "msteams.send-message"
              with:
                channel: "regulatory-reporting"
                text: "Regulatory extract complete: {{report_type}} for {{reporting_period}}. Informatica job: {{trigger-transform.run_id}}. Data staged for DNB submission review."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: informatica
      baseUri: "https://dm-eu.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: tasks
          path: "/job"
          operations:
            - name: start-task
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

When a periodic access certification is due, pulls user entitlements from SailPoint, cross-references with Workday org data, and creates a Jira review task for the user's manager.

naftiko: "0.5"
info:
  label: "SailPoint Access Review Orchestrator"
  description: "When a periodic access certification is due, pulls user entitlements from SailPoint, cross-references with Workday org data, and creates a Jira review task for the user's manager."
  tags:
    - identity-management
    - access-review
    - sailpoint
    - workday
    - jira
capability:
  exposes:
    - type: mcp
      namespace: identity-access
      port: 8080
      tools:
        - name: initiate-access-review
          description: "Given a user identity ID, pull entitlements from SailPoint, get manager info from Workday, and create a Jira access review task."
          inputParameters:
            - name: identity_id
              in: body
              type: string
              description: "The SailPoint identity ID."
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID."
            - name: review_campaign
              in: body
              type: string
              description: "The access review campaign name."
          steps:
            - name: get-entitlements
              type: call
              call: "sailpoint.get-entitlements"
              with:
                identity_id: "{{identity_id}}"
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: create-review-task
              type: call
              call: "jira.create-issue"
              with:
                project_key: "IAM"
                issuetype: "Task"
                summary: "[Access Review] {{get-employee.full_name}} — {{review_campaign}}"
                description: "Review entitlements for {{get-employee.full_name}} ({{identity_id}}).\nDepartment: {{get-employee.department}}\nManager: {{get-employee.manager_name}}\nEntitlements count: {{get-entitlements.count}}\nEntitlements: {{get-entitlements.summary}}"
                assignee: "{{get-employee.manager_email}}"
  consumes:
    - type: http
      namespace: sailpoint
      baseUri: "https://abnamro.api.identitynow.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sailpoint_token"
      resources:
        - name: identities
          path: "/identities/{{identity_id}}/entitlements"
          inputParameters:
            - name: identity_id
              in: path
          operations:
            - name: get-entitlements
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd3-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: jira
      baseUri: "https://abnamro.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and owner for the sales team.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Lookup"
  description: "Retrieves a Salesforce opportunity by ID, returning stage, amount, close date, and owner for the sales team."
  tags:
    - sales
    - crm
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: sales-crm
      port: 8080
      tools:
        - name: get-opportunity
          description: "Look up a Salesforce opportunity by ID. Returns name, stage, amount, close date, and owner."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          call: "salesforce.get-opportunity"
          with:
            opportunity_id: "{{opportunity_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: stage
              type: string
              mapping: "$.StageName"
            - name: amount
              type: string
              mapping: "$.Amount"
            - name: close_date
              type: string
              mapping: "$.CloseDate"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://abnamro.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET

Downloads updated sanctions lists from Bloomberg, updates the screening database in Snowflake, triggers a batch re-screening of all active clients, and notifies compliance of any new matches via Jira and Microsoft Teams.

naftiko: "0.5"
info:
  label: "Sanctions List Update and Screening Refresh"
  description: "Downloads updated sanctions lists from Bloomberg, updates the screening database in Snowflake, triggers a batch re-screening of all active clients, and notifies compliance of any new matches via Jira and Microsoft Teams."
  tags:
    - compliance
    - sanctions
    - bloomberg
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance-sanctions
      port: 8080
      tools:
        - name: refresh-sanctions-screening
          description: "Download latest sanctions lists, update screening database, run batch re-screening, and alert on new matches."
          inputParameters:
            - name: list_type
              in: body
              type: string
              description: "Sanctions list type: eu, ofac, un, or all."
            - name: trigger_date
              in: body
              type: string
              description: "The date of the list update in YYYY-MM-DD format."
          steps:
            - name: download-lists
              type: call
              call: "bloomberg.get-sanctions-lists"
              with:
                list_type: "{{list_type}}"
                effective_date: "{{trigger_date}}"
            - name: update-database
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "COMPLIANCE_WH"
                database: "SANCTIONS_DB"
                query: "CALL sp_update_sanctions_list('{{list_type}}', '{{trigger_date}}')"
            - name: run-batch-screening
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "COMPLIANCE_WH"
                database: "SANCTIONS_DB"
                query: "CALL sp_batch_screen_active_clients('{{list_type}}')"
            - name: create-review-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "SANCTIONS"
                issuetype: "Task"
                summary: "[Sanctions Update] {{list_type}} list refresh — {{trigger_date}}"
                description: "Sanctions list updated: {{list_type}} as of {{trigger_date}}.\nNew entries: {{download-lists.new_entries_count}}\nBatch screening complete. Review any new matches."
            - name: notify-compliance
              type: call
              call: "msteams.send-message"
              with:
                channel: "compliance-sanctions"
                text: "Sanctions list refreshed: {{list_type}} ({{trigger_date}}). New entries: {{download-lists.new_entries_count}}. Batch re-screening complete. Jira: {{create-review-ticket.key}}"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: sanctions-lists
          path: "/sanctions/lists"
          operations:
            - name: get-sanctions-lists
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abnamro.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves submitted expense reports from SAP Concur, validates against Workday cost center data, and opens a ServiceNow task for finance review when policy exceptions are detected.

naftiko: "0.5"
info:
  label: "SAP Expense Report Processing"
  description: "Retrieves submitted expense reports from SAP Concur, validates against Workday cost center data, and opens a ServiceNow task for finance review when policy exceptions are detected."
  tags:
    - finance
    - expense-management
    - sap-concur
    - workday
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: finance-expense
      port: 8080
      tools:
        - name: review-expense-report
          description: "Given a Concur expense report ID and employee ID, fetch report details, validate cost center, and flag policy violations to ServiceNow."
          inputParameters:
            - name: expense_report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee ID of the expense submitter."
          steps:
            - name: get-expense-report
              type: call
              call: "concur.get-expense-report"
              with:
                report_id: "{{expense_report_id}}"
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: open-review-task
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "Expense policy review: {{get-expense-report.report_name}} — {{get-employee.full_name}}"
                description: "Report {{expense_report_id}} total: {{get-expense-report.total_amount}} {{get-expense-report.currency}}. Cost center: {{get-employee.cost_center}}. Submitted: {{get-expense-report.submit_date}}."
                assigned_group: "Finance_Audit"
                category: "expense_review"
  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/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-expense-report
              method: GET
    - type: http
      namespace: workday
      baseUri: "https://wd3-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://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Retrieves change request details by number from ABN AMRO ServiceNow instance.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Lookup"
  description: "Retrieves change request details by number from ABN AMRO ServiceNow instance."
  tags:
    - itsm
    - servicenow
    - change-management
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-change-request
          description: "Look up a change request by number."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The change_number to look up." 
          call: "servicenow.get-change_number"
          with:
            change_number: "{{change_number}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow_change_request_look
              method: GET

Retrieves a ServiceNow incident by number, returning status, priority, assigned group, and resolution notes for support teams.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number, returning status, priority, assigned group, and resolution notes for support teams."
  tags:
    - it-service-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number. Returns state, priority, assigned group, short description, and resolution notes."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number (e.g., INC0012345)."
          call: "servicenow.get-incident"
          with:
            incident_number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
            - name: assigned_group
              type: string
              mapping: "$.result.assignment_group.display_value"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abnamro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident?sysparm_query=number={{incident_number}}"
          inputParameters:
            - name: incident_number
              in: query
          operations:
            - name: get-incident
              method: GET

Retrieves a document from SharePoint by site and document path, returning the download URL, modified date, and author for banking document management.

naftiko: "0.5"
info:
  label: "SharePoint Document Retrieval"
  description: "Retrieves a document from SharePoint by site and document path, returning the download URL, modified date, and author for banking document management."
  tags:
    - document-management
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: document-mgmt
      port: 8080
      tools:
        - name: get-document
          description: "Retrieve a document from SharePoint. Returns download URL, last modified date, and author."
          inputParameters:
            - name: site_id
              in: body
              type: string
              description: "The SharePoint site ID."
            - name: document_path
              in: body
              type: string
              description: "The document path relative to the site root."
          call: "sharepoint.get-document"
          with:
            site_id: "{{site_id}}"
            document_path: "{{document_path}}"
          outputParameters:
            - name: download_url
              type: string
              mapping: "$.@microsoft.graph.downloadUrl"
            - name: last_modified
              type: string
              mapping: "$.lastModifiedDateTime"
  consumes:
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/{{site_id}}/drive/root:/{{document_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: document_path
              in: path
          operations:
            - name: get-document
              method: GET

Executes a SQL query against ABN AMRO's Snowflake data warehouse and returns the result set for analytics and reporting purposes.

naftiko: "0.5"
info:
  label: "Snowflake Query Execution"
  description: "Executes a SQL query against ABN AMRO's Snowflake data warehouse and returns the result set for analytics and reporting purposes."
  tags:
    - data
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: data-warehouse
      port: 8080
      tools:
        - name: run-query
          description: "Execute a SQL query on Snowflake. Returns the query result set and row count."
          inputParameters:
            - name: warehouse
              in: body
              type: string
              description: "The Snowflake warehouse to use."
            - name: database
              in: body
              type: string
              description: "The Snowflake database to query."
            - name: query
              in: body
              type: string
              description: "The SQL query to execute."
          call: "snowflake.execute-query"
          with:
            warehouse: "{{warehouse}}"
            database: "{{database}}"
            query: "{{query}}"
          outputParameters:
            - name: statement_handle
              type: string
              mapping: "$.statementHandle"
            - name: row_count
              type: string
              mapping: "$.resultSetMetaData.numRows"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Collects access control evidence from Okta, change management evidence from ServiceNow, monitoring evidence from Datadog, and compiles in Confluence.

naftiko: "0.5"
info:
  label: "SOC2 Evidence Collection Pipeline"
  description: "Collects access control evidence from Okta, change management evidence from ServiceNow, monitoring evidence from Datadog, and compiles in Confluence."
  tags:
    - compliance
    - audit
    - servicenow
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: compliance
      port: 8080
      tools:
        - name: soc2_evidence_collection_pipeline
          description: "Orchestrate soc2 evidence collection pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-access-evidence
              type: call
              call: "okta.get-access-logs"
              with:
                period: "{{resource_id}}"
            - name: get-change-evidence
              type: call
              call: "servicenow.get-changes"
              with:
                period: "{{resource_id}}"
            - name: get-monitoring-evidence
              type: call
              call: "datadog.get-alerts-history"
              with:
                period: "{{resource_id}}"
            - name: compile-report
              type: call
              call: "confluence.create-page"
              with:
                space: "AUDIT"
                title: "SOC2 Evidence: {{resource_id}}"

  consumes:
    - type: http
      namespace: okta
      baseUri: "https://abn-amro.okta.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.okta_api_token"
        header: "Authorization" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: okta-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        key: "$secrets.datadog_api_key"
        header: "DD-API-KEY" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: datadog-op
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://abn-amro.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: confluence-op
              method: POST

Searches Splunk SIEM for security events matching a query pattern at ABN AMRO.

naftiko: "0.5"
info:
  label: "Splunk Security Log Search"
  description: "Searches Splunk SIEM for security events matching a query pattern at ABN AMRO."
  tags:
    - security
    - splunk
    - siem
capability:
  exposes:
    - type: mcp
      namespace: security
      port: 8080
      tools:
        - name: search-security-logs
          description: "Search security logs by query."
          inputParameters:
            - name: query
              in: body
              type: string
              description: "The query to look up." 
          call: "splunk.get-query"
          with:
            query: "{{query}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://abn-amro-splunk.com/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: splunk_security_log_search
              method: GET

Loads stress scenario parameters, runs calculations in Snowflake, generates reports in Power BI, submits to regulators via ServiceNow, and notifies risk team.

naftiko: "0.5"
info:
  label: "Stress Testing Scenario Runner"
  description: "Loads stress scenario parameters, runs calculations in Snowflake, generates reports in Power BI, submits to regulators via ServiceNow, and notifies risk team."
  tags:
    - risk
    - stress-testing
    - snowflake
    - power-bi
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: risk
      port: 8080
      tools:
        - name: stress_testing_scenario_runner
          description: "Orchestrate stress testing scenario runner workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: load-scenario
              type: call
              call: "risk-engine.get-scenario"
              with:
                scenario_id: "{{resource_id}}"
            - name: run-calculations
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "CALL run_stress_test('{{resource_id}}')"
                warehouse: "RISK_WH"
            - name: generate-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "stress_testing"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "risk-team"
                text: "Stress test {{resource_id}} complete. Impact: {{run-calculations.pnl_impact}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abn-amro.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Retrieves SWIFT message details by reference number for ABN AMRO payment operations.

naftiko: "0.5"
info:
  label: "SWIFT Message Lookup"
  description: "Retrieves SWIFT message details by reference number for ABN AMRO payment operations."
  tags:
    - payments
    - swift
    - banking
capability:
  exposes:
    - type: mcp
      namespace: payments
      port: 8080
      tools:
        - name: get-swift-msg
          description: "Look up SWIFT message by reference."
          inputParameters:
            - name: message_ref
              in: body
              type: string
              description: "The message_ref to look up." 
          call: "servicenow.get-message_ref"
          with:
            message_ref: "{{message_ref}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: swift_message_lookup
              method: GET

Initiates a SWIFT payment through the core banking system, validates the BIC code, creates the payment instruction, and tracks the transaction status with Microsoft Teams notifications at each stage.

naftiko: "0.5"
info:
  label: "SWIFT Payment Initiation and Tracking"
  description: "Initiates a SWIFT payment through the core banking system, validates the BIC code, creates the payment instruction, and tracks the transaction status with Microsoft Teams notifications at each stage."
  tags:
    - payments
    - swift
    - banking
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payments-swift
      port: 8080
      tools:
        - name: initiate-swift-payment
          description: "Given payment details, validate BIC, create SWIFT payment instruction, and notify the treasury team of status changes."
          inputParameters:
            - name: debtor_iban
              in: body
              type: string
              description: "Debtor IBAN."
            - name: creditor_iban
              in: body
              type: string
              description: "Creditor IBAN."
            - name: creditor_bic
              in: body
              type: string
              description: "Creditor bank BIC/SWIFT code."
            - name: amount
              in: body
              type: number
              description: "Payment amount."
            - name: currency
              in: body
              type: string
              description: "Payment currency (ISO 4217)."
            - name: reference
              in: body
              type: string
              description: "Payment reference for the beneficiary."
          steps:
            - name: validate-bic
              type: call
              call: "core-banking.validate-bic"
              with:
                bic: "{{creditor_bic}}"
            - name: create-payment
              type: call
              call: "core-banking.create-swift-payment"
              with:
                debtor_iban: "{{debtor_iban}}"
                creditor_iban: "{{creditor_iban}}"
                creditor_bic: "{{creditor_bic}}"
                amount: "{{amount}}"
                currency: "{{currency}}"
                reference: "{{reference}}"
            - name: notify-treasury
              type: call
              call: "msteams.send-message"
              with:
                channel: "treasury-payments"
                text: "SWIFT payment initiated: {{create-payment.payment_id}} | {{amount}} {{currency}} to {{creditor_iban}} ({{creditor_bic}}) | Reference: {{reference}} | Status: {{create-payment.status}}"
  consumes:
    - type: http
      namespace: core-banking
      baseUri: "https://api.abnamro.com/v1/payments"
      authentication:
        type: bearer
        token: "$secrets.core_banking_token"
      resources:
        - name: bic-validation
          path: "/bic/validate"
          operations:
            - name: validate-bic
              method: POST
        - name: swift-payments
          path: "/swift"
          operations:
            - name: create-swift-payment
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Triggers a Terraform deployment through Azure DevOps pipelines for banking infrastructure changes, with approval gating and Teams notification.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Deployment"
  description: "Triggers a Terraform deployment through Azure DevOps pipelines for banking infrastructure changes, with approval gating and Teams notification."
  tags:
    - infrastructure
    - devops
    - terraform
    - azure-devops
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: infra-deploy
      port: 8080
      tools:
        - name: deploy-infrastructure
          description: "Given a Terraform workspace and environment, trigger an Azure DevOps pipeline run and notify the platform team."
          inputParameters:
            - name: workspace
              in: body
              type: string
              description: "The Terraform workspace name."
            - name: environment
              in: body
              type: string
              description: "Target environment: dev, staging, or production."
            - name: change_ticket
              in: body
              type: string
              description: "The ServiceNow change request number for audit trail."
          steps:
            - name: trigger-pipeline
              type: call
              call: "azuredevops.run-pipeline"
              with:
                project: "banking-infra"
                pipeline_id: "terraform-apply"
                variables:
                  workspace: "{{workspace}}"
                  environment: "{{environment}}"
                  change_ticket: "{{change_ticket}}"
            - name: notify-platform
              type: call
              call: "msteams.send-message"
              with:
                channel: "platform-deployments"
                text: "Infrastructure deployment triggered: {{workspace}} to {{environment}}. Pipeline run: {{trigger-pipeline.run_id}}. Change ticket: {{change_ticket}}."
  consumes:
    - type: http
      namespace: azuredevops
      baseUri: "https://dev.azure.com/abnamro"
      authentication:
        type: bearer
        token: "$secrets.azuredevops_token"
      resources:
        - name: pipelines
          path: "/{{project}}/_apis/pipelines/{{pipeline_id}}/runs?api-version=7.1"
          inputParameters:
            - name: project
              in: path
            - name: pipeline_id
              in: path
          operations:
            - name: run-pipeline
              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/{{team_id}}/channels/{{channel}}/messages"
          inputParameters:
            - name: channel
              in: path
          operations:
            - name: send-message
              method: POST

Analyzes trade execution quality metrics, compares against benchmarks in Snowflake, identifies improvements, and reports to trading desk.

naftiko: "0.5"
info:
  label: "Trade Execution Quality Analyzer"
  description: "Analyzes trade execution quality metrics, compares against benchmarks in Snowflake, identifies improvements, and reports to trading desk."
  tags:
    - trading
    - analytics
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trading
      port: 8080
      tools:
        - name: trade_execution_quality_analyzer
          description: "Orchestrate trade execution quality analyzer workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Reconciles trade settlement data between Bloomberg Tradebook and the core banking system, identifies breaks, and creates Jira tickets for operations to investigate discrepancies.

naftiko: "0.5"
info:
  label: "Trade Settlement Reconciliation"
  description: "Reconciles trade settlement data between Bloomberg Tradebook and the core banking system, identifies breaks, and creates Jira tickets for operations to investigate discrepancies."
  tags:
    - operations
    - settlement
    - reconciliation
    - bloomberg-tradebook
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: trade-ops
      port: 8080
      tools:
        - name: reconcile-settlements
          description: "Given a trade date, compare Tradebook and core banking settlement records, identify breaks, and create Jira tickets."
          inputParameters:
            - name: trade_date
              in: body
              type: string
              description: "The trade date to reconcile in YYYY-MM-DD format."
            - name: asset_class
              in: body
              type: string
              description: "Asset class: equities, fixed_income, fx, or derivatives."
          steps:
            - name: get-tradebook-settlements
              type: call
              call: "bloomberg-tradebook.get-settlements"
              with:
                trade_date: "{{trade_date}}"
                asset_class: "{{asset_class}}"
            - name: get-internal-settlements
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "OPS_WH"
                database: "SETTLEMENTS_DB"
                query: "SELECT trade_id, counterparty, amount, currency, status FROM settlements WHERE trade_date = '{{trade_date}}' AND asset_class = '{{asset_class}}'"
            - name: create-break-ticket
              type: call
              call: "jira.create-issue"
              with:
                project_key: "TRADEOPS"
                issuetype: "Task"
                summary: "[Settlement Break] {{asset_class}} — {{trade_date}}"
                description: "Reconciliation results for {{trade_date}} ({{asset_class}}).\nTradebook records: {{get-tradebook-settlements.count}}\nInternal records: {{get-internal-settlements.row_count}}\nReview breaks and resolve."
  consumes:
    - type: http
      namespace: bloomberg-tradebook
      baseUri: "https://api.bloomberg.com/tradebook/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_tradebook_token"
      resources:
        - name: settlements
          path: "/settlements?tradeDate={{trade_date}}&assetClass={{asset_class}}"
          inputParameters:
            - name: trade_date
              in: query
            - name: asset_class
              in: query
          operations:
            - name: get-settlements
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://abnamro.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Validates a bond trade against pre-trade compliance limits in Snowflake, submits the order to Tradeweb for execution, books the trade in the core banking system, and confirms to the trader via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Tradeweb Bond Execution with Compliance Check"
  description: "Validates a bond trade against pre-trade compliance limits in Snowflake, submits the order to Tradeweb for execution, books the trade in the core banking system, and confirms to the trader via Microsoft Teams."
  tags:
    - trading
    - fixed-income
    - tradeweb
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trading-execution
      port: 8080
      tools:
        - name: execute-bond-trade
          description: "Validate pre-trade limits, submit a bond trade to Tradeweb, book internally, and confirm to the trader."
          inputParameters:
            - name: isin
              in: body
              type: string
              description: "The ISIN of the bond to trade."
            - name: direction
              in: body
              type: string
              description: "Trade direction: buy or sell."
            - name: notional
              in: body
              type: number
              description: "Notional amount in the bond's denomination currency."
            - name: trader_upn
              in: body
              type: string
              description: "The UPN of the executing trader."
          steps:
            - name: check-limits
              type: call
              call: "snowflake.execute-query"
              with:
                warehouse: "TRADING_WH"
                database: "COMPLIANCE_DB"
                query: "SELECT remaining_limit FROM pre_trade_limits WHERE isin = '{{isin}}' AND direction = '{{direction}}'"
            - name: submit-order
              type: call
              call: "tradeweb.submit-order"
              with:
                isin: "{{isin}}"
                direction: "{{direction}}"
                notional: "{{notional}}"
            - name: book-trade
              type: call
              call: "core-banking.book-trade"
              with:
                trade_id: "{{submit-order.trade_id}}"
                isin: "{{isin}}"
                direction: "{{direction}}"
                notional: "{{notional}}"
                price: "{{submit-order.execution_price}}"
            - name: confirm-trader
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{trader_upn}}"
                text: "Bond trade executed: {{direction}} {{notional}} {{isin}} at {{submit-order.execution_price}}. Yield: {{submit-order.yield}}. Settlement: {{submit-order.settlement_date}}. Trade ID: {{submit-order.trade_id}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abnamro.eu-west-1.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: tradeweb
      baseUri: "https://api.tradeweb.com/v2"
      authentication:
        type: bearer
        token: "$secrets.tradeweb_token"
      resources:
        - name: orders
          path: "/orders"
          operations:
            - name: submit-order
              method: POST
    - type: http
      namespace: core-banking
      baseUri: "https://api.abnamro.com/v1/trading"
      authentication:
        type: bearer
        token: "$secrets.core_banking_token"
      resources:
        - name: bookings
          path: "/book"
          operations:
            - name: book-trade
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Collects cash positions from multiple bank accounts, aggregates in Snowflake, updates treasury dashboard in Power BI, and sends morning report to CFO.

naftiko: "0.5"
info:
  label: "Treasury Cash Position Aggregator"
  description: "Collects cash positions from multiple bank accounts, aggregates in Snowflake, updates treasury dashboard in Power BI, and sends morning report to CFO."
  tags:
    - treasury
    - cash-management
    - snowflake
    - power-bi
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: treasury
      port: 8080
      tools:
        - name: treasury_cash_position_aggregator
          description: "Orchestrate treasury cash position aggregator workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-positions
              type: call
              call: "swift.get-mt940"
              with:
                date: "{{resource_id}}"
            - name: aggregate
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "CALL aggregate_cash('{{resource_id}}')"
                warehouse: "TREASURY_WH"
            - name: refresh-dashboard
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "cash_positions"
            - name: notify
              type: call
              call: "msteams.send-message"
              with:
                channel: "treasury-mgmt"
                text: "Cash position report for {{resource_id}}: Total: {{aggregate.total_balance}}"

  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://abn-amro.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: powerbi-op
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: msteams-op
              method: POST

Queries vendor data from SAP Ariba, runs risk scoring in Snowflake, creates assessment record in ServiceNow, and notifies procurement.

naftiko: "0.5"
info:
  label: "Vendor Risk Assessment Pipeline"
  description: "Queries vendor data from SAP Ariba, runs risk scoring in Snowflake, creates assessment record in ServiceNow, and notifies procurement."
  tags:
    - procurement
    - vendor-risk
    - snowflake
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: vendor_risk_assessment_pipeline
          description: "Orchestrate vendor risk assessment pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: get-vendor
              type: call
              call: "sap.get-vendor"
              with:
                vendor_id: "{{resource_id}}"
            - name: score-risk
              type: call
              call: "snowflake.run-query"
              with:
                sql_query: "CALL score_vendor_risk('{{resource_id}}')"
                warehouse: "PROC_WH"
            - name: create-assessment
              type: call
              call: "servicenow.create-record"
              with:
                table: "vendor_assessments"
                vendor_id: "{{resource_id}}"
            - name: notify
              type: call
              call: "slack.send-message"
              with:
                channel: "procurement"
                text: "Vendor {{resource_id}} risk score: {{score-risk.risk_level}}"

  consumes:
    - type: http
      namespace: sap
      baseUri: "https://abn-amro-sap.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: sap-op
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://abn-amro.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: snowflake-op
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://abn-amro.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: servicenow-op
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: slack-op
              method: POST

Validates wire transfers against AML rules, screens beneficiaries, creates compliance records, and notifies compliance team.

naftiko: "0.5"
info:
  label: "Wire Transfer Compliance Pipeline"
  description: "Validates wire transfers against AML rules, screens beneficiaries, creates compliance records, and notifies compliance team."
  tags:
    - payments
    - compliance
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payments
      port: 8080
      tools:
        - name: wire_transfer_compliance_pipeline
          description: "Orchestrate wire transfer compliance pipeline workflow."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Primary resource identifier." 
          steps:
            - name: fetch-data
              type: call
              call: "primary.get-resource"
              with:
                resource_id: "{{resource_id}}"
            - name: process-data
              type: call
              call: "processor.transform"
              with:
                input: "{{fetch-data.result}}"
            - name: create-record
              type: call
              call: "servicenow.create-record"
              with:
                table: "records"
                data: "{{process-data.output}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                channel: "operations"
                text: "Workflow {{resource_id}} complete. Record: {{create-record.number}}"

  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://co.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password" 
      resources:
        - name: records
          path: "/table/records"
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token" 
      resources:
        - name: messages
          path: "/teams/{{channel}}/channels/general/messages"
          operations:
            - name: send-message
              method: POST

Retrieves employee compensation details from Workday for ABN AMRO HR operations.

naftiko: "0.5"
info:
  label: "Workday Compensation Lookup"
  description: "Retrieves employee compensation details from Workday for ABN AMRO HR operations."
  tags:
    - hr
    - workday
    - compensation
capability:
  exposes:
    - type: mcp
      namespace: hr
      port: 8080
      tools:
        - name: get-compensation
          description: "Look up employee compensation by ID."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The employee_id to look up." 
          call: "workday.get-employee_id"
          with:
            employee_id: "{{employee_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl-services1.workday.com/ccx/api/v1/abn-amro"
      authentication:
        type: bearer
        token: "$secrets.workday_token" 
      resources:
        - name: resources
          path: "/resources/{{resource_id}}"
          operations:
            - name: workday_compensation_lookup
              method: GET

Retrieves employee details from Workday by worker ID, returning name, department, manager, cost center, and employment status.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Retrieves employee details from Workday by worker ID, returning name, department, manager, cost center, and employment status."
  tags:
    - hr
    - employee-data
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-data
      port: 8080
      tools:
        - name: get-employee
          description: "Look up an employee in Workday by worker ID. Returns full name, department, manager, cost center, and status."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.worker.fullName"
            - name: department
              type: string
              mapping: "$.worker.department"
            - name: manager
              type: string
              mapping: "$.worker.managerName"
            - name: cost_center
              type: string
              mapping: "$.worker.costCenter"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd3-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