Citigroup Capabilities

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

Sort
Expand

Retrieves a transaction monitoring alert from NICE Actimize by alert ID, returning alert details, risk score, transaction data, and assigned analyst.

naftiko: "0.5"
info:
  label: "Actimize Alert Lookup"
  description: "Retrieves a transaction monitoring alert from NICE Actimize by alert ID, returning alert details, risk score, transaction data, and assigned analyst."
  tags:
    - compliance
    - aml
    - actimize
capability:
  exposes:
    - type: mcp
      namespace: compliance-actimize
      port: 8080
      tools:
        - name: get-actimize-alert
          description: "Fetch a NICE Actimize alert by ID and return risk score, transaction details, and assignment."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Actimize alert identifier."
          call: "actimize.get-alert"
          with:
            alert_id: "{{alert_id}}"
  consumes:
    - type: http
      namespace: actimize
      baseUri: "https://actimize.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.actimize_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET

Generates a Suspicious Activity Report by gathering transaction data from Actimize, retrieving customer KYC profile, and filing the report with the compliance system while notifying the BSA officer via email.

naftiko: "0.5"
info:
  label: "AML Suspicious Activity Report Pipeline"
  description: "Generates a Suspicious Activity Report by gathering transaction data from Actimize, retrieving customer KYC profile, and filing the report with the compliance system while notifying the BSA officer via email."
  tags:
    - compliance
    - aml
    - actimize
    - kyc
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: compliance-sar
      port: 8080
      tools:
        - name: file-sar
          description: "Generate and file a Suspicious Activity Report with full case assembly."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Actimize alert identifier."
            - name: customer_id
              in: body
              type: string
              description: "The customer identifier."
          steps:
            - name: get-alert
              type: call
              call: "actimize.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: get-kyc-profile
              type: call
              call: "kyc.get-profile"
              with:
                customer_id: "{{customer_id}}"
            - name: file-report
              type: call
              call: "compliance.create-sar"
              with:
                alert_id: "{{alert_id}}"
                customer_id: "{{customer_id}}"
                risk_score: "{{get-alert.risk_score}}"
                kyc_status: "{{get-kyc-profile.status}}"
            - name: notify-bsa-officer
              type: call
              call: "outlook.send-mail"
              with:
                to: "bsa-officer@citi.com"
                subject: "SAR Filed - Alert {{alert_id}}"
                body: "SAR filed for customer {{customer_id}}. Risk score: {{get-alert.risk_score}}. KYC status: {{get-kyc-profile.status}}. Report ID: {{file-report.sar_id}}."
  consumes:
    - type: http
      namespace: actimize
      baseUri: "https://actimize.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.actimize_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: kyc
      baseUri: "https://kyc.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.kyc_token"
      resources:
        - name: profiles
          path: "/profiles/{{customer_id}}"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: get-profile
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: sars
          path: "/sars"
          operations:
            - name: create-sar
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Extracts a regulatory report dataset from Axiom SL by report ID and period, returning row count, validation status, and data summary.

naftiko: "0.5"
info:
  label: "Axiom SL Report Data Extraction"
  description: "Extracts a regulatory report dataset from Axiom SL by report ID and period, returning row count, validation status, and data summary."
  tags:
    - compliance
    - regulatory-reporting
    - axiom-sl
capability:
  exposes:
    - type: mcp
      namespace: reporting-axiom
      port: 8080
      tools:
        - name: get-axiom-report
          description: "Extract a regulatory report dataset from Axiom SL for a given report ID and period."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The Axiom SL report identifier."
            - name: period
              in: body
              type: string
              description: "The reporting period in YYYY-MM format."
          call: "axiom-sl.get-report"
          with:
            report_id: "{{report_id}}"
            period: "{{period}}"
  consumes:
    - type: http
      namespace: axiom-sl
      baseUri: "https://axiom.citi.com/controller/api/v1"
      authentication:
        type: bearer
        token: "$secrets.axiom_sl_token"
      resources:
        - name: reports
          path: "/reports/{{report_id}}?period={{period}}"
          inputParameters:
            - name: report_id
              in: path
            - name: period
              in: query
          operations:
            - name: get-report
              method: GET

Fetches the latest pricing data for a security from Bloomberg, checks if there are open Calypso trades for the same security, and logs a pricing snapshot in ServiceNow for audit.

naftiko: "0.5"
info:
  label: "Bloomberg Security Pricing with Trade Check"
  description: "Fetches the latest pricing data for a security from Bloomberg, checks if there are open Calypso trades for the same security, and logs a pricing snapshot in ServiceNow for audit."
  tags:
    - trading
    - market-data
    - bloomberg
    - calypso
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: market-data
      port: 8080
      tools:
        - name: get-security-price-with-context
          description: "Retrieve Bloomberg pricing for a security, check Calypso for open positions, and log a pricing snapshot in ServiceNow."
          inputParameters:
            - name: ticker
              in: body
              type: string
              description: "The Bloomberg ticker symbol (e.g., C US Equity)."
            - name: desk_id
              in: body
              type: string
              description: "The trading desk ID to check for open positions."
          steps:
            - name: get-pricing
              type: call
              call: "bloomberg.get-pricing"
              with:
                ticker: "{{ticker}}"
            - name: check-positions
              type: call
              call: "calypso.get-positions"
              with:
                security: "{{ticker}}"
                desk_id: "{{desk_id}}"
            - name: log-snapshot
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_pricing_snapshots"
                short_description: "Price snapshot: {{ticker}} at {{get-pricing.last_price}}"
                description: "Ticker: {{ticker}}. Last: {{get-pricing.last_price}}. Bid: {{get-pricing.bid}}. Ask: {{get-pricing.ask}}. Open positions on desk {{desk_id}}: {{check-positions.position_count}}."
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: pricing
          path: "/pricing/{{ticker}}"
          inputParameters:
            - name: ticker
              in: path
          operations:
            - name: get-pricing
              method: GET
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/calypsoserver/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: positions
          path: "/positions?security={{security}}&deskId={{desk_id}}"
          inputParameters:
            - name: security
              in: query
            - name: desk_id
              in: query
          operations:
            - name: get-positions
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Fetches real-time market data snapshot for a given security from Bloomberg Enterprise Data including price, volume, and change.

naftiko: "0.5"
info:
  label: "Bloomberg Terminal Data Snapshot"
  description: "Fetches real-time market data snapshot for a given security from Bloomberg Enterprise Data including price, volume, and change."
  tags:
    - markets
    - bloomberg
capability:
  exposes:
    - type: mcp
      namespace: markets-bloomberg
      port: 8080
      tools:
        - name: get-market-snapshot
          description: "Retrieve a real-time market data snapshot for a security from Bloomberg."
          inputParameters:
            - name: security_id
              in: body
              type: string
              description: "Bloomberg security identifier."
          call: "bloomberg.get-snapshot"
          with:
            security_id: "{{security_id}}"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://bsapi.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: snapshots
          path: "/snapshots/{{security_id}}"
          inputParameters:
            - name: security_id
              in: path
          operations:
            - name: get-snapshot
              method: GET

Retrieves the current collateral inventory from Broadridge for a given account, returning eligible securities, haircut values, and total available margin.

naftiko: "0.5"
info:
  label: "Broadridge Collateral Inventory Lookup"
  description: "Retrieves the current collateral inventory from Broadridge for a given account, returning eligible securities, haircut values, and total available margin."
  tags:
    - trading
    - collateral
    - broadridge
capability:
  exposes:
    - type: mcp
      namespace: collateral-broadridge
      port: 8080
      tools:
        - name: get-collateral-inventory
          description: "Fetch collateral inventory from Broadridge for an account and collateral type."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Broadridge account identifier."
            - name: collateral_type
              in: body
              type: string
              description: "The collateral type filter (e.g., GOVT_BOND, EQUITY, CASH)."
          call: "broadridge.get-collateral-inventory"
          with:
            account_id: "{{account_id}}"
            collateral_type: "{{collateral_type}}"
  consumes:
    - type: http
      namespace: broadridge
      baseUri: "https://broadridge.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.broadridge_token"
      resources:
        - name: inventory
          path: "/collateral/inventory?accountId={{account_id}}&type={{collateral_type}}"
          inputParameters:
            - name: account_id
              in: query
            - name: collateral_type
              in: query
          operations:
            - name: get-collateral-inventory
              method: GET

Retrieves a trade from the Calypso risk and trading platform by trade ID, returning deal type, notional, counterparty, and valuation.

naftiko: "0.5"
info:
  label: "Calypso Trade Lookup"
  description: "Retrieves a trade from the Calypso risk and trading platform by trade ID, returning deal type, notional, counterparty, and valuation."
  tags:
    - trading
    - calypso
capability:
  exposes:
    - type: mcp
      namespace: trading-calypso
      port: 8080
      tools:
        - name: get-calypso-trade
          description: "Fetch a Calypso trade by ID and return its deal type, notional, counterparty, and current valuation."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The Calypso trade identifier."
          call: "calypso.get-trade"
          with:
            trade_id: "{{trade_id}}"
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/calypsoserver/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET

Retrieves multi-entity cash positions from Kyriba, calculates optimal sweep amounts, and initiates internal transfers via CitiConnect to centralize liquidity.

naftiko: "0.5"
info:
  label: "Cash Pooling Optimization"
  description: "Retrieves multi-entity cash positions from Kyriba, calculates optimal sweep amounts, and initiates internal transfers via CitiConnect to centralize liquidity."
  tags:
    - treasury
    - cash-management
    - kyriba
    - citiconnect
    - cash-pooling
capability:
  exposes:
    - type: mcp
      namespace: treasury-pooling
      port: 8080
      tools:
        - name: optimize-cash-pool
          description: "Retrieve multi-entity balances from Kyriba, calculate sweep amounts, and execute internal transfers via CitiConnect."
          inputParameters:
            - name: pool_id
              in: body
              type: string
              description: "The Kyriba cash pool identifier."
            - name: target_account
              in: body
              type: string
              description: "The header account for centralized liquidity."
          steps:
            - name: get-pool-balances
              type: call
              call: "kyriba.get-pool-balances"
              with:
                pool_id: "{{pool_id}}"
            - name: execute-sweep
              type: call
              call: "citiconnect.create-payment"
              with:
                debtor_account: "{{get-pool-balances.surplus_account}}"
                beneficiary_account: "{{target_account}}"
                amount: "{{get-pool-balances.surplus_amount}}"
                currency: "{{get-pool-balances.currency}}"
  consumes:
    - type: http
      namespace: kyriba
      baseUri: "https://citi.kyriba.com/gateway/api/v1"
      authentication:
        type: bearer
        token: "$secrets.kyriba_token"
      resources:
        - name: cash-pools
          path: "/cash/pools/{{pool_id}}/balances"
          inputParameters:
            - name: pool_id
              in: path
          operations:
            - name: get-pool-balances
              method: GET
    - type: http
      namespace: citiconnect
      baseUri: "https://citiconnect.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.citiconnect_token"
      resources:
        - name: payments
          path: "/payments"
          operations:
            - name: create-payment
              method: POST

Screens the beneficiary against Refinitiv World-Check before initiating a payment through CitiConnect, and logs the payment and screening result in ServiceNow.

naftiko: "0.5"
info:
  label: "CitiConnect Payment with Sanctions Pre-Check"
  description: "Screens the beneficiary against Refinitiv World-Check before initiating a payment through CitiConnect, and logs the payment and screening result in ServiceNow."
  tags:
    - payments
    - citiconnect
    - refinitiv
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: payments-citi
      port: 8080
      tools:
        - name: initiate-screened-payment
          description: "Screen the beneficiary via World-Check, submit the payment via CitiConnect, and log the result in ServiceNow."
          inputParameters:
            - name: beneficiary_name
              in: body
              type: string
              description: "The beneficiary legal name for screening."
            - name: beneficiary_account
              in: body
              type: string
              description: "The beneficiary IBAN or account number."
            - name: amount
              in: body
              type: number
              description: "The payment amount."
            - name: currency
              in: body
              type: string
              description: "ISO 4217 currency code."
          steps:
            - name: screen-beneficiary
              type: call
              call: "world-check.screen-entity"
              with:
                entity_name: "{{beneficiary_name}}"
                entity_type: "ORGANISATION"
            - name: submit-payment
              type: call
              call: "citiconnect.create-payment"
              with:
                beneficiary_account: "{{beneficiary_account}}"
                amount: "{{amount}}"
                currency: "{{currency}}"
            - name: log-payment
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_payment_audit"
                short_description: "Payment to {{beneficiary_name}}: {{amount}} {{currency}}"
                description: "Beneficiary: {{beneficiary_name}}. Amount: {{amount}} {{currency}}. Screening: {{screen-beneficiary.match_status}}. Payment ref: {{submit-payment.payment_reference}}. UETR: {{submit-payment.uetr}}."
  consumes:
    - type: http
      namespace: world-check
      baseUri: "https://api.refinitiv.com/world-check/v2"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: screening
          path: "/cases/screeningRequest"
          operations:
            - name: screen-entity
              method: POST
    - type: http
      namespace: citiconnect
      baseUri: "https://citiconnect.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.citiconnect_token"
      resources:
        - name: payments
          path: "/payments"
          operations:
            - name: create-payment
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Processes a client account closure by retrieving the account from Salesforce, zeroing balances in the core banking system, and creating a closure audit record in ServiceNow.

naftiko: "0.5"
info:
  label: "Client Account Closure Pipeline"
  description: "Processes a client account closure by retrieving the account from Salesforce, zeroing balances in the core banking system, and creating a closure audit record in ServiceNow."
  tags:
    - client-services
    - salesforce
    - core-banking
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: client-services
      port: 8080
      tools:
        - name: close-client-account
          description: "Process a full client account closure across Salesforce, core banking, and ServiceNow audit."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account identifier."
            - name: reason
              in: body
              type: string
              description: "The closure reason."
          steps:
            - name: get-account
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{account_id}}"
            - name: close-banking
              type: call
              call: "core-banking.close-account"
              with:
                account_id: "{{account_id}}"
                reason: "{{reason}}"
            - name: create-audit
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_account_closures"
                account_id: "{{account_id}}"
                client_name: "{{get-account.Name}}"
                reason: "{{reason}}"
                closure_status: "{{close-banking.status}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://citi.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: core-banking
      baseUri: "https://core-banking.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.core_banking_token"
      resources:
        - name: accounts
          path: "/accounts/{{account_id}}/close"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: close-account
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now/table"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: records
          path: "/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Handles client complaints by creating a case in Pega, pulling client history from Salesforce, and assigning to the appropriate resolution team with SLA tracking via ServiceNow.

naftiko: "0.5"
info:
  label: "Client Complaint Resolution Pipeline"
  description: "Handles client complaints by creating a case in Pega, pulling client history from Salesforce, and assigning to the appropriate resolution team with SLA tracking via ServiceNow."
  tags:
    - client-services
    - pega
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: complaints
      port: 8080
      tools:
        - name: process-complaint
          description: "Create complaint case with client context and SLA assignment."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The Salesforce client identifier."
            - name: complaint_text
              in: body
              type: string
              description: "The complaint description."
            - name: category
              in: body
              type: string
              description: "The complaint category."
          steps:
            - name: get-client
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{client_id}}"
            - name: create-case
              type: call
              call: "pega.create-case"
              with:
                case_type: "ClientComplaint"
                client_name: "{{get-client.Name}}"
                client_segment: "{{get-client.Segment__c}}"
                complaint: "{{complaint_text}}"
                category: "{{category}}"
            - name: create-sla-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Complaint: {{category}} - {{get-client.Name}}"
                description: "{{complaint_text}}"
                urgency: "2"
                assignment_group: "complaint_resolution"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://citi.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now/table"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/incident"
          operations:
            - name: create-incident
              method: POST

Opens a new institutional client case in Pegasystems, provisions a Salesforce CRM account, triggers KYC screening in Refinitiv, and notifies the coverage team in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Client Onboarding Orchestrator"
  description: "Opens a new institutional client case in Pegasystems, provisions a Salesforce CRM account, triggers KYC screening in Refinitiv, and notifies the coverage team in Microsoft Teams."
  tags:
    - corporate-banking
    - onboarding
    - pega
    - salesforce
    - refinitiv
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: client-onboarding
      port: 8080
      tools:
        - name: onboard-institutional-client
          description: "Orchestrate institutional client onboarding across Pega, Salesforce, Refinitiv World-Check, and Microsoft Teams."
          inputParameters:
            - name: client_name
              in: body
              type: string
              description: "The legal name of the institutional client."
            - name: entity_type
              in: body
              type: string
              description: "Entity type: CORPORATE, FUND, SOVEREIGN, FI."
            - name: coverage_team_email
              in: body
              type: string
              description: "Coverage team email for Teams notification."
          steps:
            - name: create-case
              type: call
              call: "pega.create-case"
              with:
                case_type: "ClientOnboarding"
                client_name: "{{client_name}}"
                entity_type: "{{entity_type}}"
            - name: create-crm-account
              type: call
              call: "salesforce.create-account"
              with:
                name: "{{client_name}}"
                type: "{{entity_type}}"
                pega_case_id: "{{create-case.case_id}}"
            - name: screen-client
              type: call
              call: "world-check.screen-entity"
              with:
                entity_name: "{{client_name}}"
                entity_type: "{{entity_type}}"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{coverage_team_email}}"
                text: "New client onboarding initiated for {{client_name}} ({{entity_type}}). Pega case: {{create-case.case_id}}. Salesforce ID: {{create-crm-account.account_id}}. Screening status: {{screen-client.match_status}}."
  consumes:
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/prweb/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://citi.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account"
          operations:
            - name: create-account
              method: POST
    - type: http
      namespace: world-check
      baseUri: "https://api.refinitiv.com/world-check/v2"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: screening
          path: "/cases/screeningRequest"
          operations:
            - name: screen-entity
              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

Refreshes a client risk rating by pulling the latest screening from Refinitiv World-Check, credit data from Moody's RiskAuthority, and updating the Pega KYC case with the new composite score.

naftiko: "0.5"
info:
  label: "Client Risk Rating Refresh"
  description: "Refreshes a client risk rating by pulling the latest screening from Refinitiv World-Check, credit data from Moody's RiskAuthority, and updating the Pega KYC case with the new composite score."
  tags:
    - compliance
    - risk
    - refinitiv
    - moodys
    - pega
capability:
  exposes:
    - type: mcp
      namespace: compliance-risk-rating
      port: 8080
      tools:
        - name: refresh-client-risk-rating
          description: "Refresh a client's composite risk rating using World-Check screening, RiskAuthority credit data, and update the Pega KYC case."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The internal client identifier."
            - name: case_id
              in: body
              type: string
              description: "The Pega KYC case identifier."
          steps:
            - name: get-case
              type: call
              call: "pega.get-case"
              with:
                case_id: "{{case_id}}"
            - name: screen-client
              type: call
              call: "world-check.screen-entity"
              with:
                entity_name: "{{get-case.client_name}}"
                entity_type: "{{get-case.entity_type}}"
            - name: get-credit-data
              type: call
              call: "riskauthority.get-exposure"
              with:
                counterparty_id: "{{client_id}}"
            - name: update-rating
              type: call
              call: "pega.update-case"
              with:
                case_id: "{{case_id}}"
                screening_result: "{{screen-client.match_status}}"
                credit_rating: "{{get-credit-data.internal_rating}}"
                pd: "{{get-credit-data.pd}}"
  consumes:
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/prweb/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
            - name: update-case
              method: PUT
    - type: http
      namespace: world-check
      baseUri: "https://api.refinitiv.com/world-check/v2"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: screening
          path: "/cases/screeningRequest"
          operations:
            - name: screen-entity
              method: POST
    - type: http
      namespace: riskauthority
      baseUri: "https://riskauthority.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.riskauthority_token"
      resources:
        - name: exposures
          path: "/exposures/counterparty/{{counterparty_id}}"
          inputParameters:
            - name: counterparty_id
              in: path
          operations:
            - name: get-exposure
              method: GET

Generates client tax documents by extracting portfolio positions from Calypso, calculating tax lots, and storing the completed document in OpenText with email notification to the client.

naftiko: "0.5"
info:
  label: "Client Tax Document Generation Pipeline"
  description: "Generates client tax documents by extracting portfolio positions from Calypso, calculating tax lots, and storing the completed document in OpenText with email notification to the client."
  tags:
    - tax
    - calypso
    - opentext
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: tax-docs
      port: 8080
      tools:
        - name: generate-tax-document
          description: "Generate tax documents from portfolio data with storage and client notification."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: tax_year
              in: body
              type: string
              description: "The tax year."
          steps:
            - name: get-positions
              type: call
              call: "calypso.get-positions"
              with:
                client_id: "{{client_id}}"
                as_of_date: "{{tax_year}}-12-31"
            - name: generate-doc
              type: call
              call: "tax-engine.generate-document"
              with:
                client_id: "{{client_id}}"
                tax_year: "{{tax_year}}"
                positions: "{{get-positions.positions}}"
            - name: store-document
              type: call
              call: "opentext.upload-document"
              with:
                folder: "/tax/{{tax_year}}/{{client_id}}"
                document_id: "{{generate-doc.document_id}}"
            - name: email-client
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{get-positions.client_email}}"
                subject: "Your {{tax_year}} Tax Document is Ready"
                body: "Your tax document for {{tax_year}} has been generated. Document ref: {{generate-doc.document_id}}."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: positions
          path: "/positions"
          operations:
            - name: get-positions
              method: GET
    - type: http
      namespace: tax-engine
      baseUri: "https://tax-engine.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.tax_engine_token"
      resources:
        - name: documents
          path: "/documents"
          operations:
            - name: generate-document
              method: POST
    - type: http
      namespace: opentext
      baseUri: "https://opentext.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.opentext_token"
      resources:
        - name: documents
          path: "/documents"
          operations:
            - name: upload-document
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves FX settlement instruction status from CLS Group by instruction reference.

naftiko: "0.5"
info:
  label: "CLS Settlement Instruction Lookup"
  description: "Retrieves FX settlement instruction status from CLS Group by instruction reference."
  tags:
    - forex
    - cls
    - settlements
capability:
  exposes:
    - type: mcp
      namespace: fx-settlements
      port: 8080
      tools:
        - name: get-cls-instruction
          description: "Look up CLS FX settlement instruction status."
          inputParameters:
            - name: instruction_ref
              in: body
              type: string
              description: "The CLS instruction reference."
          call: "cls.get-instruction"
          with:
            instruction_ref: "{{instruction_ref}}"
  consumes:
    - type: http
      namespace: cls
      baseUri: "https://api.cls-group.com/v1"
      authentication:
        type: bearer
        token: "$secrets.cls_token"
      resources:
        - name: instructions
          path: "/instructions/{{instruction_ref}}"
          inputParameters:
            - name: instruction_ref
              in: path
          operations:
            - name: get-instruction
              method: GET

Retrieves margin call details from Calypso, checks collateral inventory in Broadridge, and posts the margin movement instruction, notifying the collateral desk via Teams.

naftiko: "0.5"
info:
  label: "Collateral Margin Call Processor"
  description: "Retrieves margin call details from Calypso, checks collateral inventory in Broadridge, and posts the margin movement instruction, notifying the collateral desk via Teams."
  tags:
    - trading
    - collateral
    - calypso
    - broadridge
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: collateral-mgmt
      port: 8080
      tools:
        - name: process-margin-call
          description: "Process a margin call by checking Calypso exposure, validating Broadridge collateral inventory, and notifying the collateral desk."
          inputParameters:
            - name: margin_call_id
              in: body
              type: string
              description: "The Calypso margin call identifier."
            - name: desk_email
              in: body
              type: string
              description: "The collateral desk email for Teams notification."
          steps:
            - name: get-margin-call
              type: call
              call: "calypso.get-margin-call"
              with:
                margin_call_id: "{{margin_call_id}}"
            - name: check-inventory
              type: call
              call: "broadridge.get-collateral-inventory"
              with:
                account_id: "{{get-margin-call.account_id}}"
                collateral_type: "{{get-margin-call.eligible_collateral}}"
            - name: post-movement
              type: call
              call: "broadridge.create-collateral-movement"
              with:
                margin_call_id: "{{margin_call_id}}"
                amount: "{{get-margin-call.call_amount}}"
                currency: "{{get-margin-call.currency}}"
            - name: notify-desk
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{desk_email}}"
                text: "Margin call {{margin_call_id}} processed. Amount: {{get-margin-call.call_amount}} {{get-margin-call.currency}}. Counterparty: {{get-margin-call.counterparty}}. Movement ref: {{post-movement.movement_id}}."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/calypsoserver/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: margin-calls
          path: "/margin-calls/{{margin_call_id}}"
          inputParameters:
            - name: margin_call_id
              in: path
          operations:
            - name: get-margin-call
              method: GET
    - type: http
      namespace: broadridge
      baseUri: "https://broadridge.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.broadridge_token"
      resources:
        - name: inventory
          path: "/collateral/inventory?accountId={{account_id}}&type={{collateral_type}}"
          inputParameters:
            - name: account_id
              in: query
            - name: collateral_type
              in: query
          operations:
            - name: get-collateral-inventory
              method: GET
        - name: movements
          path: "/collateral/movements"
          operations:
            - name: create-collateral-movement
              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

Reconciles commercial card expenses by fetching transactions from the card platform, matching against SAP expense reports, and routing discrepancies to the finance team via Pega.

naftiko: "0.5"
info:
  label: "Commercial Card Expense Reconciliation Pipeline"
  description: "Reconciles commercial card expenses by fetching transactions from the card platform, matching against SAP expense reports, and routing discrepancies to the finance team via Pega."
  tags:
    - finance
    - commercial-cards
    - sap
    - pega
capability:
  exposes:
    - type: mcp
      namespace: card-reconciliation
      port: 8080
      tools:
        - name: reconcile-card-expenses
          description: "Reconcile commercial card transactions against SAP expense reports."
          inputParameters:
            - name: billing_cycle
              in: body
              type: string
              description: "The billing cycle identifier."
            - name: cost_center
              in: body
              type: string
              description: "The cost center code."
          steps:
            - name: get-transactions
              type: call
              call: "card-platform.get-transactions"
              with:
                billing_cycle: "{{billing_cycle}}"
                cost_center: "{{cost_center}}"
            - name: match-expenses
              type: call
              call: "sap.match-expenses"
              with:
                transactions: "{{get-transactions.transactions}}"
                cost_center: "{{cost_center}}"
            - name: route-discrepancies
              type: call
              call: "pega.create-case"
              with:
                case_type: "ExpenseDiscrepancy"
                cost_center: "{{cost_center}}"
                unmatched_count: "{{match-expenses.unmatched_count}}"
                total_discrepancy: "{{match-expenses.discrepancy_amount}}"
  consumes:
    - type: http
      namespace: card-platform
      baseUri: "https://cards.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.card_platform_token"
      resources:
        - name: transactions
          path: "/transactions"
          operations:
            - name: get-transactions
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://sap.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: expense-matching
          path: "/expenses/match"
          operations:
            - name: match-expenses
              method: POST
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases"
          operations:
            - name: create-case
              method: POST

Searches Confluence for internal policy documents by keyword, returning document title, URL, and last updated timestamp.

naftiko: "0.5"
info:
  label: "Confluence Policy Document Search"
  description: "Searches Confluence for internal policy documents by keyword, returning document title, URL, and last updated timestamp."
  tags:
    - knowledge-management
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: km-confluence
      port: 8080
      tools:
        - name: search-policies
          description: "Search Confluence for internal policy documents."
          inputParameters:
            - name: keyword
              in: body
              type: string
              description: "The search keyword."
          call: "confluence.search-content"
          with:
            cql: "type=page AND space=POL AND text~'{{keyword}}'"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://citi.atlassian.net/wiki/rest/api"
      authentication:
        type: bearer
        token: "$secrets.confluence_token"
      resources:
        - name: search
          path: "/content/search"
          operations:
            - name: search-content
              method: GET

Manages corporate bond issuance by pricing the bond in Bloomberg, booking the deal in Calypso, and distributing allocation notices to investors via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Corporate Bond Issuance Pipeline"
  description: "Manages corporate bond issuance by pricing the bond in Bloomberg, booking the deal in Calypso, and distributing allocation notices to investors via Microsoft Outlook."
  tags:
    - capital-markets
    - bloomberg
    - calypso
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: capital-markets
      port: 8080
      tools:
        - name: process-bond-issuance
          description: "Price, book, and notify on a corporate bond issuance."
          inputParameters:
            - name: issuer_name
              in: body
              type: string
              description: "The bond issuer name."
            - name: face_value
              in: body
              type: number
              description: "The bond face value."
            - name: coupon_rate
              in: body
              type: number
              description: "The coupon rate."
            - name: maturity_years
              in: body
              type: number
              description: "Years to maturity."
          steps:
            - name: price-bond
              type: call
              call: "bloomberg.price-bond"
              with:
                issuer: "{{issuer_name}}"
                face_value: "{{face_value}}"
                coupon: "{{coupon_rate}}"
                maturity: "{{maturity_years}}"
            - name: book-deal
              type: call
              call: "calypso.create-trade"
              with:
                product_type: "bond_issuance"
                issuer: "{{issuer_name}}"
                face_value: "{{face_value}}"
                coupon: "{{coupon_rate}}"
                price: "{{price-bond.clean_price}}"
            - name: send-allocations
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{book-deal.investor_distribution_list}}"
                subject: "Bond Allocation - {{issuer_name}} {{coupon_rate}}% {{maturity_years}}Y"
                body: "Allocation confirmed. Face value: {{face_value}}, Price: {{price-bond.clean_price}}, Yield: {{price-bond.yield}}%. Deal ref: {{book-deal.trade_id}}."
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://bsapi.bloomberg.com/eap/catalogs/bbg"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: pricing
          path: "/pricing/bonds"
          operations:
            - name: price-bond
              method: POST
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades"
          operations:
            - name: create-trade
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Processes a loan drawdown request by validating facility limits in Loan IQ, booking the disbursement, and notifying the relationship manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Corporate Loan Drawdown Request"
  description: "Processes a loan drawdown request by validating facility limits in Loan IQ, booking the disbursement, and notifying the relationship manager via Microsoft Teams."
  tags:
    - corporate-banking
    - lending
    - loan-iq
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lending
      port: 8080
      tools:
        - name: process-drawdown
          description: "Validate a drawdown against Loan IQ facility limits, book the disbursement, and notify the RM in Microsoft Teams."
          inputParameters:
            - name: facility_id
              in: body
              type: string
              description: "The Loan IQ facility identifier."
            - name: drawdown_amount
              in: body
              type: number
              description: "The requested drawdown amount."
            - name: currency
              in: body
              type: string
              description: "ISO 4217 currency code."
            - name: rm_email
              in: body
              type: string
              description: "Relationship manager email for Teams notification."
          steps:
            - name: get-facility
              type: call
              call: "loan-iq.get-facility"
              with:
                facility_id: "{{facility_id}}"
            - name: book-drawdown
              type: call
              call: "loan-iq.create-drawdown"
              with:
                facility_id: "{{facility_id}}"
                amount: "{{drawdown_amount}}"
                currency: "{{currency}}"
            - name: notify-rm
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{rm_email}}"
                text: "Drawdown processed on facility {{facility_id}} for {{drawdown_amount}} {{currency}}. Available limit: {{get-facility.available_amount}}. Drawdown ref: {{book-drawdown.drawdown_id}}."
  consumes:
    - type: http
      namespace: loan-iq
      baseUri: "https://loaniq.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.loaniq_token"
      resources:
        - name: facilities
          path: "/facilities/{{facility_id}}"
          inputParameters:
            - name: facility_id
              in: path
          operations:
            - name: get-facility
              method: GET
        - name: drawdowns
          path: "/facilities/{{facility_id}}/drawdowns"
          inputParameters:
            - name: facility_id
              in: path
          operations:
            - name: create-drawdown
              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

Retrieves a pending payment from CitiConnect, validates the payee against World-Check sanctions screening, gets manager approval from Workday hierarchy, and releases the payment.

naftiko: "0.5"
info:
  label: "Corporate Payment Approval Pipeline"
  description: "Retrieves a pending payment from CitiConnect, validates the payee against World-Check sanctions screening, gets manager approval from Workday hierarchy, and releases the payment."
  tags:
    - payments
    - approval
    - citiconnect
    - refinitiv
    - workday
capability:
  exposes:
    - type: mcp
      namespace: payments-approval
      port: 8080
      tools:
        - name: approve-corporate-payment
          description: "Screen a pending CitiConnect payment against sanctions, validate approver via Workday, and release the payment."
          inputParameters:
            - name: payment_id
              in: body
              type: string
              description: "The CitiConnect pending payment identifier."
            - name: approver_worker_id
              in: body
              type: string
              description: "The Workday worker ID of the approver."
          steps:
            - name: get-payment
              type: call
              call: "citiconnect.get-payment"
              with:
                payment_id: "{{payment_id}}"
            - name: screen-beneficiary
              type: call
              call: "world-check.screen-entity"
              with:
                entity_name: "{{get-payment.beneficiary_name}}"
                entity_type: "ORGANISATION"
            - name: get-approver
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{approver_worker_id}}"
            - name: release-payment
              type: call
              call: "citiconnect.release-payment"
              with:
                payment_id: "{{payment_id}}"
                approved_by: "{{get-approver.full_name}}"
  consumes:
    - type: http
      namespace: citiconnect
      baseUri: "https://citiconnect.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.citiconnect_token"
      resources:
        - name: payments
          path: "/payments/{{payment_id}}"
          inputParameters:
            - name: payment_id
              in: path
          operations:
            - name: get-payment
              method: GET
            - name: release-payment
              method: POST
    - type: http
      namespace: world-check
      baseUri: "https://api.refinitiv.com/world-check/v2"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: screening
          path: "/cases/screeningRequest"
          operations:
            - name: screen-entity
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Conducts due diligence on a correspondent bank by screening in Refinitiv World-Check, pulling financials from Bloomberg, and creating a review case in Pega.

naftiko: "0.5"
info:
  label: "Correspondent Banking Due Diligence Pipeline"
  description: "Conducts due diligence on a correspondent bank by screening in Refinitiv World-Check, pulling financials from Bloomberg, and creating a review case in Pega."
  tags:
    - compliance
    - correspondent-banking
    - refinitiv
    - bloomberg
    - pega
capability:
  exposes:
    - type: mcp
      namespace: cdd-pipeline
      port: 8080
      tools:
        - name: conduct-cdd
          description: "Run correspondent banking due diligence with screening, financials, and case creation."
          inputParameters:
            - name: bank_name
              in: body
              type: string
              description: "The correspondent bank name."
            - name: swift_code
              in: body
              type: string
              description: "The SWIFT/BIC code."
          steps:
            - name: screen-bank
              type: call
              call: "refinitiv.screen-entity"
              with:
                entity_name: "{{bank_name}}"
                entity_type: "financial_institution"
            - name: get-financials
              type: call
              call: "bloomberg.get-financials"
              with:
                entity_name: "{{bank_name}}"
            - name: create-review
              type: call
              call: "pega.create-case"
              with:
                case_type: "CorrespondentBankReview"
                bank_name: "{{bank_name}}"
                swift_code: "{{swift_code}}"
                screening_result: "{{screen-bank.match_status}}"
                total_assets: "{{get-financials.total_assets}}"
  consumes:
    - type: http
      namespace: refinitiv
      baseUri: "https://api.refinitiv.com/worldcheck/v2"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_wc_token"
      resources:
        - name: screening
          path: "/screening"
          operations:
            - name: screen-entity
              method: POST
    - type: http
      namespace: bloomberg
      baseUri: "https://bsapi.bloomberg.com/eap/catalogs/bbg"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: financials
          path: "/datasets/financials"
          operations:
            - name: get-financials
              method: GET
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases"
          operations:
            - name: create-case
              method: POST

Checks a counterparty's credit limit utilization in Moody's RiskAuthority against a proposed trade notional from Murex, and flags breaches to risk management.

naftiko: "0.5"
info:
  label: "Counterparty Credit Limit Check"
  description: "Checks a counterparty's credit limit utilization in Moody's RiskAuthority against a proposed trade notional from Murex, and flags breaches to risk management."
  tags:
    - risk
    - credit-risk
    - moodys
    - murex
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: risk-limit-check
      port: 8080
      tools:
        - name: check-credit-limit
          description: "Validate a proposed Murex trade against RiskAuthority credit limits and alert risk management if the limit would be breached."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The Murex trade identifier for the proposed trade."
            - name: risk_manager_email
              in: body
              type: string
              description: "Risk manager email for breach notification."
          steps:
            - name: get-trade
              type: call
              call: "murex.get-trade"
              with:
                trade_id: "{{trade_id}}"
            - name: get-exposure
              type: call
              call: "riskauthority.get-exposure"
              with:
                counterparty_id: "{{get-trade.counterparty_id}}"
            - name: notify-risk
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{risk_manager_email}}"
                text: "Credit limit check: Trade {{trade_id}} with {{get-trade.counterparty}} for {{get-trade.notional}} {{get-trade.currency}}. Current utilization: {{get-exposure.utilization_pct}}%. Available limit: {{get-exposure.available_limit}}."
  consumes:
    - type: http
      namespace: murex
      baseUri: "https://murex.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.murex_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
    - type: http
      namespace: riskauthority
      baseUri: "https://riskauthority.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.riskauthority_token"
      resources:
        - name: exposures
          path: "/exposures/counterparty/{{counterparty_id}}"
          inputParameters:
            - name: counterparty_id
              in: path
          operations:
            - name: get-exposure
              method: GET
    - 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

Manages credit facility renewals by pulling facility details from LoanIQ, refreshing the credit rating from Moody's, and submitting the renewal for approval in Pega with relationship manager notification.

naftiko: "0.5"
info:
  label: "Credit Facility Renewal Pipeline"
  description: "Manages credit facility renewals by pulling facility details from LoanIQ, refreshing the credit rating from Moody's, and submitting the renewal for approval in Pega with relationship manager notification."
  tags:
    - lending
    - loan-iq
    - moodys
    - pega
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: lending-renewals
      port: 8080
      tools:
        - name: renew-credit-facility
          description: "Process credit facility renewal with rating refresh and approval routing."
          inputParameters:
            - name: facility_id
              in: body
              type: string
              description: "The LoanIQ facility identifier."
          steps:
            - name: get-facility
              type: call
              call: "loaniq.get-facility"
              with:
                facility_id: "{{facility_id}}"
            - name: refresh-rating
              type: call
              call: "moodys.get-rating"
              with:
                entity_id: "{{get-facility.borrower_id}}"
            - name: submit-renewal
              type: call
              call: "pega.create-case"
              with:
                case_type: "FacilityRenewal"
                facility_id: "{{facility_id}}"
                borrower: "{{get-facility.borrower_name}}"
                current_rating: "{{refresh-rating.rating}}"
                outstanding: "{{get-facility.outstanding_balance}}"
            - name: notify-rm
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "lending"
                channel_id: "renewals"
                text: "Facility {{facility_id}} renewal submitted. Borrower: {{get-facility.borrower_name}}. Rating: {{refresh-rating.rating}} ({{refresh-rating.outlook}}). Outstanding: {{get-facility.outstanding_balance}}. Case: {{submit-renewal.case_id}}."
  consumes:
    - type: http
      namespace: loaniq
      baseUri: "https://loaniq.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.loaniq_token"
      resources:
        - name: facilities
          path: "/facilities/{{facility_id}}"
          inputParameters:
            - name: facility_id
              in: path
          operations:
            - name: get-facility
              method: GET
    - type: http
      namespace: moodys
      baseUri: "https://api.moodys.com/v1"
      authentication:
        type: bearer
        token: "$secrets.moodys_token"
      resources:
        - name: ratings
          path: "/ratings/{{entity_id}}"
          inputParameters:
            - name: entity_id
              in: path
          operations:
            - name: get-rating
              method: GET
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases"
          operations:
            - name: create-case
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Handles a credit limit breach by retrieving the counterparty exposure from Calypso, logging the breach in the risk system, and escalating to the credit committee via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Credit Limit Breach Handler"
  description: "Handles a credit limit breach by retrieving the counterparty exposure from Calypso, logging the breach in the risk system, and escalating to the credit committee via Microsoft Teams."
  tags:
    - credit-risk
    - calypso
    - risk-management
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: credit-risk
      port: 8080
      tools:
        - name: handle-credit-breach
          description: "Process a credit limit breach with exposure lookup, risk logging, and escalation."
          inputParameters:
            - name: counterparty_id
              in: body
              type: string
              description: "The counterparty identifier."
          steps:
            - name: get-exposure
              type: call
              call: "calypso.get-exposure"
              with:
                counterparty_id: "{{counterparty_id}}"
            - name: log-breach
              type: call
              call: "risk-system.create-breach"
              with:
                counterparty_id: "{{counterparty_id}}"
                current_exposure: "{{get-exposure.total_exposure}}"
                credit_limit: "{{get-exposure.credit_limit}}"
            - name: escalate
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "credit_risk"
                channel_id: "breaches"
                text: "CREDIT LIMIT BREACH: Counterparty {{counterparty_id}}. Exposure: {{get-exposure.total_exposure}} vs Limit: {{get-exposure.credit_limit}}. Breach ref: {{log-breach.breach_id}}."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: exposures
          path: "/exposures/{{counterparty_id}}"
          inputParameters:
            - name: counterparty_id
              in: path
          operations:
            - name: get-exposure
              method: GET
    - type: http
      namespace: risk-system
      baseUri: "https://risk.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.risk_token"
      resources:
        - name: breaches
          path: "/breaches"
          operations:
            - name: create-breach
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Pulls credit exposure data from Moody's Analytics RiskAuthority for a given counterparty, enriches with Salesforce CRM account data, and logs a summary to ServiceNow for risk oversight.

naftiko: "0.5"
info:
  label: "Credit Risk Exposure Snapshot"
  description: "Pulls credit exposure data from Moody's Analytics RiskAuthority for a given counterparty, enriches with Salesforce CRM account data, and logs a summary to ServiceNow for risk oversight."
  tags:
    - risk
    - credit-risk
    - moodys
    - riskauthority
    - salesforce
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: risk-credit
      port: 8080
      tools:
        - name: get-credit-exposure
          description: "Retrieve credit exposure metrics from RiskAuthority, enrich with Salesforce client data, and log a risk summary in ServiceNow."
          inputParameters:
            - name: counterparty_id
              in: body
              type: string
              description: "The internal counterparty identifier."
            - name: sf_account_id
              in: body
              type: string
              description: "The Salesforce account ID for the counterparty."
          steps:
            - name: get-exposure
              type: call
              call: "riskauthority.get-exposure"
              with:
                counterparty_id: "{{counterparty_id}}"
            - name: get-account
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{sf_account_id}}"
            - name: log-snapshot
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_credit_risk_snapshots"
                short_description: "Credit snapshot: {{get-account.name}} — PD {{get-exposure.pd}}"
                description: "Counterparty {{counterparty_id}} ({{get-account.name}}). Exposure: {{get-exposure.current_exposure}}. PD: {{get-exposure.pd}}. LGD: {{get-exposure.lgd}}. Utilization: {{get-exposure.utilization_pct}}%."
  consumes:
    - type: http
      namespace: riskauthority
      baseUri: "https://riskauthority.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.riskauthority_token"
      resources:
        - name: exposures
          path: "/exposures/counterparty/{{counterparty_id}}"
          inputParameters:
            - name: counterparty_id
              in: path
          operations:
            - name: get-exposure
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://citi.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Initiates a cross-border wire via CitiConnect, tracks it through SWIFT gpi, and notifies the originating operations team in Microsoft Teams with confirmation details.

naftiko: "0.5"
info:
  label: "Cross-Border Payment Orchestrator"
  description: "Initiates a cross-border wire via CitiConnect, tracks it through SWIFT gpi, and notifies the originating operations team in Microsoft Teams with confirmation details."
  tags:
    - payments
    - cross-border
    - citiconnect
    - swift
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payments-crossborder
      port: 8080
      tools:
        - name: initiate-cross-border-payment
          description: "Submit a cross-border payment via CitiConnect, track SWIFT gpi settlement, and notify operations in Microsoft Teams."
          inputParameters:
            - name: payment_reference
              in: body
              type: string
              description: "The internal payment reference number."
            - name: beneficiary_account
              in: body
              type: string
              description: "The beneficiary IBAN or account number."
            - name: amount
              in: body
              type: number
              description: "The payment amount."
            - name: currency
              in: body
              type: string
              description: "ISO 4217 currency code."
            - name: ops_email
              in: body
              type: string
              description: "The operations team email for Teams notification."
          steps:
            - name: submit-payment
              type: call
              call: "citiconnect.create-payment"
              with:
                payment_reference: "{{payment_reference}}"
                beneficiary_account: "{{beneficiary_account}}"
                amount: "{{amount}}"
                currency: "{{currency}}"
            - name: track-payment
              type: call
              call: "swift-gpi.get-payment-status"
              with:
                uetr: "{{submit-payment.uetr}}"
            - name: notify-ops
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{ops_email}}"
                text: "Cross-border payment {{payment_reference}} submitted. UETR: {{submit-payment.uetr}}. Amount: {{amount}} {{currency}}. SWIFT status: {{track-payment.transaction_status}}."
  consumes:
    - type: http
      namespace: citiconnect
      baseUri: "https://citiconnect.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.citiconnect_token"
      resources:
        - name: payments
          path: "/payments"
          operations:
            - name: create-payment
              method: POST
    - type: http
      namespace: swift-gpi
      baseUri: "https://api.swiftnet.sipn.swift.com/gpi/v4"
      authentication:
        type: bearer
        token: "$secrets.swift_gpi_token"
      resources:
        - name: payment-transactions
          path: "/payment_transactions/{{uetr}}"
          inputParameters:
            - name: uetr
              in: path
          operations:
            - name: get-payment-status
              method: GET
    - 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

Services a custody corporate action by retrieving event details from Broadridge, instructing the election in the custody system, and notifying the asset servicing team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Custody Asset Servicing Pipeline"
  description: "Services a custody corporate action by retrieving event details from Broadridge, instructing the election in the custody system, and notifying the asset servicing team via Microsoft Teams."
  tags:
    - custody
    - broadridge
    - corporate-actions
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: custody-servicing
      port: 8080
      tools:
        - name: process-corporate-action
          description: "Process a corporate action election for custody clients."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "The corporate action event identifier."
            - name: election
              in: body
              type: string
              description: "The client election choice."
          steps:
            - name: get-event
              type: call
              call: "broadridge.get-corporate-action"
              with:
                event_id: "{{event_id}}"
            - name: submit-election
              type: call
              call: "custody.submit-election"
              with:
                event_id: "{{event_id}}"
                election: "{{election}}"
                security_id: "{{get-event.security_id}}"
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "custody"
                channel_id: "corporate_actions"
                text: "Corporate action {{event_id}} processed. Security: {{get-event.security_id}}. Event type: {{get-event.event_type}}. Election: {{election}}. Status: {{submit-election.status}}."
  consumes:
    - type: http
      namespace: broadridge
      baseUri: "https://broadridge.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.broadridge_token"
      resources:
        - name: corporate-actions
          path: "/corporate-actions/{{event_id}}"
          inputParameters:
            - name: event_id
              in: path
          operations:
            - name: get-corporate-action
              method: GET
    - type: http
      namespace: custody
      baseUri: "https://custody.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.custody_token"
      resources:
        - name: elections
          path: "/elections"
          operations:
            - name: submit-election
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Generates daily liquidity reports by aggregating cash positions from Kyriba, computing LCR metrics, and distributing the report to senior management via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Daily Liquidity Reporting Pipeline"
  description: "Generates daily liquidity reports by aggregating cash positions from Kyriba, computing LCR metrics, and distributing the report to senior management via Microsoft Outlook."
  tags:
    - treasury
    - kyriba
    - regulatory
    - microsoft-outlook
    - liquidity
capability:
  exposes:
    - type: mcp
      namespace: liquidity-reporting
      port: 8080
      tools:
        - name: generate-liquidity-report
          description: "Aggregate positions, compute LCR, and distribute the daily liquidity report."
          inputParameters:
            - name: report_date
              in: body
              type: string
              description: "The report date (YYYY-MM-DD)."
          steps:
            - name: get-positions
              type: call
              call: "kyriba.get-cash-positions"
              with:
                date: "{{report_date}}"
            - name: compute-lcr
              type: call
              call: "liquidity-engine.calculate-lcr"
              with:
                positions: "{{get-positions.positions}}"
                report_date: "{{report_date}}"
            - name: send-report
              type: call
              call: "outlook.send-mail"
              with:
                to: "treasury-management@citi.com"
                subject: "Daily Liquidity Report - {{report_date}}"
                body: "LCR: {{compute-lcr.lcr_ratio}}%. HQLA: {{compute-lcr.hqla_total}}. Net outflows: {{compute-lcr.net_outflows}}. Total cash: {{get-positions.total_cash}}."
  consumes:
    - type: http
      namespace: kyriba
      baseUri: "https://kyriba.citi.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.kyriba_token"
      resources:
        - name: cash-positions
          path: "/cash-positions"
          operations:
            - name: get-cash-positions
              method: GET
    - type: http
      namespace: liquidity-engine
      baseUri: "https://liquidity.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.liquidity_token"
      resources:
        - name: lcr
          path: "/lcr/calculate"
          operations:
            - name: calculate-lcr
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves current infrastructure health metrics from Datadog for a given service, including CPU, memory, and error rates.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Monitor"
  description: "Retrieves current infrastructure health metrics from Datadog for a given service, including CPU, memory, and error rates."
  tags:
    - operations
    - datadog
    - monitoring
capability:
  exposes:
    - type: mcp
      namespace: ops-datadog
      port: 8080
      tools:
        - name: get-service-metrics
          description: "Fetch infrastructure health metrics from Datadog for a service."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The service name in Datadog."
          call: "datadog.get-metrics"
          with:
            service_name: "{{service_name}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: DD-API-KEY
        in: header
        value: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: get-metrics
              method: GET

Handles OTC derivatives trade lifecycle events by updating Calypso, confirming via Markitwire, and posting settlement instructions to DTCC.

naftiko: "0.5"
info:
  label: "Derivatives Trade Lifecycle Processor"
  description: "Handles OTC derivatives trade lifecycle events by updating Calypso, confirming via Markitwire, and posting settlement instructions to DTCC."
  tags:
    - trading
    - derivatives
    - calypso
    - markitwire
    - dtcc
capability:
  exposes:
    - type: mcp
      namespace: derivatives-lifecycle
      port: 8080
      tools:
        - name: process-lifecycle-event
          description: "Process an OTC derivatives lifecycle event across Calypso, Markitwire, and DTCC."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The Calypso trade identifier."
            - name: event_type
              in: body
              type: string
              description: "Lifecycle event: NOVATION, TERMINATION, AMENDMENT, EXERCISE."
          steps:
            - name: update-trade
              type: call
              call: "calypso.update-lifecycle"
              with:
                trade_id: "{{trade_id}}"
                event_type: "{{event_type}}"
            - name: confirm-event
              type: call
              call: "markitwire.submit-confirmation"
              with:
                trade_reference: "{{update-trade.external_reference}}"
                event_type: "{{event_type}}"
                effective_date: "{{update-trade.effective_date}}"
            - name: post-settlement
              type: call
              call: "dtcc.submit-settlement"
              with:
                trade_reference: "{{update-trade.external_reference}}"
                event_type: "{{event_type}}"
                settlement_amount: "{{update-trade.settlement_amount}}"
                currency: "{{update-trade.currency}}"
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/calypsoserver/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: lifecycle-events
          path: "/trades/{{trade_id}}/lifecycle"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: update-lifecycle
              method: POST
    - type: http
      namespace: markitwire
      baseUri: "https://markitwire.ihsmarkit.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.markitwire_token"
      resources:
        - name: confirmations
          path: "/confirmations"
          operations:
            - name: submit-confirmation
              method: POST
    - type: http
      namespace: dtcc
      baseUri: "https://api.dtcc.com/settlement/v1"
      authentication:
        type: bearer
        token: "$secrets.dtcc_token"
      resources:
        - name: settlements
          path: "/instructions"
          operations:
            - name: submit-settlement
              method: POST

Reviews dormant accounts by identifying inactive accounts in the core banking system, running compliance checks, and notifying the operations team via Microsoft Teams for escheatment processing.

naftiko: "0.5"
info:
  label: "Dormant Account Review Pipeline"
  description: "Reviews dormant accounts by identifying inactive accounts in the core banking system, running compliance checks, and notifying the operations team via Microsoft Teams for escheatment processing."
  tags:
    - operations
    - core-banking
    - compliance
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: account-ops
      port: 8080
      tools:
        - name: review-dormant-accounts
          description: "Identify and review dormant accounts for compliance and escheatment."
          inputParameters:
            - name: dormancy_threshold_days
              in: body
              type: number
              description: "Number of days of inactivity to qualify as dormant."
            - name: jurisdiction
              in: body
              type: string
              description: "The regulatory jurisdiction."
          steps:
            - name: find-dormant
              type: call
              call: "core-banking.get-dormant-accounts"
              with:
                threshold_days: "{{dormancy_threshold_days}}"
                jurisdiction: "{{jurisdiction}}"
            - name: run-compliance
              type: call
              call: "compliance.check-escheatment"
              with:
                accounts: "{{find-dormant.account_ids}}"
                jurisdiction: "{{jurisdiction}}"
            - name: notify-ops
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "operations"
                channel_id: "dormant_accounts"
                text: "Dormant account review for {{jurisdiction}}: {{find-dormant.count}} accounts identified. {{run-compliance.escheatment_due}} due for escheatment. Threshold: {{dormancy_threshold_days}} days."
  consumes:
    - type: http
      namespace: core-banking
      baseUri: "https://core-banking.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.core_banking_token"
      resources:
        - name: dormant-accounts
          path: "/accounts/dormant"
          operations:
            - name: get-dormant-accounts
              method: GET
    - type: http
      namespace: compliance
      baseUri: "https://compliance.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.compliance_token"
      resources:
        - name: escheatment
          path: "/escheatment/check"
          operations:
            - name: check-escheatment
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries DTCC for the settlement status of a securities trade by trade reference number.

naftiko: "0.5"
info:
  label: "DTCC Settlement Status Lookup"
  description: "Queries DTCC for the settlement status of a securities trade by trade reference number."
  tags:
    - settlements
    - dtcc
capability:
  exposes:
    - type: mcp
      namespace: settlements-dtcc
      port: 8080
      tools:
        - name: get-settlement-status
          description: "Look up settlement status from DTCC by trade reference."
          inputParameters:
            - name: trade_ref
              in: body
              type: string
              description: "The trade reference number."
          call: "dtcc.get-status"
          with:
            trade_ref: "{{trade_ref}}"
  consumes:
    - type: http
      namespace: dtcc
      baseUri: "https://api.dtcc.com/v2"
      authentication:
        type: bearer
        token: "$secrets.dtcc_token"
      resources:
        - name: settlements
          path: "/settlements/{{trade_ref}}"
          inputParameters:
            - name: trade_ref
              in: path
          operations:
            - name: get-status
              method: GET

Orchestrates employee offboarding by deactivating the Workday profile, revoking access in SailPoint, closing ServiceNow tickets, and notifying HR via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Orchestrator"
  description: "Orchestrates employee offboarding by deactivating the Workday profile, revoking access in SailPoint, closing ServiceNow tickets, and notifying HR via Microsoft Teams."
  tags:
    - hr
    - workday
    - sailpoint
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: offboard-employee
          description: "Process full employee offboarding across HR, identity, and IT systems."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee identifier."
          steps:
            - name: deactivate-profile
              type: call
              call: "workday.deactivate-worker"
              with:
                employee_id: "{{employee_id}}"
            - name: revoke-access
              type: call
              call: "sailpoint.revoke-all-access"
              with:
                identity_id: "{{employee_id}}"
            - name: close-tickets
              type: call
              call: "servicenow.close-user-tickets"
              with:
                user_id: "{{employee_id}}"
            - name: notify-hr
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "human_resources"
                channel_id: "offboarding"
                text: "Employee {{employee_id}} offboarded. Workday: {{deactivate-profile.status}}. Access revoked: {{revoke-access.revoked_count}} entitlements. Tickets closed: {{close-tickets.closed_count}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/ccx/api/v1/citi"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{employee_id}}/deactivate"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: deactivate-worker
              method: POST
    - type: http
      namespace: sailpoint
      baseUri: "https://citi.api.identitynow.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sailpoint_token"
      resources:
        - name: access
          path: "/identities/{{identity_id}}/access"
          inputParameters:
            - name: identity_id
              in: path
          operations:
            - name: revoke-all-access
              method: DELETE
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now/table"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: tickets
          path: "/incident"
          operations:
            - name: close-user-tickets
              method: PATCH
    - 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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Pulls end-of-day P&L from Murex for a trading desk, reconciles against the general ledger in SAP, and opens a ServiceNow ticket for any breaks.

naftiko: "0.5"
info:
  label: "End-of-Day P&L Reconciliation"
  description: "Pulls end-of-day P&L from Murex for a trading desk, reconciles against the general ledger in SAP, and opens a ServiceNow ticket for any breaks."
  tags:
    - trading
    - finance
    - murex
    - sap
    - servicenow
    - reconciliation
capability:
  exposes:
    - type: mcp
      namespace: finance-recon
      port: 8080
      tools:
        - name: reconcile-eod-pnl
          description: "Reconcile Murex trading desk P&L against SAP general ledger and raise ServiceNow tickets for breaks."
          inputParameters:
            - name: desk_id
              in: body
              type: string
              description: "The trading desk identifier."
            - name: business_date
              in: body
              type: string
              description: "The business date in YYYY-MM-DD format."
          steps:
            - name: get-murex-pnl
              type: call
              call: "murex.get-desk-pnl"
              with:
                desk_id: "{{desk_id}}"
                date: "{{business_date}}"
            - name: get-gl-balance
              type: call
              call: "sap.get-gl-balance"
              with:
                cost_center: "{{get-murex-pnl.cost_center}}"
                date: "{{business_date}}"
            - name: raise-break-ticket
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_pnl_breaks"
                short_description: "P&L break: desk {{desk_id}} on {{business_date}}"
                description: "Murex P&L: {{get-murex-pnl.total_pnl}} {{get-murex-pnl.currency}}. GL balance: {{get-gl-balance.balance}}. Difference: {{get-murex-pnl.total_pnl}} vs {{get-gl-balance.balance}}."
                assigned_group: "Finance_Reconciliation"
  consumes:
    - type: http
      namespace: murex
      baseUri: "https://murex.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.murex_token"
      resources:
        - name: pnl
          path: "/pnl/desk/{{desk_id}}?date={{date}}"
          inputParameters:
            - name: desk_id
              in: path
            - name: date
              in: query
          operations:
            - name: get-desk-pnl
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://sap.citi.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-balances
          path: "/A_GLAccountBalance?$filter=CostCenter eq '{{cost_center}}' and PostingDate eq '{{date}}'"
          inputParameters:
            - name: cost_center
              in: query
            - name: date
              in: query
          operations:
            - name: get-gl-balance
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Manages equity IPO allocations by collecting investor demand, computing allocations, booking in Calypso, and distributing confirmation notices via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Equity IPO Allocation Pipeline"
  description: "Manages equity IPO allocations by collecting investor demand, computing allocations, booking in Calypso, and distributing confirmation notices via Microsoft Outlook."
  tags:
    - capital-markets
    - ipo
    - calypso
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: ecm-ipo
      port: 8080
      tools:
        - name: process-ipo-allocation
          description: "Compute and distribute IPO allocations across investors."
          inputParameters:
            - name: deal_id
              in: body
              type: string
              description: "The IPO deal identifier."
            - name: total_shares
              in: body
              type: number
              description: "Total shares available for allocation."
          steps:
            - name: get-demand
              type: call
              call: "bookrunner.get-demand"
              with:
                deal_id: "{{deal_id}}"
            - name: compute-alloc
              type: call
              call: "bookrunner.compute-allocations"
              with:
                deal_id: "{{deal_id}}"
                total_shares: "{{total_shares}}"
                total_demand: "{{get-demand.total_demand}}"
            - name: book-trades
              type: call
              call: "calypso.create-bulk-trades"
              with:
                deal_id: "{{deal_id}}"
                allocations: "{{compute-alloc.allocations}}"
            - name: send-notices
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{compute-alloc.investor_emails}}"
                subject: "IPO Allocation Confirmation - {{deal_id}}"
                body: "Your allocation for deal {{deal_id}} has been confirmed. Total shares: {{total_shares}}. Oversubscription: {{get-demand.oversubscription_ratio}}x."
  consumes:
    - type: http
      namespace: bookrunner
      baseUri: "https://bookrunner.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.bookrunner_token"
      resources:
        - name: demand
          path: "/deals/{{deal_id}}/demand"
          inputParameters:
            - name: deal_id
              in: path
          operations:
            - name: get-demand
              method: GET
        - name: allocations
          path: "/deals/{{deal_id}}/allocate"
          inputParameters:
            - name: deal_id
              in: path
          operations:
            - name: compute-allocations
              method: POST
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: bulk-trades
          path: "/trades/bulk"
          operations:
            - name: create-bulk-trades
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Books an equity trade in Calypso, sends an allocation to Broadridge for clearing, and confirms the execution to the client via Salesforce activity log.

naftiko: "0.5"
info:
  label: "Equity Trade Booking Pipeline"
  description: "Books an equity trade in Calypso, sends an allocation to Broadridge for clearing, and confirms the execution to the client via Salesforce activity log."
  tags:
    - trading
    - equities
    - calypso
    - broadridge
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: equities-booking
      port: 8080
      tools:
        - name: book-equity-trade
          description: "Book an equity trade in Calypso, allocate via Broadridge, and log client confirmation in Salesforce."
          inputParameters:
            - name: security_ticker
              in: body
              type: string
              description: "The equity ticker symbol."
            - name: quantity
              in: body
              type: number
              description: "The number of shares."
            - name: side
              in: body
              type: string
              description: "BUY or SELL."
            - name: client_sf_id
              in: body
              type: string
              description: "The Salesforce client account ID."
          steps:
            - name: book-trade
              type: call
              call: "calypso.create-trade"
              with:
                product_type: "EQUITY"
                security: "{{security_ticker}}"
                quantity: "{{quantity}}"
                side: "{{side}}"
            - name: allocate-clearing
              type: call
              call: "broadridge.submit-allocation"
              with:
                trade_reference: "{{book-trade.trade_id}}"
                security: "{{security_ticker}}"
                quantity: "{{quantity}}"
            - name: log-activity
              type: call
              call: "salesforce.create-activity"
              with:
                account_id: "{{client_sf_id}}"
                subject: "Equity trade executed: {{side}} {{quantity}} {{security_ticker}}"
                description: "Trade {{book-trade.trade_id}} booked. {{side}} {{quantity}} shares of {{security_ticker}} at {{book-trade.execution_price}}. Clearing ref: {{allocate-clearing.allocation_id}}."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/calypsoserver/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades"
          operations:
            - name: create-trade
              method: POST
    - type: http
      namespace: broadridge
      baseUri: "https://broadridge.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.broadridge_token"
      resources:
        - name: allocations
          path: "/allocations"
          operations:
            - name: submit-allocation
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://citi.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: activities
          path: "/sobjects/Task"
          operations:
            - name: create-activity
              method: POST

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

naftiko: "0.5"
info:
  label: "Expense Report Compliance Check"
  description: "Retrieves submitted expense reports from SAP Concur, validates against Workday cost center and policy limits, and opens a ServiceNow task for finance review when exceptions are found."
  tags:
    - finance
    - expense
    - 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 the report, validate cost center via Workday, 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 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-record"
              with:
                table: "u_expense_reviews"
                short_description: "Expense 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"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us2.api.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://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Retrieves current outstanding balance and repayment schedule for a commercial loan from Finastra Fusion.

naftiko: "0.5"
info:
  label: "Finastra Loan Balance Lookup"
  description: "Retrieves current outstanding balance and repayment schedule for a commercial loan from Finastra Fusion."
  tags:
    - lending
    - finastra
capability:
  exposes:
    - type: mcp
      namespace: lending-finastra
      port: 8080
      tools:
        - name: get-loan-balance
          description: "Fetch loan balance and repayment schedule from Finastra Fusion."
          inputParameters:
            - name: loan_id
              in: body
              type: string
              description: "The Finastra loan identifier."
          call: "finastra.get-loan"
          with:
            loan_id: "{{loan_id}}"
  consumes:
    - type: http
      namespace: finastra
      baseUri: "https://finastra.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.finastra_token"
      resources:
        - name: loans
          path: "/loans/{{loan_id}}"
          inputParameters:
            - name: loan_id
              in: path
          operations:
            - name: get-loan
              method: GET

Retrieves payment transaction status from FIS Global payments platform by payment reference.

naftiko: "0.5"
info:
  label: "FIS Payment Status Lookup"
  description: "Retrieves payment transaction status from FIS Global payments platform by payment reference."
  tags:
    - payments
    - fis
capability:
  exposes:
    - type: mcp
      namespace: payments-fis
      port: 8080
      tools:
        - name: get-payment-status
          description: "Look up payment status from FIS Global."
          inputParameters:
            - name: payment_ref
              in: body
              type: string
              description: "The FIS payment reference."
          call: "fis.get-payment"
          with:
            payment_ref: "{{payment_ref}}"
  consumes:
    - type: http
      namespace: fis
      baseUri: "https://api.fisglobal.com/payments/v2"
      authentication:
        type: bearer
        token: "$secrets.fis_token"
      resources:
        - name: payments
          path: "/transactions/{{payment_ref}}"
          inputParameters:
            - name: payment_ref
              in: path
          operations:
            - name: get-payment
              method: GET

Allocates a block fixed income trade by splitting across accounts in Calypso, confirming via DTCC, and notifying portfolio managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Fixed Income Trade Allocation Pipeline"
  description: "Allocates a block fixed income trade by splitting across accounts in Calypso, confirming via DTCC, and notifying portfolio managers via Microsoft Teams."
  tags:
    - fixed-income
    - calypso
    - dtcc
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fi-allocation
      port: 8080
      tools:
        - name: allocate-fi-trade
          description: "Allocate a block fixed income trade across accounts with DTCC confirmation."
          inputParameters:
            - name: block_trade_id
              in: body
              type: string
              description: "The block trade identifier."
            - name: allocation_count
              in: body
              type: number
              description: "Number of sub-accounts for allocation."
          steps:
            - name: get-block
              type: call
              call: "calypso.get-trade"
              with:
                trade_id: "{{block_trade_id}}"
            - name: allocate
              type: call
              call: "calypso.allocate-trade"
              with:
                block_trade_id: "{{block_trade_id}}"
                allocation_count: "{{allocation_count}}"
            - name: confirm-dtcc
              type: call
              call: "dtcc.submit-allocation"
              with:
                block_trade_id: "{{block_trade_id}}"
                allocations: "{{allocate.allocations}}"
            - name: notify-pms
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "fixed_income"
                channel_id: "allocations"
                text: "Block trade {{block_trade_id}} allocated to {{allocation_count}} accounts. Security: {{get-block.security_id}}. DTCC status: {{confirm-dtcc.status}}."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
        - name: allocations
          path: "/trades/{{block_trade_id}}/allocate"
          inputParameters:
            - name: block_trade_id
              in: path
          operations:
            - name: allocate-trade
              method: POST
    - type: http
      namespace: dtcc
      baseUri: "https://api.dtcc.com/v2"
      authentication:
        type: bearer
        token: "$secrets.dtcc_token"
      resources:
        - name: allocations
          path: "/allocations"
          operations:
            - name: submit-allocation
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves an FX option quote from Murex using vol surface data from Bloomberg, returning premium, delta, gamma, and vega.

naftiko: "0.5"
info:
  label: "FX Option Pricing Request"
  description: "Retrieves an FX option quote from Murex using vol surface data from Bloomberg, returning premium, delta, gamma, and vega."
  tags:
    - trading
    - fx-options
    - murex
    - bloomberg
capability:
  exposes:
    - type: mcp
      namespace: fx-options
      port: 8080
      tools:
        - name: price-fx-option
          description: "Price an FX option by fetching vol surface from Bloomberg and calculating Greeks in Murex."
          inputParameters:
            - name: currency_pair
              in: body
              type: string
              description: "The currency pair (e.g., EURUSD)."
            - name: option_type
              in: body
              type: string
              description: "CALL or PUT."
            - name: strike
              in: body
              type: number
              description: "The strike price."
            - name: expiry_date
              in: body
              type: string
              description: "The option expiry date in YYYY-MM-DD format."
            - name: notional
              in: body
              type: number
              description: "The notional amount."
          steps:
            - name: get-vol-surface
              type: call
              call: "bloomberg.get-vol-surface"
              with:
                currency_pair: "{{currency_pair}}"
                expiry_date: "{{expiry_date}}"
            - name: price-option
              type: call
              call: "murex.price-fx-option"
              with:
                currency_pair: "{{currency_pair}}"
                option_type: "{{option_type}}"
                strike: "{{strike}}"
                expiry_date: "{{expiry_date}}"
                notional: "{{notional}}"
                vol_surface: "{{get-vol-surface.surface_data}}"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: vol-surfaces
          path: "/volatility/{{currency_pair}}?expiry={{expiry_date}}"
          inputParameters:
            - name: currency_pair
              in: path
            - name: expiry_date
              in: query
          operations:
            - name: get-vol-surface
              method: GET
    - type: http
      namespace: murex
      baseUri: "https://murex.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.murex_token"
      resources:
        - name: fx-options
          path: "/pricing/fx-options"
          operations:
            - name: price-fx-option
              method: POST

Retrieves an FX trade from Murex, validates settlement details against SWIFT gpi, and logs the trade status in ServiceNow for operations tracking.

naftiko: "0.5"
info:
  label: "FX Trade Execution Monitor"
  description: "Retrieves an FX trade from Murex, validates settlement details against SWIFT gpi, and logs the trade status in ServiceNow for operations tracking."
  tags:
    - trading
    - fx
    - murex
    - swift
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: fx-trading
      port: 8080
      tools:
        - name: monitor-fx-trade
          description: "Given a Murex trade ID, fetch trade details, check SWIFT gpi settlement status, and log a ServiceNow operations record."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The Murex FX trade identifier."
            - name: value_date
              in: body
              type: string
              description: "The trade value date in YYYY-MM-DD format."
          steps:
            - name: get-trade
              type: call
              call: "murex.get-trade"
              with:
                trade_id: "{{trade_id}}"
            - name: check-settlement
              type: call
              call: "swift-gpi.get-payment-status"
              with:
                uetr: "{{get-trade.uetr}}"
            - name: log-status
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_fx_operations"
                short_description: "FX trade {{trade_id}} settlement: {{check-settlement.transaction_status}}"
                description: "Trade {{trade_id}} — {{get-trade.currency_pair}} {{get-trade.notional}} value date {{value_date}}. SWIFT status: {{check-settlement.transaction_status}}. Counterparty: {{get-trade.counterparty}}."
  consumes:
    - type: http
      namespace: murex
      baseUri: "https://murex.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.murex_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
    - type: http
      namespace: swift-gpi
      baseUri: "https://api.swiftnet.sipn.swift.com/gpi/v4"
      authentication:
        type: bearer
        token: "$secrets.swift_gpi_token"
      resources:
        - name: payment-transactions
          path: "/payment_transactions/{{uetr}}"
          inputParameters:
            - name: uetr
              in: path
          operations:
            - name: get-payment-status
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Executes an FX trade settlement by confirming the deal in Murex, submitting a CLS settlement instruction, and notifying the treasury desk via Microsoft Teams.

naftiko: "0.5"
info:
  label: "FX Trade Settlement Pipeline"
  description: "Executes an FX trade settlement by confirming the deal in Murex, submitting a CLS settlement instruction, and notifying the treasury desk via Microsoft Teams."
  tags:
    - forex
    - murex
    - cls
    - microsoft-teams
    - settlements
capability:
  exposes:
    - type: mcp
      namespace: fx-settlement
      port: 8080
      tools:
        - name: settle-fx-trade
          description: "Settle an FX trade through Murex confirmation, CLS submission, and treasury notification."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The Murex FX trade identifier."
            - name: settlement_date
              in: body
              type: string
              description: "The intended settlement date."
          steps:
            - name: confirm-deal
              type: call
              call: "murex.get-trade"
              with:
                trade_id: "{{trade_id}}"
            - name: submit-cls
              type: call
              call: "cls.create-instruction"
              with:
                trade_id: "{{trade_id}}"
                settlement_date: "{{settlement_date}}"
                currency_pair: "{{confirm-deal.currency_pair}}"
                amount: "{{confirm-deal.notional}}"
            - name: notify-treasury
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "treasury_desk"
                channel_id: "fx_settlements"
                text: "FX trade {{trade_id}} submitted to CLS. Pair: {{confirm-deal.currency_pair}}, Amount: {{confirm-deal.notional}}, Settlement: {{settlement_date}}. CLS ref: {{submit-cls.instruction_ref}}."
  consumes:
    - type: http
      namespace: murex
      baseUri: "https://murex.citi.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.murex_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
    - type: http
      namespace: cls
      baseUri: "https://api.cls-group.com/v1"
      authentication:
        type: bearer
        token: "$secrets.cls_token"
      resources:
        - name: instructions
          path: "/instructions"
          operations:
            - name: create-instruction
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Orchestrates end-of-day global cash sweeps by retrieving balances from Kyriba, executing inter-entity transfers via CitiConnect, and generating the sweep report for the treasury team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Global Cash Sweep Orchestrator"
  description: "Orchestrates end-of-day global cash sweeps by retrieving balances from Kyriba, executing inter-entity transfers via CitiConnect, and generating the sweep report for the treasury team via Microsoft Teams."
  tags:
    - treasury
    - kyriba
    - citiconnect
    - microsoft-teams
    - cash-management
capability:
  exposes:
    - type: mcp
      namespace: treasury-sweep
      port: 8080
      tools:
        - name: execute-cash-sweep
          description: "Run global cash sweep across entities with balance retrieval, transfers, and reporting."
          inputParameters:
            - name: sweep_date
              in: body
              type: string
              description: "The sweep date (YYYY-MM-DD)."
            - name: target_entity
              in: body
              type: string
              description: "The target concentration entity."
          steps:
            - name: get-balances
              type: call
              call: "kyriba.get-cash-positions"
              with:
                date: "{{sweep_date}}"
            - name: execute-transfers
              type: call
              call: "citiconnect.create-bulk-transfer"
              with:
                source_entities: "{{get-balances.surplus_entities}}"
                target_entity: "{{target_entity}}"
                sweep_date: "{{sweep_date}}"
            - name: notify-treasury
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "treasury"
                channel_id: "cash_sweeps"
                text: "Global cash sweep completed for {{sweep_date}}. {{execute-transfers.transfer_count}} transfers executed. Total swept: {{execute-transfers.total_amount}} USD to {{target_entity}}."
  consumes:
    - type: http
      namespace: kyriba
      baseUri: "https://kyriba.citi.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.kyriba_token"
      resources:
        - name: cash-positions
          path: "/cash-positions"
          operations:
            - name: get-cash-positions
              method: GET
    - type: http
      namespace: citiconnect
      baseUri: "https://citiconnect.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.citiconnect_token"
      resources:
        - name: bulk-transfers
          path: "/bulk-transfers"
          operations:
            - name: create-bulk-transfer
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Orchestrates interest rate hedge execution by pricing the swap in Murex, booking the hedge in Calypso, and reporting to the risk team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Interest Rate Hedging Orchestrator"
  description: "Orchestrates interest rate hedge execution by pricing the swap in Murex, booking the hedge in Calypso, and reporting to the risk team via Microsoft Teams."
  tags:
    - treasury
    - murex
    - calypso
    - microsoft-teams
    - hedging
capability:
  exposes:
    - type: mcp
      namespace: treasury-hedging
      port: 8080
      tools:
        - name: execute-ir-hedge
          description: "Price and book an interest rate hedge across Murex and Calypso with risk notification."
          inputParameters:
            - name: notional
              in: body
              type: number
              description: "The swap notional amount."
            - name: tenor
              in: body
              type: string
              description: "The swap tenor (e.g., 5Y, 10Y)."
            - name: fixed_rate
              in: body
              type: number
              description: "The fixed leg rate."
          steps:
            - name: price-swap
              type: call
              call: "murex.price-swap"
              with:
                notional: "{{notional}}"
                tenor: "{{tenor}}"
                fixed_rate: "{{fixed_rate}}"
            - name: book-hedge
              type: call
              call: "calypso.create-trade"
              with:
                product_type: "irs"
                notional: "{{notional}}"
                tenor: "{{tenor}}"
                fixed_rate: "{{fixed_rate}}"
                npv: "{{price-swap.npv}}"
            - name: notify-risk
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "treasury"
                channel_id: "hedging"
                text: "IR hedge booked: {{tenor}} swap, notional {{notional}}, fixed {{fixed_rate}}%. NPV: {{price-swap.npv}}. Calypso ID: {{book-hedge.trade_id}}."
  consumes:
    - type: http
      namespace: murex
      baseUri: "https://murex.citi.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.murex_token"
      resources:
        - name: pricing
          path: "/pricing/swaps"
          operations:
            - name: price-swap
              method: POST
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades"
          operations:
            - name: create-trade
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves an IRS trade from Calypso, pulls the current yield curve from Bloomberg, and returns the mark-to-market valuation with DV01 sensitivity.

naftiko: "0.5"
info:
  label: "Interest Rate Swap Valuation"
  description: "Retrieves an IRS trade from Calypso, pulls the current yield curve from Bloomberg, and returns the mark-to-market valuation with DV01 sensitivity."
  tags:
    - trading
    - rates
    - calypso
    - bloomberg
    - valuation
capability:
  exposes:
    - type: mcp
      namespace: rates-valuation
      port: 8080
      tools:
        - name: value-irs-trade
          description: "Fetch an IRS trade from Calypso, retrieve yield curve from Bloomberg, and calculate MTM and DV01."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The Calypso IRS trade identifier."
            - name: curve_id
              in: body
              type: string
              description: "The Bloomberg yield curve identifier (e.g., YCSW0023 Index)."
          steps:
            - name: get-trade
              type: call
              call: "calypso.get-trade"
              with:
                trade_id: "{{trade_id}}"
            - name: get-curve
              type: call
              call: "bloomberg.get-yield-curve"
              with:
                curve_id: "{{curve_id}}"
            - name: get-valuation
              type: call
              call: "calypso.get-valuation"
              with:
                trade_id: "{{trade_id}}"
                curve_data: "{{get-curve.curve_points}}"
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/calypsoserver/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
        - name: valuations
          path: "/trades/{{trade_id}}/valuation"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-valuation
              method: POST
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: yield-curves
          path: "/curves/{{curve_id}}"
          inputParameters:
            - name: curve_id
              in: path
          operations:
            - name: get-yield-curve
              method: GET

Retrieves real-time intraday cash positions from Kyriba, checks against regulatory thresholds, and triggers a Teams alert to the treasury desk if buffers are breached.

naftiko: "0.5"
info:
  label: "Intraday Liquidity Position Monitor"
  description: "Retrieves real-time intraday cash positions from Kyriba, checks against regulatory thresholds, and triggers a Teams alert to the treasury desk if buffers are breached."
  tags:
    - treasury
    - liquidity
    - kyriba
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: treasury-intraday
      port: 8080
      tools:
        - name: monitor-intraday-liquidity
          description: "Check intraday liquidity positions in Kyriba against thresholds and alert treasury desk via Teams if breached."
          inputParameters:
            - name: entity_code
              in: body
              type: string
              description: "The Citi legal entity code."
            - name: currency
              in: body
              type: string
              description: "ISO 4217 currency code."
            - name: treasury_email
              in: body
              type: string
              description: "Treasury desk email for alert notification."
          steps:
            - name: get-position
              type: call
              call: "kyriba.get-intraday-position"
              with:
                entity_code: "{{entity_code}}"
                currency: "{{currency}}"
            - name: alert-treasury
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{treasury_email}}"
                text: "Intraday liquidity alert: Entity {{entity_code}} {{currency}} position is {{get-position.current_balance}}. Buffer: {{get-position.buffer_remaining}}. Projected outflows: {{get-position.projected_outflows}}."
  consumes:
    - type: http
      namespace: kyriba
      baseUri: "https://citi.kyriba.com/gateway/api/v1"
      authentication:
        type: bearer
        token: "$secrets.kyriba_token"
      resources:
        - name: intraday-positions
          path: "/cash/intraday?entityCode={{entity_code}}&currency={{currency}}"
          inputParameters:
            - name: entity_code
              in: query
            - name: currency
              in: query
          operations:
            - name: get-intraday-position
              method: GET
    - 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

Reviews an ISDA master agreement by extracting document data from OpenText, comparing terms against standard templates, and routing exceptions to the legal team via Pega case management.

naftiko: "0.5"
info:
  label: "ISDA Agreement Review Pipeline"
  description: "Reviews an ISDA master agreement by extracting document data from OpenText, comparing terms against standard templates, and routing exceptions to the legal team via Pega case management."
  tags:
    - legal
    - opentext
    - pega
    - isda
capability:
  exposes:
    - type: mcp
      namespace: legal-isda
      port: 8080
      tools:
        - name: review-isda-agreement
          description: "Extract and review ISDA agreement with exception routing."
          inputParameters:
            - name: agreement_id
              in: body
              type: string
              description: "The ISDA agreement document identifier."
            - name: counterparty_name
              in: body
              type: string
              description: "The counterparty name."
          steps:
            - name: get-document
              type: call
              call: "opentext.get-document"
              with:
                document_id: "{{agreement_id}}"
            - name: compare-terms
              type: call
              call: "legal-engine.compare-isda"
              with:
                document_id: "{{agreement_id}}"
                counterparty: "{{counterparty_name}}"
            - name: route-exceptions
              type: call
              call: "pega.create-case"
              with:
                case_type: "ISDAReview"
                agreement_id: "{{agreement_id}}"
                counterparty: "{{counterparty_name}}"
                exceptions: "{{compare-terms.exceptions}}"
  consumes:
    - type: http
      namespace: opentext
      baseUri: "https://opentext.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.opentext_token"
      resources:
        - name: documents
          path: "/documents/{{document_id}}"
          inputParameters:
            - name: document_id
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: legal-engine
      baseUri: "https://legal-engine.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.legal_engine_token"
      resources:
        - name: isda-comparison
          path: "/isda/compare"
          operations:
            - name: compare-isda
              method: POST
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases"
          operations:
            - name: create-case
              method: POST

Retrieves incident ticket details from Jira including priority, assignee, status, and linked change requests.

naftiko: "0.5"
info:
  label: "Jira Incident Ticket Lookup"
  description: "Retrieves incident ticket details from Jira including priority, assignee, status, and linked change requests."
  tags:
    - operations
    - jira
capability:
  exposes:
    - type: mcp
      namespace: ops-jira
      port: 8080
      tools:
        - name: get-incident-ticket
          description: "Fetch incident ticket details from Jira."
          inputParameters:
            - name: ticket_key
              in: body
              type: string
              description: "The Jira ticket key (e.g., INC-12345)."
          call: "jira.get-issue"
          with:
            ticket_key: "{{ticket_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://citi.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue/{{ticket_key}}"
          inputParameters:
            - name: ticket_key
              in: path
          operations:
            - name: get-issue
              method: GET

Retrieves a client KYC case from Pegasystems, pulls identity documents from OpenText, runs adverse media checks via Refinitiv World-Check, and updates the case status.

naftiko: "0.5"
info:
  label: "KYC Document Verification Pipeline"
  description: "Retrieves a client KYC case from Pegasystems, pulls identity documents from OpenText, runs adverse media checks via Refinitiv World-Check, and updates the case status."
  tags:
    - compliance
    - kyc
    - pega
    - opentext
    - refinitiv
    - world-check
capability:
  exposes:
    - type: mcp
      namespace: compliance-kyc
      port: 8080
      tools:
        - name: verify-kyc-documents
          description: "Given a Pega KYC case ID, retrieve client documents from OpenText, screen against Refinitiv World-Check, and update the Pega case with findings."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Pega KYC case identifier."
            - name: client_id
              in: body
              type: string
              description: "The Citi client identifier for screening."
          steps:
            - name: get-kyc-case
              type: call
              call: "pega.get-case"
              with:
                case_id: "{{case_id}}"
            - name: get-documents
              type: call
              call: "opentext.get-documents"
              with:
                folder_id: "{{get-kyc-case.document_folder_id}}"
            - name: screen-client
              type: call
              call: "world-check.screen-entity"
              with:
                entity_name: "{{get-kyc-case.client_name}}"
                entity_type: "{{get-kyc-case.entity_type}}"
            - name: update-case
              type: call
              call: "pega.update-case"
              with:
                case_id: "{{case_id}}"
                screening_result: "{{screen-client.match_status}}"
                documents_verified: "{{get-documents.count}}"
  consumes:
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/prweb/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
            - name: update-case
              method: PUT
    - type: http
      namespace: opentext
      baseUri: "https://opentext.citi.com/otcs/v2"
      authentication:
        type: bearer
        token: "$secrets.opentext_token"
      resources:
        - name: documents
          path: "/nodes/{{folder_id}}/nodes"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: get-documents
              method: GET
    - type: http
      namespace: world-check
      baseUri: "https://api.refinitiv.com/world-check/v2"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: screening
          path: "/cases/screeningRequest"
          operations:
            - name: screen-entity
              method: POST

Fetches bank statement data from Kyriba, compares against SAP general ledger postings for the same period, and opens a ServiceNow task for any discrepancies.

naftiko: "0.5"
info:
  label: "Kyriba Bank Statement Reconciliation"
  description: "Fetches bank statement data from Kyriba, compares against SAP general ledger postings for the same period, and opens a ServiceNow task for any discrepancies."
  tags:
    - treasury
    - kyriba
    - sap
    - servicenow
    - bank-statements
capability:
  exposes:
    - type: mcp
      namespace: treasury-statements
      port: 8080
      tools:
        - name: reconcile-bank-statement
          description: "Retrieve Kyriba bank statements, compare with SAP GL entries, and raise ServiceNow tasks for discrepancies."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Kyriba bank account identifier."
            - name: cost_center
              in: body
              type: string
              description: "The SAP cost center for GL comparison."
            - name: statement_date
              in: body
              type: string
              description: "The statement date in YYYY-MM-DD format."
          steps:
            - name: get-statement
              type: call
              call: "kyriba.get-statement"
              with:
                account_id: "{{account_id}}"
                date: "{{statement_date}}"
            - name: get-gl-entries
              type: call
              call: "sap.get-gl-balance"
              with:
                cost_center: "{{cost_center}}"
                date: "{{statement_date}}"
            - name: raise-discrepancy
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_bank_recon"
                short_description: "Bank statement recon: account {{account_id}} on {{statement_date}}"
                description: "Kyriba closing balance: {{get-statement.closing_balance}} {{get-statement.currency}}. SAP GL balance: {{get-gl-entries.balance}}. Account: {{account_id}}. Cost center: {{cost_center}}."
                assigned_group: "Treasury_Operations"
  consumes:
    - type: http
      namespace: kyriba
      baseUri: "https://citi.kyriba.com/gateway/api/v1"
      authentication:
        type: bearer
        token: "$secrets.kyriba_token"
      resources:
        - name: statements
          path: "/bank-statements?accountId={{account_id}}&date={{date}}"
          inputParameters:
            - name: account_id
              in: query
            - name: date
              in: query
          operations:
            - name: get-statement
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://sap.citi.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-balances
          path: "/A_GLAccountBalance?$filter=CostCenter eq '{{cost_center}}' and PostingDate eq '{{date}}'"
          inputParameters:
            - name: cost_center
              in: query
            - name: date
              in: query
          operations:
            - name: get-gl-balance
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Triggers a liquidity stress test scenario in Kyriba, retrieves results, and pushes the summary to Axiom SL for regulatory consolidation.

naftiko: "0.5"
info:
  label: "Liquidity Stress Test Runner"
  description: "Triggers a liquidity stress test scenario in Kyriba, retrieves results, and pushes the summary to Axiom SL for regulatory consolidation."
  tags:
    - treasury
    - liquidity
    - kyriba
    - axiom-sl
    - stress-testing
capability:
  exposes:
    - type: mcp
      namespace: treasury-stress
      port: 8080
      tools:
        - name: run-liquidity-stress-test
          description: "Execute a liquidity stress scenario in Kyriba and push results to Axiom SL for regulatory reporting."
          inputParameters:
            - name: scenario_id
              in: body
              type: string
              description: "The Kyriba stress test scenario identifier."
            - name: as_of_date
              in: body
              type: string
              description: "The as-of date for the stress test in YYYY-MM-DD format."
          steps:
            - name: run-scenario
              type: call
              call: "kyriba.run-stress-test"
              with:
                scenario_id: "{{scenario_id}}"
                as_of_date: "{{as_of_date}}"
            - name: get-results
              type: call
              call: "kyriba.get-stress-results"
              with:
                execution_id: "{{run-scenario.execution_id}}"
            - name: submit-to-axiom
              type: call
              call: "axiom-sl.submit-data"
              with:
                report_type: "LCR_STRESS"
                period: "{{as_of_date}}"
                payload: "{{get-results.summary}}"
  consumes:
    - type: http
      namespace: kyriba
      baseUri: "https://citi.kyriba.com/gateway/api/v1"
      authentication:
        type: bearer
        token: "$secrets.kyriba_token"
      resources:
        - name: stress-tests
          path: "/stress-tests"
          operations:
            - name: run-stress-test
              method: POST
        - name: stress-results
          path: "/stress-tests/{{execution_id}}/results"
          inputParameters:
            - name: execution_id
              in: path
          operations:
            - name: get-stress-results
              method: GET
    - type: http
      namespace: axiom-sl
      baseUri: "https://axiom.citi.com/controller/api/v1"
      authentication:
        type: bearer
        token: "$secrets.axiom_sl_token"
      resources:
        - name: data-submissions
          path: "/data/submissions"
          operations:
            - name: submit-data
              method: POST

Retrieves loan facility covenants from Loan IQ, pulls the borrower's latest financials from SAP, and creates a ServiceNow task when covenant thresholds are at risk.

naftiko: "0.5"
info:
  label: "Loan Covenant Monitoring Pipeline"
  description: "Retrieves loan facility covenants from Loan IQ, pulls the borrower's latest financials from SAP, and creates a ServiceNow task when covenant thresholds are at risk."
  tags:
    - corporate-banking
    - lending
    - loan-iq
    - sap
    - servicenow
    - covenant
capability:
  exposes:
    - type: mcp
      namespace: lending-covenants
      port: 8080
      tools:
        - name: monitor-loan-covenants
          description: "Check Loan IQ covenants against SAP financial data and raise ServiceNow tasks for threshold breaches."
          inputParameters:
            - name: facility_id
              in: body
              type: string
              description: "The Loan IQ facility identifier."
            - name: borrower_cost_center
              in: body
              type: string
              description: "The SAP cost center code for the borrower entity."
          steps:
            - name: get-covenants
              type: call
              call: "loan-iq.get-covenants"
              with:
                facility_id: "{{facility_id}}"
            - name: get-financials
              type: call
              call: "sap.get-gl-balance"
              with:
                cost_center: "{{borrower_cost_center}}"
                posting_date: "2026-03-27"
            - name: raise-alert
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_covenant_alerts"
                short_description: "Covenant monitoring: facility {{facility_id}}"
                description: "Facility {{facility_id}} covenants: {{get-covenants.covenant_summary}}. Current financials: GL balance {{get-financials.balance}}. Review required."
                assigned_group: "Credit_Risk"
  consumes:
    - type: http
      namespace: loan-iq
      baseUri: "https://loaniq.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.loaniq_token"
      resources:
        - name: covenants
          path: "/facilities/{{facility_id}}/covenants"
          inputParameters:
            - name: facility_id
              in: path
          operations:
            - name: get-covenants
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://sap.citi.com/sap/opu/odata/sap/API_GLACCOUNTBALANCE"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: gl-balances
          path: "/A_GLAccountBalance?$filter=CostCenter eq '{{cost_center}}' and PostingDate eq '{{posting_date}}'"
          inputParameters:
            - name: cost_center
              in: query
            - name: posting_date
              in: query
          operations:
            - name: get-gl-balance
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Retrieves a loan facility from Loan IQ by facility ID, returning commitment amount, available balance, maturity date, and borrower details.

naftiko: "0.5"
info:
  label: "Loan IQ Facility Status Lookup"
  description: "Retrieves a loan facility from Loan IQ by facility ID, returning commitment amount, available balance, maturity date, and borrower details."
  tags:
    - corporate-banking
    - lending
    - loan-iq
capability:
  exposes:
    - type: mcp
      namespace: lending-loaniq
      port: 8080
      tools:
        - name: get-facility-status
          description: "Fetch loan facility details from Loan IQ including commitment, availability, and maturity."
          inputParameters:
            - name: facility_id
              in: body
              type: string
              description: "The Loan IQ facility identifier."
          call: "loan-iq.get-facility"
          with:
            facility_id: "{{facility_id}}"
  consumes:
    - type: http
      namespace: loan-iq
      baseUri: "https://loaniq.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.loaniq_token"
      resources:
        - name: facilities
          path: "/facilities/{{facility_id}}"
          inputParameters:
            - name: facility_id
              in: path
          operations:
            - name: get-facility
              method: GET

Pulls Value-at-Risk data from the Calypso risk engine, retrieves market data from Bloomberg, and publishes a consolidated risk report to SharePoint for front office review.

naftiko: "0.5"
info:
  label: "Market Risk VaR Report Generator"
  description: "Pulls Value-at-Risk data from the Calypso risk engine, retrieves market data from Bloomberg, and publishes a consolidated risk report to SharePoint for front office review."
  tags:
    - risk
    - market-risk
    - calypso
    - bloomberg
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: risk-var
      port: 8080
      tools:
        - name: generate-var-report
          description: "Extract VaR metrics from Calypso, pull latest market data from Bloomberg, and publish a consolidated report to SharePoint."
          inputParameters:
            - name: desk_id
              in: body
              type: string
              description: "The trading desk identifier."
            - name: report_date
              in: body
              type: string
              description: "The VaR report date in YYYY-MM-DD format."
          steps:
            - name: get-var-data
              type: call
              call: "calypso.get-var"
              with:
                desk_id: "{{desk_id}}"
                date: "{{report_date}}"
            - name: get-market-data
              type: call
              call: "bloomberg.get-market-snapshot"
              with:
                securities: "{{get-var-data.top_contributors}}"
                date: "{{report_date}}"
            - name: publish-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "risk_reporting"
                folder_path: "VaR/{{desk_id}}/{{report_date}}"
                file_name: "var_report_{{desk_id}}_{{report_date}}.json"
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/calypsoserver/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: var-reports
          path: "/risk/var?deskId={{desk_id}}&date={{date}}"
          inputParameters:
            - name: desk_id
              in: query
            - name: date
              in: query
          operations:
            - name: get-var
              method: GET
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: market-data
          path: "/snapshots"
          operations:
            - name: get-market-snapshot
              method: POST
    - 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:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Retrieves electronic trade confirmation details from MarkitServ for OTC derivative trades.

naftiko: "0.5"
info:
  label: "MarkitServ Trade Confirmation Lookup"
  description: "Retrieves electronic trade confirmation details from MarkitServ for OTC derivative trades."
  tags:
    - derivatives
    - markitserv
capability:
  exposes:
    - type: mcp
      namespace: derivatives-markitserv
      port: 8080
      tools:
        - name: get-trade-confirmation
          description: "Fetch OTC derivative trade confirmation from MarkitServ."
          inputParameters:
            - name: confirmation_id
              in: body
              type: string
              description: "The MarkitServ confirmation identifier."
          call: "markitserv.get-confirmation"
          with:
            confirmation_id: "{{confirmation_id}}"
  consumes:
    - type: http
      namespace: markitserv
      baseUri: "https://api.markitserv.com/v1"
      authentication:
        type: bearer
        token: "$secrets.markitserv_token"
      resources:
        - name: confirmations
          path: "/confirmations/{{confirmation_id}}"
          inputParameters:
            - name: confirmation_id
              in: path
          operations:
            - name: get-confirmation
              method: GET

Retrieves the current Moody's credit rating and outlook for a given entity or instrument.

naftiko: "0.5"
info:
  label: "Moody's Credit Rating Lookup"
  description: "Retrieves the current Moody's credit rating and outlook for a given entity or instrument."
  tags:
    - credit-risk
    - moodys
capability:
  exposes:
    - type: mcp
      namespace: credit-risk-moodys
      port: 8080
      tools:
        - name: get-credit-rating
          description: "Fetch Moody's credit rating for an entity."
          inputParameters:
            - name: entity_id
              in: body
              type: string
              description: "The Moody's entity identifier."
          call: "moodys.get-rating"
          with:
            entity_id: "{{entity_id}}"
  consumes:
    - type: http
      namespace: moodys
      baseUri: "https://api.moodys.com/v1"
      authentication:
        type: bearer
        token: "$secrets.moodys_token"
      resources:
        - name: ratings
          path: "/ratings/{{entity_id}}"
          inputParameters:
            - name: entity_id
              in: path
          operations:
            - name: get-rating
              method: GET

Performs multi-currency netting by aggregating intercompany payables and receivables from SAP, calculating net positions, and executing settlements via CitiConnect with treasury notification.

naftiko: "0.5"
info:
  label: "Multi-Currency Netting Orchestrator"
  description: "Performs multi-currency netting by aggregating intercompany payables and receivables from SAP, calculating net positions, and executing settlements via CitiConnect with treasury notification."
  tags:
    - treasury
    - sap
    - citiconnect
    - microsoft-teams
    - netting
capability:
  exposes:
    - type: mcp
      namespace: treasury-netting
      port: 8080
      tools:
        - name: execute-netting-cycle
          description: "Run a multi-currency netting cycle across intercompany positions."
          inputParameters:
            - name: netting_date
              in: body
              type: string
              description: "The netting cycle date."
            - name: netting_group
              in: body
              type: string
              description: "The intercompany netting group."
          steps:
            - name: get-positions
              type: call
              call: "sap.get-intercompany-positions"
              with:
                netting_group: "{{netting_group}}"
                date: "{{netting_date}}"
            - name: calculate-nets
              type: call
              call: "netting-engine.calculate"
              with:
                positions: "{{get-positions.positions}}"
            - name: execute-settlements
              type: call
              call: "citiconnect.create-bulk-transfer"
              with:
                settlements: "{{calculate-nets.net_settlements}}"
                value_date: "{{netting_date}}"
            - name: notify-treasury
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "treasury"
                channel_id: "netting"
                text: "Netting cycle {{netting_date}} complete for group {{netting_group}}. {{calculate-nets.entity_count}} entities netted. Gross: {{get-positions.gross_total}}, Net: {{calculate-nets.net_total}}. Savings: {{calculate-nets.savings_pct}}%."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: intercompany
          path: "/intercompany/positions"
          operations:
            - name: get-intercompany-positions
              method: GET
    - type: http
      namespace: netting-engine
      baseUri: "https://netting.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.netting_token"
      resources:
        - name: calculations
          path: "/calculate"
          operations:
            - name: calculate
              method: POST
    - type: http
      namespace: citiconnect
      baseUri: "https://citiconnect.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.citiconnect_token"
      resources:
        - name: bulk-transfers
          path: "/bulk-transfers"
          operations:
            - name: create-bulk-transfer
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves a trade booking from the Murex trading system by trade ID, returning deal economics, counterparty, and lifecycle state.

naftiko: "0.5"
info:
  label: "Murex Trade Booking Lookup"
  description: "Retrieves a trade booking from the Murex trading system by trade ID, returning deal economics, counterparty, and lifecycle state."
  tags:
    - trading
    - murex
    - trade-lifecycle
capability:
  exposes:
    - type: mcp
      namespace: trading-murex
      port: 8080
      tools:
        - name: get-murex-trade
          description: "Fetch a Murex trade by ID and return its deal type, notional, currency pair, counterparty, and status."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The Murex trade identifier."
          call: "murex.get-trade"
          with:
            trade_id: "{{trade_id}}"
  consumes:
    - type: http
      namespace: murex
      baseUri: "https://murex.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.murex_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET

On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for documents, and sends a Microsoft Teams welcome message.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "On new hire creation in Workday, opens a ServiceNow onboarding ticket, provisions a SharePoint folder for documents, and sends a Microsoft Teams welcome message."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate onboarding across ServiceNow, SharePoint, 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 or business unit."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-record"
              with:
                table: "incident"
                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-folder
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "hr_onboarding_site"
                folder_path: "OnboardingDocs/{{get-employee.full_name}}_{{start_date}}"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-employee.work_email}}"
                text: "Welcome to Citi, {{get-employee.first_name}}! Your IT onboarding ticket is {{open-ticket.number}}. Documents are ready at {{provision-folder.url}}."
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - 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:/{{folder_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
          operations:
            - name: create-folder
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves nostro account balances from Kyriba, compares against correspondent bank statements via SWIFT MT950, and raises breaks as ServiceNow incidents.

naftiko: "0.5"
info:
  label: "Nostro Reconciliation Processor"
  description: "Retrieves nostro account balances from Kyriba, compares against correspondent bank statements via SWIFT MT950, and raises breaks as ServiceNow incidents."
  tags:
    - treasury
    - reconciliation
    - kyriba
    - swift
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: treasury-nostro-recon
      port: 8080
      tools:
        - name: reconcile-nostro
          description: "Compare Kyriba nostro balances with SWIFT MT950 correspondent statements and raise ServiceNow incidents for breaks."
          inputParameters:
            - name: nostro_account_id
              in: body
              type: string
              description: "The Kyriba nostro account identifier."
            - name: business_date
              in: body
              type: string
              description: "The reconciliation date in YYYY-MM-DD format."
          steps:
            - name: get-kyriba-balance
              type: call
              call: "kyriba.get-nostro-balance"
              with:
                account_id: "{{nostro_account_id}}"
                date: "{{business_date}}"
            - name: get-swift-statement
              type: call
              call: "swift.get-mt950"
              with:
                account_id: "{{nostro_account_id}}"
                date: "{{business_date}}"
            - name: raise-break
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_nostro_breaks"
                short_description: "Nostro break: {{nostro_account_id}} on {{business_date}}"
                description: "Kyriba balance: {{get-kyriba-balance.closing_balance}} {{get-kyriba-balance.currency}}. SWIFT MT950 balance: {{get-swift-statement.closing_balance}}. Difference: {{get-kyriba-balance.closing_balance}} vs {{get-swift-statement.closing_balance}}."
                assigned_group: "Treasury_Recon"
  consumes:
    - type: http
      namespace: kyriba
      baseUri: "https://citi.kyriba.com/gateway/api/v1"
      authentication:
        type: bearer
        token: "$secrets.kyriba_token"
      resources:
        - name: nostro-balances
          path: "/nostro/{{account_id}}/balance?date={{date}}"
          inputParameters:
            - name: account_id
              in: path
            - name: date
              in: query
          operations:
            - name: get-nostro-balance
              method: GET
    - type: http
      namespace: swift
      baseUri: "https://api.swiftnet.sipn.swift.com/fin/v1"
      authentication:
        type: bearer
        token: "$secrets.swift_fin_token"
      resources:
        - name: statements
          path: "/mt950?accountId={{account_id}}&date={{date}}"
          inputParameters:
            - name: account_id
              in: query
            - name: date
              in: query
          operations:
            - name: get-mt950
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Retrieves documents from OpenText Content Server by folder ID, returning document metadata, download links, and version history.

naftiko: "0.5"
info:
  label: "OpenText Document Retrieval"
  description: "Retrieves documents from OpenText Content Server by folder ID, returning document metadata, download links, and version history."
  tags:
    - operations
    - opentext
    - document-management
capability:
  exposes:
    - type: mcp
      namespace: docs-opentext
      port: 8080
      tools:
        - name: get-documents
          description: "Fetch documents from OpenText Content Server by folder ID."
          inputParameters:
            - name: folder_id
              in: body
              type: string
              description: "The OpenText folder node ID."
          call: "opentext.get-documents"
          with:
            folder_id: "{{folder_id}}"
  consumes:
    - type: http
      namespace: opentext
      baseUri: "https://opentext.citi.com/otcs/v2"
      authentication:
        type: bearer
        token: "$secrets.opentext_token"
      resources:
        - name: documents
          path: "/nodes/{{folder_id}}/nodes"
          inputParameters:
            - name: folder_id
              in: path
          operations:
            - name: get-documents
              method: GET

Manages operational incident response by creating a ServiceNow incident, pulling system health from Datadog, and escalating to the on-call team via PagerDuty with Microsoft Teams notification.

naftiko: "0.5"
info:
  label: "Operational Incident Response Pipeline"
  description: "Manages operational incident response by creating a ServiceNow incident, pulling system health from Datadog, and escalating to the on-call team via PagerDuty with Microsoft Teams notification."
  tags:
    - operations
    - servicenow
    - datadog
    - pagerduty
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-response
      port: 8080
      tools:
        - name: respond-to-incident
          description: "Create incident, gather diagnostics, and escalate via PagerDuty."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The affected service name."
            - name: severity
              in: body
              type: string
              description: "The incident severity (P1, P2, P3)."
            - name: description
              in: body
              type: string
              description: "The incident description."
          steps:
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "{{severity}} - {{service_name}}: {{description}}"
                urgency: "1"
                assignment_group: "{{service_name}}_support"
            - name: get-health
              type: call
              call: "datadog.get-metrics"
              with:
                service_name: "{{service_name}}"
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{service_name}}"
                title: "{{severity}} - {{service_name}}"
                details: "{{description}}. CPU: {{get-health.cpu_pct}}%, Error rate: {{get-health.error_rate}}%. ServiceNow: {{create-incident.number}}."
            - name: notify-team
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "technology"
                channel_id: "incidents"
                text: "{{severity}} incident for {{service_name}}: {{description}}. ServiceNow: {{create-incident.number}}. PagerDuty: {{page-oncall.incident_id}}."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now/table"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apiKey
        name: DD-API-KEY
        in: header
        value: "$secrets.datadog_api_key"
      resources:
        - name: metrics
          path: "/query"
          operations:
            - name: get-metrics
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Logs an operational risk event by creating a record in the ServiceNow GRC module and notifying the risk committee chair via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Operational Risk Event Logger"
  description: "Logs an operational risk event by creating a record in the ServiceNow GRC module and notifying the risk committee chair via Microsoft Teams."
  tags:
    - risk
    - operational-risk
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: risk-oprisk
      port: 8080
      tools:
        - name: log-oprisk-event
          description: "Log an operational risk event in ServiceNow GRC and notify the risk committee chair via Teams."
          inputParameters:
            - name: event_description
              in: body
              type: string
              description: "Description of the operational risk event."
            - name: risk_category
              in: body
              type: string
              description: "Basel risk category (e.g., EXECUTION, FRAUD, SYSTEMS)."
            - name: estimated_loss
              in: body
              type: number
              description: "Estimated financial loss in USD."
            - name: committee_chair_email
              in: body
              type: string
              description: "Risk committee chair email for notification."
          steps:
            - name: create-event
              type: call
              call: "servicenow.create-record"
              with:
                table: "sn_grc_risk_event"
                short_description: "Op risk event: {{risk_category}}"
                description: "{{event_description}}. Category: {{risk_category}}. Estimated loss: ${{estimated_loss}} USD."
                priority: "1"
            - name: notify-chair
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{committee_chair_email}}"
                text: "Operational risk event reported. Category: {{risk_category}}. Estimated loss: ${{estimated_loss}} USD. ServiceNow: {{create-event.number}}. Description: {{event_description}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-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

Screens an outbound payment against OFAC and EU sanctions lists via Refinitiv World-Check and notifies the compliance team via Microsoft Teams with results.

naftiko: "0.5"
info:
  label: "Payment Sanctions Screening Pipeline"
  description: "Screens an outbound payment against OFAC and EU sanctions lists via Refinitiv World-Check and notifies the compliance team via Microsoft Teams with results."
  tags:
    - compliance
    - sanctions
    - refinitiv
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sanctions-screening
      port: 8080
      tools:
        - name: screen-payment
          description: "Screen payment against sanctions lists and notify compliance."
          inputParameters:
            - name: payment_ref
              in: body
              type: string
              description: "The payment reference."
            - name: beneficiary_name
              in: body
              type: string
              description: "The beneficiary name."
            - name: beneficiary_country
              in: body
              type: string
              description: "The beneficiary country code."
          steps:
            - name: screen-ofac
              type: call
              call: "refinitiv.screen-entity"
              with:
                entity_name: "{{beneficiary_name}}"
                country: "{{beneficiary_country}}"
                list_type: "OFAC"
            - name: screen-eu
              type: call
              call: "refinitiv.screen-entity"
              with:
                entity_name: "{{beneficiary_name}}"
                country: "{{beneficiary_country}}"
                list_type: "EU"
            - name: notify-compliance
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "compliance"
                channel_id: "sanctions"
                text: "Sanctions screening for payment {{payment_ref}}: OFAC {{screen-ofac.match_status}}, EU {{screen-eu.match_status}}. Beneficiary: {{beneficiary_name}} ({{beneficiary_country}})."
  consumes:
    - type: http
      namespace: refinitiv
      baseUri: "https://api.refinitiv.com/worldcheck/v2"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_wc_token"
      resources:
        - name: screening
          path: "/screening"
          operations:
            - name: screen-entity
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves a Pegasystems case by ID, returning its current stage, assigned worker, SLA status, and key milestones.

naftiko: "0.5"
info:
  label: "Pega Case Status Lookup"
  description: "Retrieves a Pegasystems case by ID, returning its current stage, assigned worker, SLA status, and key milestones."
  tags:
    - operations
    - pega
    - case-management
capability:
  exposes:
    - type: mcp
      namespace: ops-pega
      port: 8080
      tools:
        - name: get-pega-case
          description: "Look up a Pega case by ID and return its stage, assignment, and SLA details."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Pega case identifier."
          call: "pega.get-case"
          with:
            case_id: "{{case_id}}"
  consumes:
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/prweb/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET

Rebalances a wealth management portfolio by fetching current allocations from Calypso, computing optimal weights via the ML engine, generating trade orders, and notifying the portfolio manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Portfolio Rebalancing Orchestrator"
  description: "Rebalances a wealth management portfolio by fetching current allocations from Calypso, computing optimal weights via the ML engine, generating trade orders, and notifying the portfolio manager via Microsoft Teams."
  tags:
    - wealth-management
    - calypso
    - machine-learning
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: wealth-rebalance
      port: 8080
      tools:
        - name: rebalance-portfolio
          description: "Run portfolio rebalancing with current allocation analysis, ML optimization, and notification."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The portfolio identifier."
            - name: risk_tolerance
              in: body
              type: string
              description: "The client risk tolerance (conservative, moderate, aggressive)."
          steps:
            - name: get-allocations
              type: call
              call: "calypso.get-positions"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: compute-weights
              type: call
              call: "ml-engine.optimize-portfolio"
              with:
                portfolio_id: "{{portfolio_id}}"
                current_positions: "{{get-allocations.positions}}"
                risk_tolerance: "{{risk_tolerance}}"
            - name: generate-orders
              type: call
              call: "calypso.create-rebalance-orders"
              with:
                portfolio_id: "{{portfolio_id}}"
                target_weights: "{{compute-weights.target_weights}}"
            - name: notify-pm
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "wealth_mgmt"
                channel_id: "rebalancing"
                text: "Portfolio {{portfolio_id}} rebalanced. {{generate-orders.order_count}} orders generated. Expected tracking error: {{compute-weights.tracking_error}}%."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: positions
          path: "/portfolios/{{portfolio_id}}/positions"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-positions
              method: GET
        - name: rebalance
          path: "/portfolios/{{portfolio_id}}/rebalance"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: create-rebalance-orders
              method: POST
    - type: http
      namespace: ml-engine
      baseUri: "https://ml.citi.com/portfolio/v1"
      authentication:
        type: bearer
        token: "$secrets.ml_engine_token"
      resources:
        - name: optimization
          path: "/optimize"
          operations:
            - name: optimize-portfolio
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Processes a prime brokerage margin call by calculating exposure in Calypso, generating the margin call in Broadridge, and notifying the client relationship manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Prime Brokerage Margin Call Pipeline"
  description: "Processes a prime brokerage margin call by calculating exposure in Calypso, generating the margin call in Broadridge, and notifying the client relationship manager via Microsoft Teams."
  tags:
    - prime-brokerage
    - calypso
    - broadridge
    - microsoft-teams
    - margin
capability:
  exposes:
    - type: mcp
      namespace: pb-margin
      port: 8080
      tools:
        - name: process-margin-call
          description: "Calculate exposure, issue margin call, and notify the relationship manager."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The prime brokerage client identifier."
          steps:
            - name: calculate-exposure
              type: call
              call: "calypso.get-exposure"
              with:
                client_id: "{{client_id}}"
            - name: issue-margin-call
              type: call
              call: "broadridge.create-margin-call"
              with:
                client_id: "{{client_id}}"
                exposure: "{{calculate-exposure.net_exposure}}"
                required_margin: "{{calculate-exposure.required_margin}}"
            - name: notify-rm
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "prime_brokerage"
                channel_id: "margin_calls"
                text: "Margin call issued for client {{client_id}}. Net exposure: {{calculate-exposure.net_exposure}}. Required: {{calculate-exposure.required_margin}}. Call ref: {{issue-margin-call.margin_call_ref}}."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: exposures
          path: "/exposures/{{client_id}}"
          inputParameters:
            - name: client_id
              in: path
          operations:
            - name: get-exposure
              method: GET
    - type: http
      namespace: broadridge
      baseUri: "https://broadridge.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.broadridge_token"
      resources:
        - name: margin-calls
          path: "/margin-calls"
          operations:
            - name: create-margin-call
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Fetches security reference data from Refinitiv Eikon including issuer, maturity, coupon, and credit rating.

naftiko: "0.5"
info:
  label: "Refinitiv Eikon Security Lookup"
  description: "Fetches security reference data from Refinitiv Eikon including issuer, maturity, coupon, and credit rating."
  tags:
    - markets
    - refinitiv
capability:
  exposes:
    - type: mcp
      namespace: markets-refinitiv
      port: 8080
      tools:
        - name: get-security-reference
          description: "Retrieve security reference data from Refinitiv Eikon."
          inputParameters:
            - name: ric
              in: body
              type: string
              description: "The Reuters Instrument Code."
          call: "refinitiv.get-security"
          with:
            ric: "{{ric}}"
  consumes:
    - type: http
      namespace: refinitiv
      baseUri: "https://api.refinitiv.com/data/pricing/v1"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: securities
          path: "/{{ric}}"
          inputParameters:
            - name: ric
              in: path
          operations:
            - name: get-security
              method: GET

Screens a client entity name against the Refinitiv World-Check database for sanctions, PEP status, and adverse media hits.

naftiko: "0.5"
info:
  label: "Refinitiv World-Check Entity Screening"
  description: "Screens a client entity name against the Refinitiv World-Check database for sanctions, PEP status, and adverse media hits."
  tags:
    - compliance
    - aml
    - refinitiv
    - world-check
    - sanctions
capability:
  exposes:
    - type: mcp
      namespace: compliance-screening
      port: 8080
      tools:
        - name: screen-entity
          description: "Screen a named entity against Refinitiv World-Check for sanctions, PEP, and adverse media matches."
          inputParameters:
            - name: entity_name
              in: body
              type: string
              description: "The full name of the entity to screen."
            - name: entity_type
              in: body
              type: string
              description: "Entity type: INDIVIDUAL or ORGANISATION."
          call: "world-check.screen-entity"
          with:
            entity_name: "{{entity_name}}"
            entity_type: "{{entity_type}}"
  consumes:
    - type: http
      namespace: world-check
      baseUri: "https://api.refinitiv.com/world-check/v2"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: screening
          path: "/cases/screeningRequest"
          operations:
            - name: screen-entity
              method: POST

Calculates regulatory capital requirements by extracting risk-weighted assets from AxiomSL, computing capital ratios, and submitting the report to the regulatory reporting system with notification to the CFO office.

naftiko: "0.5"
info:
  label: "Regulatory Capital Calculation Pipeline"
  description: "Calculates regulatory capital requirements by extracting risk-weighted assets from AxiomSL, computing capital ratios, and submitting the report to the regulatory reporting system with notification to the CFO office."
  tags:
    - regulatory
    - axiom-sl
    - microsoft-teams
    - capital
capability:
  exposes:
    - type: mcp
      namespace: regulatory-capital
      port: 8080
      tools:
        - name: calculate-regulatory-capital
          description: "Run regulatory capital calculation pipeline with AxiomSL data extraction and reporting."
          inputParameters:
            - name: reporting_date
              in: body
              type: string
              description: "The reporting date (YYYY-MM-DD)."
            - name: entity_code
              in: body
              type: string
              description: "The legal entity code."
          steps:
            - name: extract-rwa
              type: call
              call: "axiomsl.get-report-data"
              with:
                report_type: "rwa_summary"
                reporting_date: "{{reporting_date}}"
                entity: "{{entity_code}}"
            - name: submit-report
              type: call
              call: "reg-reporting.submit-capital-report"
              with:
                entity: "{{entity_code}}"
                reporting_date: "{{reporting_date}}"
                total_rwa: "{{extract-rwa.total_rwa}}"
                tier1_capital: "{{extract-rwa.tier1_capital}}"
            - name: notify-cfo
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "finance"
                channel_id: "regulatory_capital"
                text: "Capital report for {{entity_code}} ({{reporting_date}}): RWA {{extract-rwa.total_rwa}}, Tier 1 ratio {{submit-report.tier1_ratio}}%. Report ID: {{submit-report.report_id}}."
  consumes:
    - type: http
      namespace: axiomsl
      baseUri: "https://axiomsl.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.axiomsl_token"
      resources:
        - name: reports
          path: "/reports"
          operations:
            - name: get-report-data
              method: POST
    - type: http
      namespace: reg-reporting
      baseUri: "https://reg-reporting.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.reg_reporting_token"
      resources:
        - name: capital-reports
          path: "/capital-reports"
          operations:
            - name: submit-capital-report
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Extracts regulatory data from Axiom SL, validates it against internal controls in ServiceNow, and submits the final report to the regulator portal with an audit log entry.

naftiko: "0.5"
info:
  label: "Regulatory Report Submission Pipeline"
  description: "Extracts regulatory data from Axiom SL, validates it against internal controls in ServiceNow, and submits the final report to the regulator portal with an audit log entry."
  tags:
    - compliance
    - regulatory-reporting
    - axiom-sl
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: compliance-reporting
      port: 8080
      tools:
        - name: submit-regulatory-report
          description: "Extract a regulatory report from Axiom SL, validate controls in ServiceNow, and log the submission for audit."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The Axiom SL report identifier."
            - name: reporting_period
              in: body
              type: string
              description: "The reporting period in YYYY-MM format."
            - name: regulator
              in: body
              type: string
              description: "The target regulator code (e.g., FED, OCC, PRA)."
          steps:
            - name: extract-report
              type: call
              call: "axiom-sl.get-report"
              with:
                report_id: "{{report_id}}"
                period: "{{reporting_period}}"
            - name: validate-controls
              type: call
              call: "servicenow.get-controls"
              with:
                report_id: "{{report_id}}"
                category: "regulatory_{{regulator}}"
            - name: log-submission
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_regulatory_submissions"
                short_description: "Submitted {{report_id}} for {{reporting_period}} to {{regulator}}"
                description: "Report: {{report_id}}. Period: {{reporting_period}}. Regulator: {{regulator}}. Control status: {{validate-controls.overall_status}}. Data rows: {{extract-report.row_count}}."
  consumes:
    - type: http
      namespace: axiom-sl
      baseUri: "https://axiom.citi.com/controller/api/v1"
      authentication:
        type: bearer
        token: "$secrets.axiom_sl_token"
      resources:
        - name: reports
          path: "/reports/{{report_id}}?period={{period}}"
          inputParameters:
            - name: report_id
              in: path
            - name: period
              in: query
          operations:
            - name: get-report
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: controls
          path: "/table/u_controls?sysparm_query=report_id={{report_id}}^category={{category}}"
          inputParameters:
            - name: report_id
              in: query
            - name: category
              in: query
          operations:
            - name: get-controls
              method: GET
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Manages the lifecycle of a repurchase agreement by booking the opening leg in Calypso, registering collateral in Broadridge, and scheduling the closing leg notification via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Repo Trade Lifecycle Processor"
  description: "Manages the lifecycle of a repurchase agreement by booking the opening leg in Calypso, registering collateral in Broadridge, and scheduling the closing leg notification via Microsoft Teams."
  tags:
    - fixed-income
    - calypso
    - broadridge
    - microsoft-teams
    - repo
capability:
  exposes:
    - type: mcp
      namespace: fi-repo
      port: 8080
      tools:
        - name: process-repo-trade
          description: "Book repo opening leg, register collateral, and schedule closing notification."
          inputParameters:
            - name: security_id
              in: body
              type: string
              description: "The collateral security ISIN."
            - name: notional
              in: body
              type: number
              description: "The repo notional amount."
            - name: repo_rate
              in: body
              type: number
              description: "The repo rate."
            - name: term_days
              in: body
              type: number
              description: "The repo term in days."
          steps:
            - name: book-opening
              type: call
              call: "calypso.create-trade"
              with:
                product_type: "repo"
                security_id: "{{security_id}}"
                notional: "{{notional}}"
                rate: "{{repo_rate}}"
                term: "{{term_days}}"
            - name: register-collateral
              type: call
              call: "broadridge.register-collateral"
              with:
                trade_id: "{{book-opening.trade_id}}"
                security_id: "{{security_id}}"
                notional: "{{notional}}"
            - name: notify-desk
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "fixed_income"
                channel_id: "repo_desk"
                text: "Repo booked: {{book-opening.trade_id}}. Security: {{security_id}}, Notional: {{notional}}, Rate: {{repo_rate}}%, Term: {{term_days}}d. Collateral ref: {{register-collateral.collateral_ref}}."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades"
          operations:
            - name: create-trade
              method: POST
    - type: http
      namespace: broadridge
      baseUri: "https://broadridge.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.broadridge_token"
      resources:
        - name: collateral
          path: "/collateral"
          operations:
            - name: register-collateral
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves a Salesforce CRM client account by ID, returning account name, type, relationship manager, and associated opportunities.

naftiko: "0.5"
info:
  label: "Salesforce Client Account Lookup"
  description: "Retrieves a Salesforce CRM client account by ID, returning account name, type, relationship manager, and associated opportunities."
  tags:
    - corporate-banking
    - crm
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm-account
      port: 8080
      tools:
        - name: get-client-account
          description: "Fetch a Salesforce client account by ID and return its details, RM assignment, and pipeline."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account identifier."
          call: "salesforce.get-account"
          with:
            account_id: "{{account_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://citi.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Retrieves a Salesforce CRM opportunity by ID, returning stage, deal size, expected close date, and account details.

naftiko: "0.5"
info:
  label: "Salesforce CRM Opportunity Lookup"
  description: "Retrieves a Salesforce CRM opportunity by ID, returning stage, deal size, expected close date, and account details."
  tags:
    - corporate-banking
    - crm
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm-salesforce
      port: 8080
      tools:
        - name: get-opportunity
          description: "Fetch a Salesforce opportunity by ID and return its stage, amount, close date, and account name."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity identifier."
          call: "salesforce.get-opportunity"
          with:
            opportunity_id: "{{opportunity_id}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://citi.my.salesforce.com/services/data/v58.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

When a Refinitiv World-Check screening returns potential hits, creates an investigation case in Actimize and notifies the compliance officer via ServiceNow and Teams.

naftiko: "0.5"
info:
  label: "Sanctions Screening Escalation"
  description: "When a Refinitiv World-Check screening returns potential hits, creates an investigation case in Actimize and notifies the compliance officer via ServiceNow and Teams."
  tags:
    - compliance
    - sanctions
    - refinitiv
    - actimize
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliance-sanctions
      port: 8080
      tools:
        - name: escalate-sanctions-hit
          description: "Given a World-Check screening result with potential matches, open an Actimize investigation, log in ServiceNow, and notify compliance via Teams."
          inputParameters:
            - name: screening_case_id
              in: body
              type: string
              description: "The Refinitiv World-Check case ID with potential hits."
            - name: compliance_officer_email
              in: body
              type: string
              description: "The compliance officer email for Teams notification."
          steps:
            - name: get-screening
              type: call
              call: "world-check.get-case"
              with:
                case_id: "{{screening_case_id}}"
            - name: create-investigation
              type: call
              call: "actimize.create-investigation"
              with:
                entity_name: "{{get-screening.entity_name}}"
                match_count: "{{get-screening.potential_match_count}}"
                screening_id: "{{screening_case_id}}"
            - name: log-incident
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_sanctions_investigations"
                short_description: "Sanctions screening escalation: {{get-screening.entity_name}}"
                description: "World-Check case {{screening_case_id}} returned {{get-screening.potential_match_count}} potential matches. Actimize investigation: {{create-investigation.investigation_id}}."
            - name: notify-officer
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{compliance_officer_email}}"
                text: "Sanctions alert: {{get-screening.entity_name}} has {{get-screening.potential_match_count}} potential World-Check matches. Investigation {{create-investigation.investigation_id}} opened. Please review."
  consumes:
    - type: http
      namespace: world-check
      baseUri: "https://api.refinitiv.com/world-check/v2"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: cases
          path: "/cases/{{case_id}}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - type: http
      namespace: actimize
      baseUri: "https://actimize.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.actimize_token"
      resources:
        - name: investigations
          path: "/investigations"
          operations:
            - name: create-investigation
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-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

Processes a securities lending return by looking up the borrow in Broadridge, submitting the return instruction via DTCC, and notifying the securities lending desk in Microsoft Teams.

naftiko: "0.5"
info:
  label: "Securities Lending Return Processor"
  description: "Processes a securities lending return by looking up the borrow in Broadridge, submitting the return instruction via DTCC, and notifying the securities lending desk in Microsoft Teams."
  tags:
    - securities-lending
    - broadridge
    - dtcc
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sec-lending
      port: 8080
      tools:
        - name: process-lending-return
          description: "Process securities lending return through Broadridge, DTCC, and notify the desk."
          inputParameters:
            - name: borrow_ref
              in: body
              type: string
              description: "The Broadridge borrow reference."
            - name: return_quantity
              in: body
              type: number
              description: "Number of shares to return."
          steps:
            - name: get-borrow
              type: call
              call: "broadridge.get-borrow"
              with:
                borrow_ref: "{{borrow_ref}}"
            - name: submit-return
              type: call
              call: "dtcc.create-return"
              with:
                borrow_ref: "{{borrow_ref}}"
                security_id: "{{get-borrow.security_id}}"
                quantity: "{{return_quantity}}"
            - name: notify-desk
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "sec_lending"
                channel_id: "returns"
                text: "Return submitted for {{get-borrow.security_id}}: {{return_quantity}} shares. DTCC ref: {{submit-return.return_ref}}. Original borrow: {{borrow_ref}}."
  consumes:
    - type: http
      namespace: broadridge
      baseUri: "https://broadridge.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.broadridge_token"
      resources:
        - name: borrows
          path: "/borrows/{{borrow_ref}}"
          inputParameters:
            - name: borrow_ref
              in: path
          operations:
            - name: get-borrow
              method: GET
    - type: http
      namespace: dtcc
      baseUri: "https://api.dtcc.com/v2"
      authentication:
        type: bearer
        token: "$secrets.dtcc_token"
      resources:
        - name: returns
          path: "/returns"
          operations:
            - name: create-return
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves a ServiceNow change request by ID including approval status, risk assessment, and implementation schedule.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Lookup"
  description: "Retrieves a ServiceNow change request by ID including approval status, risk assessment, and implementation schedule."
  tags:
    - operations
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: ops-servicenow
      port: 8080
      tools:
        - name: get-change-request
          description: "Fetch a change request from ServiceNow."
          inputParameters:
            - name: change_id
              in: body
              type: string
              description: "The ServiceNow change request ID."
          call: "servicenow.get-change"
          with:
            change_id: "{{change_id}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now/table"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: change-requests
          path: "/change_request/{{change_id}}"
          inputParameters:
            - name: change_id
              in: path
          operations:
            - name: get-change
              method: GET

Retrieves a ServiceNow incident by number, returning its state, priority, assigned group, and resolution notes.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Lookup"
  description: "Retrieves a ServiceNow incident by number, returning its state, priority, assigned group, and resolution notes."
  tags:
    - operations
    - servicenow
    - incident
capability:
  exposes:
    - type: mcp
      namespace: ops-servicenow
      port: 8080
      tools:
        - name: get-incident
          description: "Look up a ServiceNow incident by number and return its current state, priority, and assignment."
          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}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://citi.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

Executes a security log search query in Splunk and returns matching events for security operations analysis.

naftiko: "0.5"
info:
  label: "Splunk Security Log Query"
  description: "Executes a security log search query in Splunk and returns matching events for security operations analysis."
  tags:
    - security
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: security-splunk
      port: 8080
      tools:
        - name: search-security-logs
          description: "Run a security log search in Splunk."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The Splunk search query string."
          call: "splunk.create-search"
          with:
            search: "{{search_query}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.citi.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST

Prices a structured product by fetching market data from Bloomberg, running Monte Carlo simulation in the pricing engine, and storing results in Murex with notification to the structuring desk.

naftiko: "0.5"
info:
  label: "Structured Product Pricing Pipeline"
  description: "Prices a structured product by fetching market data from Bloomberg, running Monte Carlo simulation in the pricing engine, and storing results in Murex with notification to the structuring desk."
  tags:
    - structured-products
    - bloomberg
    - murex
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: structured-products
      port: 8080
      tools:
        - name: price-structured-product
          description: "Price a structured product with market data, simulation, and booking."
          inputParameters:
            - name: product_id
              in: body
              type: string
              description: "The structured product identifier."
            - name: underlying
              in: body
              type: string
              description: "The underlying asset ticker."
          steps:
            - name: get-market-data
              type: call
              call: "bloomberg.get-snapshot"
              with:
                security_id: "{{underlying}}"
            - name: run-pricing
              type: call
              call: "pricing-engine.monte-carlo"
              with:
                product_id: "{{product_id}}"
                spot_price: "{{get-market-data.last_price}}"
                volatility: "{{get-market-data.implied_vol}}"
            - name: book-result
              type: call
              call: "murex.update-trade"
              with:
                product_id: "{{product_id}}"
                theoretical_value: "{{run-pricing.fair_value}}"
                delta: "{{run-pricing.delta}}"
            - name: notify-desk
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "structuring"
                channel_id: "pricing"
                text: "Structured product {{product_id}} priced. Underlying: {{underlying}} at {{get-market-data.last_price}}. Fair value: {{run-pricing.fair_value}}. Delta: {{run-pricing.delta}}."
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://bsapi.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: snapshots
          path: "/snapshots/{{security_id}}"
          inputParameters:
            - name: security_id
              in: path
          operations:
            - name: get-snapshot
              method: GET
    - type: http
      namespace: pricing-engine
      baseUri: "https://pricing.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.pricing_engine_token"
      resources:
        - name: monte-carlo
          path: "/monte-carlo"
          operations:
            - name: monte-carlo
              method: POST
    - type: http
      namespace: murex
      baseUri: "https://murex.citi.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.murex_token"
      resources:
        - name: trades
          path: "/trades/{{product_id}}"
          inputParameters:
            - name: product_id
              in: path
          operations:
            - name: update-trade
              method: PUT
    - 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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Queries the SWIFT gpi tracker for real-time payment status by UETR, returning settlement chain and fees charged.

naftiko: "0.5"
info:
  label: "SWIFT Payment Status Lookup"
  description: "Queries the SWIFT gpi tracker for real-time payment status by UETR, returning settlement chain and fees charged."
  tags:
    - payments
    - swift
    - gpi
capability:
  exposes:
    - type: mcp
      namespace: payments-swift
      port: 8080
      tools:
        - name: get-swift-payment-status
          description: "Look up a SWIFT gpi payment by UETR and return its current settlement status, intermediary chain, and total fees."
          inputParameters:
            - name: uetr
              in: body
              type: string
              description: "The Unique End-to-end Transaction Reference for the SWIFT payment."
          call: "swift-gpi.get-payment-status"
          with:
            uetr: "{{uetr}}"
  consumes:
    - type: http
      namespace: swift-gpi
      baseUri: "https://api.swiftnet.sipn.swift.com/gpi/v4"
      authentication:
        type: bearer
        token: "$secrets.swift_gpi_token"
      resources:
        - name: payment-transactions
          path: "/payment_transactions/{{uetr}}"
          inputParameters:
            - name: uetr
              in: path
          operations:
            - name: get-payment-status
              method: GET

Processes a syndicated loan allocation by retrieving facility details from LoanIQ, booking allocations in Calypso, and emailing confirmation to syndicate members via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Syndicated Loan Allocation Processor"
  description: "Processes a syndicated loan allocation by retrieving facility details from LoanIQ, booking allocations in Calypso, and emailing confirmation to syndicate members via Microsoft Outlook."
  tags:
    - lending
    - loan-iq
    - calypso
    - microsoft-outlook
    - syndication
capability:
  exposes:
    - type: mcp
      namespace: syndicated-lending
      port: 8080
      tools:
        - name: process-loan-allocation
          description: "Process syndicated loan allocation across LoanIQ, Calypso, and email confirmations."
          inputParameters:
            - name: facility_id
              in: body
              type: string
              description: "The LoanIQ facility identifier."
            - name: allocation_amount
              in: body
              type: number
              description: "The total allocation amount."
          steps:
            - name: get-facility
              type: call
              call: "loaniq.get-facility"
              with:
                facility_id: "{{facility_id}}"
            - name: book-allocation
              type: call
              call: "calypso.create-trade"
              with:
                product_type: "syndicated_loan"
                facility_id: "{{facility_id}}"
                amount: "{{allocation_amount}}"
                currency: "{{get-facility.currency}}"
            - name: send-confirmation
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{get-facility.agent_email}}"
                subject: "Loan Allocation Confirmation - {{facility_id}}"
                body: "Allocation of {{allocation_amount}} {{get-facility.currency}} booked for facility {{facility_id}}. Calypso ref: {{book-allocation.trade_id}}."
  consumes:
    - type: http
      namespace: loaniq
      baseUri: "https://loaniq.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.loaniq_token"
      resources:
        - name: facilities
          path: "/facilities/{{facility_id}}"
          inputParameters:
            - name: facility_id
              in: path
          operations:
            - name: get-facility
              method: GET
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades"
          operations:
            - name: create-trade
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves customer account details from the Temenos T24 core banking system including balance, status, and product type.

naftiko: "0.5"
info:
  label: "Temenos Core Account Lookup"
  description: "Retrieves customer account details from the Temenos T24 core banking system including balance, status, and product type."
  tags:
    - core-banking
    - temenos
capability:
  exposes:
    - type: mcp
      namespace: core-banking-temenos
      port: 8080
      tools:
        - name: get-account
          description: "Fetch account details from Temenos T24 core banking."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Temenos account identifier."
          call: "temenos.get-account"
          with:
            account_id: "{{account_id}}"
  consumes:
    - type: http
      namespace: temenos
      baseUri: "https://temenos.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.temenos_token"
      resources:
        - name: accounts
          path: "/accounts/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

Resolves a trade break by comparing Calypso and Broadridge records, logging a ServiceNow incident, and notifying the operations team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Trade Break Resolution Pipeline"
  description: "Resolves a trade break by comparing Calypso and Broadridge records, logging a ServiceNow incident, and notifying the operations team via Microsoft Teams."
  tags:
    - operations
    - calypso
    - broadridge
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: trade-ops
      port: 8080
      tools:
        - name: resolve-trade-break
          description: "Investigate and escalate a trade break across Calypso, Broadridge, ServiceNow, and Teams."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The internal trade identifier."
          steps:
            - name: get-calypso-record
              type: call
              call: "calypso.get-trade"
              with:
                trade_id: "{{trade_id}}"
            - name: get-broadridge-record
              type: call
              call: "broadridge.get-trade"
              with:
                trade_id: "{{trade_id}}"
            - name: create-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Trade break: {{trade_id}}"
                description: "Calypso status: {{get-calypso-record.status}}, Broadridge status: {{get-broadridge-record.status}}"
                urgency: "2"
            - name: notify-ops
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "trade_ops"
                channel_id: "breaks"
                text: "Trade break detected for {{trade_id}}. Calypso: {{get-calypso-record.status}}, Broadridge: {{get-broadridge-record.status}}. ServiceNow: {{create-incident.number}}."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
    - type: http
      namespace: broadridge
      baseUri: "https://broadridge.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.broadridge_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now/table"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Retrieves an unmatched trade from Calypso, looks up the counterparty confirmation in Markitwire, and updates the match status in Calypso when confirmed.

naftiko: "0.5"
info:
  label: "Trade Confirmation Matching"
  description: "Retrieves an unmatched trade from Calypso, looks up the counterparty confirmation in Markitwire, and updates the match status in Calypso when confirmed."
  tags:
    - trading
    - post-trade
    - calypso
    - markitwire
capability:
  exposes:
    - type: mcp
      namespace: post-trade
      port: 8080
      tools:
        - name: match-trade-confirmation
          description: "Given a Calypso trade ID, check Markitwire for counterparty confirmation and update match status in Calypso."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The Calypso trade identifier."
          steps:
            - name: get-trade
              type: call
              call: "calypso.get-trade"
              with:
                trade_id: "{{trade_id}}"
            - name: check-confirmation
              type: call
              call: "markitwire.get-confirmation"
              with:
                trade_reference: "{{get-trade.external_reference}}"
                counterparty: "{{get-trade.counterparty_id}}"
            - name: update-match
              type: call
              call: "calypso.update-trade-status"
              with:
                trade_id: "{{trade_id}}"
                match_status: "{{check-confirmation.match_status}}"
                confirmed_at: "{{check-confirmation.confirmation_timestamp}}"
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/calypsoserver/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
            - name: update-trade-status
              method: PATCH
    - type: http
      namespace: markitwire
      baseUri: "https://markitwire.ihsmarkit.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.markitwire_token"
      resources:
        - name: confirmations
          path: "/confirmations?tradeRef={{trade_reference}}&counterparty={{counterparty}}"
          inputParameters:
            - name: trade_reference
              in: query
            - name: counterparty
              in: query
          operations:
            - name: get-confirmation
              method: GET

Extracts trade data from Calypso, formats it per EMIR/Dodd-Frank requirements, and submits to DTCC trade repository with an audit trail in ServiceNow.

naftiko: "0.5"
info:
  label: "Trade Regulatory Reporting Pipeline"
  description: "Extracts trade data from Calypso, formats it per EMIR/Dodd-Frank requirements, and submits to DTCC trade repository with an audit trail in ServiceNow."
  tags:
    - compliance
    - trade-reporting
    - calypso
    - dtcc
    - servicenow
    - emir
capability:
  exposes:
    - type: mcp
      namespace: trade-reporting
      port: 8080
      tools:
        - name: report-trade
          description: "Extract trade data from Calypso, submit to DTCC trade repository for regulatory reporting, and log in ServiceNow."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The Calypso trade identifier."
            - name: regulation
              in: body
              type: string
              description: "The regulation: EMIR, DODD_FRANK, MIFID2."
          steps:
            - name: get-trade
              type: call
              call: "calypso.get-trade"
              with:
                trade_id: "{{trade_id}}"
            - name: submit-report
              type: call
              call: "dtcc.submit-trade-report"
              with:
                trade_reference: "{{get-trade.external_reference}}"
                regulation: "{{regulation}}"
                product_type: "{{get-trade.product_type}}"
                notional: "{{get-trade.notional}}"
                currency: "{{get-trade.currency}}"
            - name: log-audit
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_trade_reporting_audit"
                short_description: "{{regulation}} trade report: {{trade_id}}"
                description: "Trade {{trade_id}} reported to DTCC under {{regulation}}. DTCC ref: {{submit-report.report_id}}. Product: {{get-trade.product_type}}. Notional: {{get-trade.notional}} {{get-trade.currency}}."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/calypsoserver/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
    - type: http
      namespace: dtcc
      baseUri: "https://api.dtcc.com/gtr/v1"
      authentication:
        type: bearer
        token: "$secrets.dtcc_token"
      resources:
        - name: trade-reports
          path: "/reports"
          operations:
            - name: submit-trade-report
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST

Submits MiFID II trade reports by extracting transaction details from Calypso, enriching with LEI data, and submitting to the Approved Reporting Mechanism with compliance team notification.

naftiko: "0.5"
info:
  label: "Trade Reporting MiFID Pipeline"
  description: "Submits MiFID II trade reports by extracting transaction details from Calypso, enriching with LEI data, and submitting to the Approved Reporting Mechanism with compliance team notification."
  tags:
    - regulatory
    - mifid
    - calypso
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: reg-mifid
      port: 8080
      tools:
        - name: submit-mifid-report
          description: "Extract, enrich, and submit MiFID II trade report."
          inputParameters:
            - name: trade_id
              in: body
              type: string
              description: "The Calypso trade identifier."
          steps:
            - name: get-trade
              type: call
              call: "calypso.get-trade"
              with:
                trade_id: "{{trade_id}}"
            - name: enrich-lei
              type: call
              call: "gleif.get-lei"
              with:
                entity_name: "{{get-trade.counterparty_name}}"
            - name: submit-report
              type: call
              call: "arm.submit-report"
              with:
                trade_id: "{{trade_id}}"
                lei: "{{enrich-lei.lei}}"
                instrument: "{{get-trade.instrument_id}}"
                notional: "{{get-trade.notional}}"
            - name: notify-compliance
              type: call
              call: "msteams.send-channel-message"
              with:
                team_id: "compliance"
                channel_id: "mifid_reporting"
                text: "MiFID report submitted for trade {{trade_id}}. Counterparty LEI: {{enrich-lei.lei}}. ARM ref: {{submit-report.report_id}}."
  consumes:
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
    - type: http
      namespace: gleif
      baseUri: "https://api.gleif.org/api/v1"
      authentication:
        type: apiKey
        name: X-API-Key
        in: header
        value: "$secrets.gleif_api_key"
      resources:
        - name: lei-records
          path: "/lei-records"
          operations:
            - name: get-lei
              method: GET
    - type: http
      namespace: arm
      baseUri: "https://arm-reporting.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.arm_token"
      resources:
        - name: reports
          path: "/reports"
          operations:
            - name: submit-report
              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_id}}/messages"
          inputParameters:
            - name: team_id
              in: path
            - name: channel_id
              in: path
          operations:
            - name: send-channel-message
              method: POST

Detects a failed settlement in DTCC, retrieves trade details from Calypso, opens a ServiceNow incident, and notifies the operations manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Trade Settlement Failure Handler"
  description: "Detects a failed settlement in DTCC, retrieves trade details from Calypso, opens a ServiceNow incident, and notifies the operations manager via Microsoft Teams."
  tags:
    - trading
    - settlement
    - dtcc
    - calypso
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: settlement-ops
      port: 8080
      tools:
        - name: handle-settlement-failure
          description: "Process a DTCC settlement failure by retrieving trade details, opening a ServiceNow incident, and alerting operations."
          inputParameters:
            - name: settlement_ref
              in: body
              type: string
              description: "The DTCC settlement instruction reference."
            - name: ops_manager_email
              in: body
              type: string
              description: "Operations manager email for Teams alert."
          steps:
            - name: get-settlement
              type: call
              call: "dtcc.get-settlement"
              with:
                settlement_ref: "{{settlement_ref}}"
            - name: get-trade
              type: call
              call: "calypso.get-trade"
              with:
                trade_id: "{{get-settlement.trade_id}}"
            - name: open-incident
              type: call
              call: "servicenow.create-record"
              with:
                table: "incident"
                short_description: "Settlement failure: {{settlement_ref}} — {{get-trade.counterparty}}"
                description: "DTCC ref {{settlement_ref}} failed. Trade {{get-settlement.trade_id}}, counterparty {{get-trade.counterparty}}, amount {{get-settlement.settlement_amount}} {{get-settlement.currency}}. Fail reason: {{get-settlement.fail_reason}}."
                assigned_group: "Operations_Settlement"
                priority: "2"
            - name: notify-manager
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{ops_manager_email}}"
                text: "Settlement failure alert: Ref {{settlement_ref}}, trade {{get-settlement.trade_id}}, {{get-settlement.settlement_amount}} {{get-settlement.currency}}. Reason: {{get-settlement.fail_reason}}. ServiceNow: {{open-incident.number}}."
  consumes:
    - type: http
      namespace: dtcc
      baseUri: "https://api.dtcc.com/settlement/v1"
      authentication:
        type: bearer
        token: "$secrets.dtcc_token"
      resources:
        - name: settlements
          path: "/instructions/{{settlement_ref}}"
          inputParameters:
            - name: settlement_ref
              in: path
          operations:
            - name: get-settlement
              method: GET
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/calypsoserver/api/v1"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: table-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

Escalates suspicious trading activity by retrieving the surveillance alert from Actimize, pulling trade details from Calypso, and creating a compliance investigation case in Pega.

naftiko: "0.5"
info:
  label: "Trade Surveillance Escalation Pipeline"
  description: "Escalates suspicious trading activity by retrieving the surveillance alert from Actimize, pulling trade details from Calypso, and creating a compliance investigation case in Pega."
  tags:
    - compliance
    - surveillance
    - actimize
    - calypso
    - pega
capability:
  exposes:
    - type: mcp
      namespace: surveillance
      port: 8080
      tools:
        - name: escalate-surveillance-alert
          description: "Escalate a trade surveillance alert with full trade context and investigation case."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Actimize surveillance alert ID."
          steps:
            - name: get-alert
              type: call
              call: "actimize.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: get-trades
              type: call
              call: "calypso.get-trade"
              with:
                trade_id: "{{get-alert.trade_id}}"
            - name: create-investigation
              type: call
              call: "pega.create-case"
              with:
                case_type: "TradeSurveillance"
                alert_id: "{{alert_id}}"
                trade_id: "{{get-alert.trade_id}}"
                alert_type: "{{get-alert.alert_type}}"
                trader: "{{get-trades.trader_id}}"
                notional: "{{get-trades.notional}}"
  consumes:
    - type: http
      namespace: actimize
      baseUri: "https://actimize.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.actimize_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: calypso
      baseUri: "https://calypso.citi.com/api/v4"
      authentication:
        type: bearer
        token: "$secrets.calypso_token"
      resources:
        - name: trades
          path: "/trades/{{trade_id}}"
          inputParameters:
            - name: trade_id
              in: path
          operations:
            - name: get-trade
              method: GET
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases"
          operations:
            - name: create-case
              method: POST

Fetches a transaction monitoring alert from Actimize NICE, enriches it with client data from Pegasystems CRM, and creates a SAR investigation case if the risk score exceeds threshold.

naftiko: "0.5"
info:
  label: "Transaction Monitoring Alert Triage"
  description: "Fetches a transaction monitoring alert from Actimize NICE, enriches it with client data from Pegasystems CRM, and creates a SAR investigation case if the risk score exceeds threshold."
  tags:
    - compliance
    - aml
    - actimize
    - pega
    - transaction-monitoring
capability:
  exposes:
    - type: mcp
      namespace: compliance-tm
      port: 8080
      tools:
        - name: triage-tm-alert
          description: "Given an Actimize alert ID, fetch the alert, enrich with Pega CRM client data, and escalate to a SAR case if warranted."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "The Actimize transaction monitoring alert ID."
            - name: risk_threshold
              in: body
              type: number
              description: "The risk score threshold for SAR escalation."
          steps:
            - name: get-alert
              type: call
              call: "actimize.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: get-client
              type: call
              call: "pega.get-client"
              with:
                client_id: "{{get-alert.client_id}}"
            - name: create-sar-case
              type: call
              call: "actimize.create-sar-case"
              with:
                alert_id: "{{alert_id}}"
                client_name: "{{get-client.full_name}}"
                risk_score: "{{get-alert.risk_score}}"
                narrative: "Alert {{alert_id}} for client {{get-client.full_name}} — risk score {{get-alert.risk_score}} exceeds threshold. Transaction amount: {{get-alert.transaction_amount}} {{get-alert.currency}}."
  consumes:
    - type: http
      namespace: actimize
      baseUri: "https://actimize.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.actimize_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
        - name: sar-cases
          path: "/sar-cases"
          operations:
            - name: create-sar-case
              method: POST
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/prweb/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: clients
          path: "/clients/{{client_id}}"
          inputParameters:
            - name: client_id
              in: path
          operations:
            - name: get-client
              method: GET

Fetches the current day cash position for a given currency and entity from the Kyriba treasury management system.

naftiko: "0.5"
info:
  label: "Treasury Cash Position Retrieval"
  description: "Fetches the current day cash position for a given currency and entity from the Kyriba treasury management system."
  tags:
    - treasury
    - cash-management
    - kyriba
capability:
  exposes:
    - type: mcp
      namespace: treasury
      port: 8080
      tools:
        - name: get-cash-position
          description: "Retrieve the current cash position from Kyriba for a specific legal entity and currency."
          inputParameters:
            - name: entity_code
              in: body
              type: string
              description: "The Citi legal entity code."
            - name: currency
              in: body
              type: string
              description: "The ISO 4217 currency code."
          call: "kyriba.get-cash-position"
          with:
            entity_code: "{{entity_code}}"
            currency: "{{currency}}"
  consumes:
    - type: http
      namespace: kyriba
      baseUri: "https://citi.kyriba.com/gateway/api/v1"
      authentication:
        type: bearer
        token: "$secrets.kyriba_token"
      resources:
        - name: cash-positions
          path: "/cash/balances?entityCode={{entity_code}}&currency={{currency}}"
          inputParameters:
            - name: entity_code
              in: query
            - name: currency
              in: query
          operations:
            - name: get-cash-position
              method: GET

Processes vendor invoices by extracting data from SAP, matching against purchase orders, routing for approval in Pega, and sending confirmation via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Vendor Invoice Approval Pipeline"
  description: "Processes vendor invoices by extracting data from SAP, matching against purchase orders, routing for approval in Pega, and sending confirmation via Microsoft Outlook."
  tags:
    - procurement
    - sap
    - pega
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: procurement
      port: 8080
      tools:
        - name: process-vendor-invoice
          description: "Process a vendor invoice through SAP matching, Pega approval, and email confirmation."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "The vendor invoice number."
            - name: vendor_id
              in: body
              type: string
              description: "The SAP vendor identifier."
          steps:
            - name: get-invoice
              type: call
              call: "sap.get-invoice"
              with:
                invoice_number: "{{invoice_number}}"
                vendor_id: "{{vendor_id}}"
            - name: match-po
              type: call
              call: "sap.match-purchase-order"
              with:
                invoice_number: "{{invoice_number}}"
                po_number: "{{get-invoice.po_number}}"
            - name: route-approval
              type: call
              call: "pega.create-case"
              with:
                case_type: "InvoiceApproval"
                invoice_number: "{{invoice_number}}"
                amount: "{{get-invoice.amount}}"
                match_status: "{{match-po.match_status}}"
            - name: confirm-vendor
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{get-invoice.vendor_email}}"
                subject: "Invoice {{invoice_number}} Received"
                body: "Your invoice {{invoice_number}} for {{get-invoice.amount}} {{get-invoice.currency}} has been received and is under review. Case: {{route-approval.case_id}}."
  consumes:
    - type: http
      namespace: sap
      baseUri: "https://sap.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.sap_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_number}}"
          inputParameters:
            - name: invoice_number
              in: path
          operations:
            - name: get-invoice
              method: GET
        - name: purchase-orders
          path: "/purchase-orders/match"
          operations:
            - name: match-purchase-order
              method: POST
    - type: http
      namespace: pega
      baseUri: "https://pega.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.pega_token"
      resources:
        - name: cases
          path: "/cases"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/me/sendMail"
          operations:
            - name: send-mail
              method: POST

Retrieves a wealth management client portfolio from Aladdin, pulls the client relationship details from Salesforce CRM, and sends a consolidated summary to the advisor via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Wealth Client Portfolio Summary"
  description: "Retrieves a wealth management client portfolio from Aladdin, pulls the client relationship details from Salesforce CRM, and sends a consolidated summary to the advisor via Microsoft Teams."
  tags:
    - wealth-management
    - portfolio
    - aladdin
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: wealth-portfolio
      port: 8080
      tools:
        - name: get-portfolio-summary
          description: "Fetch a client portfolio from Aladdin, enrich with Salesforce CRM data, and deliver a summary to the advisor via Teams."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: client_sf_id
              in: body
              type: string
              description: "The Salesforce client account ID."
            - name: advisor_email
              in: body
              type: string
              description: "The wealth advisor email for Teams delivery."
          steps:
            - name: get-portfolio
              type: call
              call: "aladdin.get-portfolio"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: get-client
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{client_sf_id}}"
            - name: notify-advisor
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{advisor_email}}"
                text: "Portfolio summary for {{get-client.name}}: AUM {{get-portfolio.total_aum}} {{get-portfolio.currency}}. YTD return: {{get-portfolio.ytd_return}}%. Top holding: {{get-portfolio.top_holding}}."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: portfolios
          path: "/portfolios/{{portfolio_id}}/summary"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-portfolio
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://citi.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: 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

Assembles a client review package by pulling portfolio data from Aladdin, CRM notes from Salesforce, and market commentary from Bloomberg, then uploads to SharePoint for the advisor.

naftiko: "0.5"
info:
  label: "Wealth Client Review Preparation"
  description: "Assembles a client review package by pulling portfolio data from Aladdin, CRM notes from Salesforce, and market commentary from Bloomberg, then uploads to SharePoint for the advisor."
  tags:
    - wealth-management
    - aladdin
    - salesforce
    - bloomberg
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: wealth-review
      port: 8080
      tools:
        - name: prepare-client-review
          description: "Assemble a wealth client review package from Aladdin portfolio data, Salesforce CRM notes, Bloomberg market commentary, and upload to SharePoint."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: client_sf_id
              in: body
              type: string
              description: "The Salesforce client account ID."
            - name: advisor_site_id
              in: body
              type: string
              description: "The SharePoint site ID for the advisor."
          steps:
            - name: get-portfolio
              type: call
              call: "aladdin.get-portfolio"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: get-crm-notes
              type: call
              call: "salesforce.get-activity-history"
              with:
                account_id: "{{client_sf_id}}"
            - name: get-market-commentary
              type: call
              call: "bloomberg.get-research"
              with:
                topic: "{{get-portfolio.primary_sector}}"
            - name: upload-package
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "{{advisor_site_id}}"
                folder_path: "ClientReviews/{{get-portfolio.client_name}}"
                file_name: "review_package.json"
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: portfolios
          path: "/portfolios/{{portfolio_id}}/summary"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-portfolio
              method: GET
    - type: http
      namespace: salesforce
      baseUri: "https://citi.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: activity-history
          path: "/sobjects/Account/{{account_id}}/ActivityHistories"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-activity-history
              method: GET
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: research
          path: "/research?topic={{topic}}"
          inputParameters:
            - name: topic
              in: query
          operations:
            - name: get-research
              method: GET
    - 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:/{{folder_path}}/{{file_name}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: folder_path
              in: path
            - name: file_name
              in: path
          operations:
            - name: upload-file
              method: PUT

Runs a suitability assessment for a wealth management client by pulling the client profile from Salesforce, evaluating product fit via the suitability engine, and documenting results in OpenText.

naftiko: "0.5"
info:
  label: "Wealth Suitability Assessment Pipeline"
  description: "Runs a suitability assessment for a wealth management client by pulling the client profile from Salesforce, evaluating product fit via the suitability engine, and documenting results in OpenText."
  tags:
    - wealth-management
    - salesforce
    - compliance
    - opentext
capability:
  exposes:
    - type: mcp
      namespace: wealth-suitability
      port: 8080
      tools:
        - name: assess-suitability
          description: "Run product suitability assessment for a wealth client."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The Salesforce client identifier."
            - name: product_id
              in: body
              type: string
              description: "The investment product identifier."
          steps:
            - name: get-client
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{client_id}}"
            - name: evaluate-suitability
              type: call
              call: "suitability-engine.evaluate"
              with:
                client_id: "{{client_id}}"
                product_id: "{{product_id}}"
                risk_profile: "{{get-client.Risk_Profile__c}}"
                net_worth: "{{get-client.Net_Worth__c}}"
            - name: store-assessment
              type: call
              call: "opentext.upload-document"
              with:
                folder: "/suitability/{{client_id}}"
                content: "{{evaluate-suitability.assessment_report}}"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://citi.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: suitability-engine
      baseUri: "https://suitability.citi.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.suitability_token"
      resources:
        - name: evaluations
          path: "/evaluate"
          operations:
            - name: evaluate
              method: POST
    - type: http
      namespace: opentext
      baseUri: "https://opentext.citi.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.opentext_token"
      resources:
        - name: documents
          path: "/documents"
          operations:
            - name: upload-document
              method: POST

Screens a wire transfer for fraud by scoring it via the ML fraud model, checking the beneficiary against sanctions lists in Refinitiv World-Check, and routing flagged transactions to the fraud team via ServiceNow.

naftiko: "0.5"
info:
  label: "Wire Transfer Fraud Detection Pipeline"
  description: "Screens a wire transfer for fraud by scoring it via the ML fraud model, checking the beneficiary against sanctions lists in Refinitiv World-Check, and routing flagged transactions to the fraud team via ServiceNow."
  tags:
    - fraud
    - payments
    - refinitiv
    - servicenow
    - machine-learning
capability:
  exposes:
    - type: mcp
      namespace: fraud-detection
      port: 8080
      tools:
        - name: screen-wire-transfer
          description: "Screen a wire transfer for fraud using ML scoring, sanctions check, and case creation."
          inputParameters:
            - name: payment_ref
              in: body
              type: string
              description: "The wire transfer payment reference."
            - name: beneficiary_name
              in: body
              type: string
              description: "The beneficiary name."
            - name: amount
              in: body
              type: number
              description: "The transfer amount."
          steps:
            - name: score-transaction
              type: call
              call: "fraud-ml.score-transaction"
              with:
                payment_ref: "{{payment_ref}}"
                amount: "{{amount}}"
                beneficiary_name: "{{beneficiary_name}}"
            - name: screen-beneficiary
              type: call
              call: "refinitiv.screen-entity"
              with:
                entity_name: "{{beneficiary_name}}"
            - name: create-case
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Fraud alert: Wire {{payment_ref}}"
                description: "Fraud score: {{score-transaction.fraud_score}}. Sanctions hit: {{screen-beneficiary.match_found}}. Amount: {{amount}}."
                urgency: "1"
  consumes:
    - type: http
      namespace: fraud-ml
      baseUri: "https://ml.citi.com/fraud/v1"
      authentication:
        type: bearer
        token: "$secrets.fraud_ml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score-transaction
              method: POST
    - type: http
      namespace: refinitiv
      baseUri: "https://api.refinitiv.com/worldcheck/v2"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_wc_token"
      resources:
        - name: screening
          path: "/screening"
          operations:
            - name: screen-entity
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://citi.service-now.com/api/now/table"
      authentication:
        type: bearer
        token: "$secrets.servicenow_token"
      resources:
        - name: incidents
          path: "/incident"
          operations:
            - name: create-incident
              method: POST

Retrieves employee compensation details from Workday including base salary, bonus structure, and equity grants.

naftiko: "0.5"
info:
  label: "Workday Compensation Lookup"
  description: "Retrieves employee compensation details from Workday including base salary, bonus structure, and equity grants."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-workday
      port: 8080
      tools:
        - name: get-compensation
          description: "Fetch employee compensation details from Workday."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "The Workday employee identifier."
          call: "workday.get-compensation"
          with:
            employee_id: "{{employee_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd5-impl.workday.com/ccx/api/v1/citi"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/workers/{{employee_id}}/compensation"
          inputParameters:
            - name: employee_id
              in: path
          operations:
            - name: get-compensation
              method: GET

Retrieves employee profile information from Workday HCM by worker ID, returning name, department, cost center, and reporting chain.

naftiko: "0.5"
info:
  label: "Workday Employee Lookup"
  description: "Retrieves employee profile information from Workday HCM by worker ID, returning name, department, cost center, and reporting chain."
  tags:
    - hr
    - workday
    - employee
capability:
  exposes:
    - type: mcp
      namespace: hr-workday
      port: 8080
      tools:
        - name: get-employee
          description: "Fetch employee details from Workday by worker ID."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          call: "workday.get-worker"
          with:
            worker_id: "{{worker_id}}"
  consumes:
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET