Blackrock Capabilities

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

Sort
Expand

Monitors Aladdin for exposure limit breaches, creates a compliance Jira ticket, notifies the risk committee via Microsoft Teams, and logs the breach in Snowflake for regulatory reporting.

naftiko: "0.5"
info:
  label: "Aladdin Exposure Limit Breach Handler"
  description: "Monitors Aladdin for exposure limit breaches, creates a compliance Jira ticket, notifies the risk committee via Microsoft Teams, and logs the breach in Snowflake for regulatory reporting."
  tags:
    - compliance
    - risk-analytics
    - aladdin
    - jira
    - microsoft-teams
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: limit-breach
      port: 8080
      tools:
        - name: handle-limit-breach
          description: "Process an exposure limit breach with escalation, notification, and audit logging."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: limit_type
              in: body
              type: string
              description: "Type of limit breached (e.g. sector, issuer, duration)."
            - name: risk_committee_channel
              in: body
              type: string
              description: "Teams channel ID for risk committee."
          steps:
            - name: get-breach-details
              type: call
              call: "aladdin.get-limit-breaches"
              with:
                portfolio_id: "{{portfolio_id}}"
                limit_type: "{{limit_type}}"
            - name: create-compliance-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "COMPLIANCE"
                summary: "Exposure limit breach: {{portfolio_id}} - {{limit_type}}"
                description: "Breach details: {{get-breach-details.breach_amount}} over limit of {{get-breach-details.limit_value}}. Securities: {{get-breach-details.securities}}."
                issue_type: "Bug"
                priority: "High"
            - name: notify-risk-committee
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{risk_committee_channel}}"
                text: "LIMIT BREACH: Portfolio {{portfolio_id}}, {{limit_type}} limit exceeded by {{get-breach-details.breach_amount}}. Jira: {{create-compliance-ticket.key}}."
            - name: log-breach
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO compliance.limit_breaches VALUES ('{{portfolio_id}}', '{{limit_type}}', '{{get-breach-details.breach_amount}}', '{{create-compliance-ticket.key}}', CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: limit-breaches
          path: "/portfolios/{{portfolio_id}}/limits/breaches?type={{limit_type}}"
          inputParameters:
            - name: portfolio_id
              in: path
            - name: limit_type
              in: query
          operations:
            - name: get-limit-breaches
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Fetches current portfolio holdings from BlackRock's Aladdin platform for a given portfolio ID, returning positions, asset classes, and market values.

naftiko: "0.5"
info:
  label: "Aladdin Portfolio Holdings Retrieval"
  description: "Fetches current portfolio holdings from BlackRock's Aladdin platform for a given portfolio ID, returning positions, asset classes, and market values."
  tags:
    - portfolio-management
    - aladdin
capability:
  exposes:
    - type: mcp
      namespace: aladdin-portfolio
      port: 8080
      tools:
        - name: get-portfolio-holdings
          description: "Retrieve all current holdings for a specified Aladdin portfolio, including ticker, quantity, market value, and asset class."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
          call: "aladdin.get-holdings"
          with:
            portfolio_id: "{{portfolio_id}}"
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2/portfolios"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: holdings
          path: "/{{portfolio_id}}/holdings"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-holdings
              method: GET

Triggers an Aladdin portfolio rebalance, retrieves the proposed trades, publishes results to a Kafka topic for downstream systems, and notifies the portfolio manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Aladdin Rebalance and Notification Workflow"
  description: "Triggers an Aladdin portfolio rebalance, retrieves the proposed trades, publishes results to a Kafka topic for downstream systems, and notifies the portfolio manager via Microsoft Teams."
  tags:
    - portfolio-management
    - rebalancing
    - aladdin
    - apache-kafka
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: rebalance-workflow
      port: 8080
      tools:
        - name: trigger-rebalance
          description: "Run an Aladdin rebalance for a portfolio and distribute results."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: model_id
              in: body
              type: string
              description: "The target model portfolio ID."
            - name: pm_email
              in: body
              type: string
              description: "Portfolio manager email for notification."
          steps:
            - name: run-rebalance
              type: call
              call: "aladdin.trigger-rebalance"
              with:
                portfolio_id: "{{portfolio_id}}"
                model_id: "{{model_id}}"
            - name: get-proposed-trades
              type: call
              call: "aladdin.get-proposed-trades"
              with:
                rebalance_id: "{{run-rebalance.rebalance_id}}"
            - name: publish-trades
              type: call
              call: "kafka.produce-message"
              with:
                topic: "portfolio.rebalance.proposed-trades"
                key: "{{portfolio_id}}"
                value: "{{get-proposed-trades.trades}}"
            - name: notify-pm
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{pm_email}}"
                text: "Rebalance complete for portfolio {{portfolio_id}}. {{get-proposed-trades.trade_count}} proposed trades generated against model {{model_id}}."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: rebalance
          path: "/portfolios/{{portfolio_id}}/rebalance"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: trigger-rebalance
              method: POST
        - name: proposed-trades
          path: "/rebalances/{{rebalance_id}}/trades"
          inputParameters:
            - name: rebalance_id
              in: path
          operations:
            - name: get-proposed-trades
              method: GET
    - type: http
      namespace: kafka
      baseUri: "https://kafka-rest.blackrock.com/v3"
      authentication:
        type: bearer
        token: "$secrets.kafka_rest_token"
      resources:
        - name: records
          path: "/clusters/main/topics/{{topic}}/records"
          inputParameters:
            - name: topic
              in: path
          operations:
            - name: produce-message
              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

Triggers an Alteryx analytics workflow for portfolio risk decomposition, waits for completion, and stores the output in Snowflake.

naftiko: "0.5"
info:
  label: "Alteryx Analytics Workflow Trigger"
  description: "Triggers an Alteryx analytics workflow for portfolio risk decomposition, waits for completion, and stores the output in Snowflake."
  tags:
    - analytics
    - alteryx
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: alteryx-analytics
      port: 8080
      tools:
        - name: run-alteryx-workflow
          description: "Trigger an Alteryx workflow and persist results to Snowflake."
          inputParameters:
            - name: workflow_id
              in: body
              type: string
              description: "The Alteryx Server workflow ID."
            - name: portfolio_id
              in: body
              type: string
              description: "Portfolio identifier to pass as workflow parameter."
          steps:
            - name: trigger-workflow
              type: call
              call: "alteryx.run-workflow"
              with:
                workflow_id: "{{workflow_id}}"
                parameters: "{\"portfolio_id\": \"{{portfolio_id}}\"}"
            - name: store-output
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO analytics.alteryx_results SELECT * FROM TABLE(RESULT_SCAN('{{trigger-workflow.job_id}}'))"
  consumes:
    - type: http
      namespace: alteryx
      baseUri: "https://alteryx.blackrock.com/api/v3"
      authentication:
        type: bearer
        token: "$secrets.alteryx_token"
      resources:
        - name: workflows
          path: "/workflows/{{workflow_id}}/jobs"
          inputParameters:
            - name: workflow_id
              in: path
          operations:
            - name: run-workflow
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Screens transactions against sanctions lists in Snowflake, generates risk scores via Azure ML, creates compliance cases in ServiceNow, and alerts the AML team via PagerDuty.

naftiko: "0.5"
info:
  label: "AML Transaction Screening Pipeline"
  description: "Screens transactions against sanctions lists in Snowflake, generates risk scores via Azure ML, creates compliance cases in ServiceNow, and alerts the AML team via PagerDuty."
  tags:
    - aml
    - compliance
    - snowflake
    - azure-machine-learning
    - servicenow
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: aml-screening
      port: 8080
      tools:
        - name: screen-transactions
          description: "Screen transactions, score risk, create cases, and alert AML team."
          inputParameters:
            - name: batch_id
              in: body
              type: string
              description: "The transaction batch identifier."
            - name: pagerduty_service
              in: body
              type: string
              description: "PagerDuty service for AML alerts."
          steps:
            - name: screen-sanctions
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL SCREEN_SANCTIONS('{{batch_id}}')"
                warehouse: "COMPLIANCE_WH"
            - name: score-risk
              type: call
              call: "azureml.score"
              with:
                model_type: "aml_risk"
                data: "{{screen-sanctions.flagged_transactions}}"
            - name: create-case
              type: call
              call: "servicenow.create-record"
              with:
                table: "u_aml_case"
                batch_id: "{{batch_id}}"
                flagged_count: "{{score-risk.high_risk_count}}"
                total_screened: "{{screen-sanctions.total_screened}}"
            - name: alert-aml
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{pagerduty_service}}"
                title: "AML: {{score-risk.high_risk_count}} high-risk transactions in batch {{batch_id}}"
                urgency: "high"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: azureml
      baseUri: "https://blackrock-ml.eastus.inference.ml.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azureml_token"
      resources:
        - name: scoring
          path: "/score"
          operations:
            - name: score
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/{{table}}"
          inputParameters:
            - name: table
              in: path
          operations:
            - name: create-record
              method: POST
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Triggers an Apache Airflow DAG for overnight batch processing of portfolio valuations, monitors its status, and posts completion to Kafka for downstream consumers.

naftiko: "0.5"
info:
  label: "Apache Airflow DAG Trigger and Monitor"
  description: "Triggers an Apache Airflow DAG for overnight batch processing of portfolio valuations, monitors its status, and posts completion to Kafka for downstream consumers."
  tags:
    - data-engineering
    - batch-processing
    - apache-airflow
    - apache-kafka
capability:
  exposes:
    - type: mcp
      namespace: airflow-orchestration
      port: 8080
      tools:
        - name: trigger-valuation-dag
          description: "Trigger and monitor an Airflow DAG for portfolio valuation processing."
          inputParameters:
            - name: dag_id
              in: body
              type: string
              description: "The Airflow DAG identifier."
            - name: portfolio_id
              in: body
              type: string
              description: "Portfolio to process."
          steps:
            - name: trigger-dag
              type: call
              call: "airflow.trigger-dag"
              with:
                dag_id: "{{dag_id}}"
                conf: "{\"portfolio_id\": \"{{portfolio_id}}\"}"
            - name: get-dag-status
              type: call
              call: "airflow.get-dag-run"
              with:
                dag_id: "{{dag_id}}"
                run_id: "{{trigger-dag.dag_run_id}}"
            - name: publish-completion
              type: call
              call: "kafka.produce-message"
              with:
                topic: "batch.valuation.complete"
                key: "{{portfolio_id}}"
                value: "{\"dag_id\": \"{{dag_id}}\", \"status\": \"{{get-dag-status.state}}\", \"portfolio_id\": \"{{portfolio_id}}\"}"
  consumes:
    - type: http
      namespace: airflow
      baseUri: "https://airflow.blackrock.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.airflow_token"
      resources:
        - name: dag-runs
          path: "/dags/{{dag_id}}/dagRuns"
          inputParameters:
            - name: dag_id
              in: path
          operations:
            - name: trigger-dag
              method: POST
        - name: dag-run-status
          path: "/dags/{{dag_id}}/dagRuns/{{run_id}}"
          inputParameters:
            - name: dag_id
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-dag-run
              method: GET
    - type: http
      namespace: kafka
      baseUri: "https://kafka-rest.blackrock.com/v3"
      authentication:
        type: bearer
        token: "$secrets.kafka_rest_token"
      resources:
        - name: records
          path: "/clusters/main/topics/{{topic}}/records"
          inputParameters:
            - name: topic
              in: path
          operations:
            - name: produce-message
              method: POST

Checks API gateway health via Datadog, scales Kubernetes pods if latency exceeds thresholds, logs the scaling event in ServiceNow, and notifies the platform team via Teams.

naftiko: "0.5"
info:
  label: "API Gateway Health and Scaling Pipeline"
  description: "Checks API gateway health via Datadog, scales Kubernetes pods if latency exceeds thresholds, logs the scaling event in ServiceNow, and notifies the platform team via Teams."
  tags:
    - platform
    - datadog
    - kubernetes
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: gateway-scaling
      port: 8080
      tools:
        - name: check-and-scale-gateway
          description: "Monitor API gateway health and auto-scale if needed."
          inputParameters:
            - name: gateway_service
              in: body
              type: string
              description: "The API gateway service name."
            - name: latency_threshold_ms
              in: body
              type: integer
              description: "P99 latency threshold in milliseconds."
          steps:
            - name: check-metrics
              type: call
              call: "datadog.query-metrics"
              with:
                query: "p99:trace.http.request{service:{{gateway_service}}}"
                period: "15m"
            - name: scale-pods
              type: call
              call: "kubernetes.scale-deployment"
              with:
                namespace: "api-gateway"
                deployment: "{{gateway_service}}"
                replicas: 10
            - name: log-event
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "Auto-scale: {{gateway_service}} scaled to 10 replicas"
                description: "P99 latency exceeded {{latency_threshold_ms}}ms. Auto-scaled to 10 replicas."
                category: "auto_scaling"
            - name: notify-platform
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "platform-team@blackrock.com"
                text: "API gateway {{gateway_service}} auto-scaled. Change request: {{log-event.number}}."
  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"
          inputParameters:
            - name: query
              in: query
            - name: period
              in: query
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: kubernetes
      baseUri: "https://aks.blackrock.com/apis/apps/v1"
      authentication:
        type: bearer
        token: "$secrets.k8s_token"
      resources:
        - name: deployments
          path: "/namespaces/{{namespace}}/deployments/{{deployment}}/scale"
          inputParameters:
            - name: namespace
              in: path
            - name: deployment
              in: path
          operations:
            - name: scale-deployment
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              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

Invokes an AWS Lambda function for serverless data processing in investment analytics pipelines.

naftiko: "0.5"
info:
  label: "AWS Lambda Function Invocation"
  description: "Invokes an AWS Lambda function for serverless data processing in investment analytics pipelines."
  tags:
    - serverless
    - aws-lambda
capability:
  exposes:
    - type: mcp
      namespace: aws-lambda
      port: 8080
      tools:
        - name: invoke-function
          description: "Invoke an AWS Lambda function by name."
          inputParameters:
            - name: function_name
              in: body
              type: string
              description: "The Lambda function name or ARN."
            - name: payload
              in: body
              type: string
              description: "JSON payload to pass to the function."
          call: "lambda.invoke"
          with:
            function_name: "{{function_name}}"
            payload: "{{payload}}"
          outputParameters:
            - name: status_code
              type: integer
              mapping: "$.StatusCode"
            - name: response_payload
              type: string
              mapping: "$.Payload"
  consumes:
    - type: http
      namespace: lambda
      baseUri: "https://lambda.us-east-1.amazonaws.com/2015-03-31"
      authentication:
        type: aws-sigv4
        accessKeyId: "$secrets.aws_access_key"
        secretAccessKey: "$secrets.aws_secret_key"
      resources:
        - name: functions
          path: "/functions/{{function_name}}/invocations"
          inputParameters:
            - name: function_name
              in: path
          operations:
            - name: invoke
              method: POST

Retrieves user profile details from Azure Active Directory by UPN or object ID, returning display name, department, and manager chain.

naftiko: "0.5"
info:
  label: "Azure AD User Lookup"
  description: "Retrieves user profile details from Azure Active Directory by UPN or object ID, returning display name, department, and manager chain."
  tags:
    - identity
    - azure-active-directory
capability:
  exposes:
    - type: mcp
      namespace: azure-ad
      port: 8080
      tools:
        - name: get-user-profile
          description: "Look up an Azure AD user by UPN or object ID and return profile attributes."
          inputParameters:
            - name: user_id
              in: body
              type: string
              description: "The user principal name or Azure AD object ID."
          call: "azure-ad.get-user"
          with:
            user_id: "{{user_id}}"
  consumes:
    - type: http
      namespace: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: get-user
              method: GET

Uploads investment reports and portfolio data to Azure Blob Storage for archival and distribution.

naftiko: "0.5"
info:
  label: "Azure Blob Storage Upload"
  description: "Uploads investment reports and portfolio data to Azure Blob Storage for archival and distribution."
  tags:
    - cloud-storage
    - azure-blob-storage
capability:
  exposes:
    - type: mcp
      namespace: azure-blob
      port: 8080
      tools:
        - name: upload-blob
          description: "Upload a file to an Azure Blob Storage container."
          inputParameters:
            - name: container
              in: body
              type: string
              description: "The Azure Blob container name."
            - name: blob_name
              in: body
              type: string
              description: "The destination blob name."
          call: "azureblob.put-blob"
          with:
            container: "{{container}}"
            blob_name: "{{blob_name}}"
          outputParameters:
            - name: url
              type: string
              mapping: "$.url"
            - name: etag
              type: string
              mapping: "$.etag"
  consumes:
    - type: http
      namespace: azureblob
      baseUri: "https://blackrock.blob.core.windows.net"
      authentication:
        type: apiKey
        name: "x-ms-access-key"
        in: header
        value: "$secrets.azure_storage_key"
      resources:
        - name: blobs
          path: "/{{container}}/{{blob_name}}"
          inputParameters:
            - name: container
              in: path
            - name: blob_name
              in: path
          operations:
            - name: put-blob
              method: PUT

Checks the status of an Azure Data Factory pipeline run and sends a Grafana annotation plus a Microsoft Teams notification on completion.

naftiko: "0.5"
info:
  label: "Azure Data Factory Pipeline Monitor"
  description: "Checks the status of an Azure Data Factory pipeline run and sends a Grafana annotation plus a Microsoft Teams notification on completion."
  tags:
    - data-engineering
    - azure-data-factory
    - grafana
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: adf-monitor
      port: 8080
      tools:
        - name: monitor-adf-pipeline
          description: "Check ADF pipeline run status and notify on completion."
          inputParameters:
            - name: factory_name
              in: body
              type: string
              description: "Azure Data Factory name."
            - name: run_id
              in: body
              type: string
              description: "Pipeline run identifier."
            - name: channel_id
              in: body
              type: string
              description: "Teams channel for data engineering alerts."
          steps:
            - name: get-run-status
              type: call
              call: "adf.get-pipeline-run"
              with:
                factory_name: "{{factory_name}}"
                run_id: "{{run_id}}"
            - name: annotate-grafana
              type: call
              call: "grafana.create-annotation"
              with:
                dashboard_id: "data-pipelines"
                text: "ADF pipeline {{factory_name}}/{{run_id}}: {{get-run-status.status}}"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{channel_id}}"
                text: "ADF Pipeline {{factory_name}} run {{run_id}}: {{get-run-status.status}}. Duration: {{get-run-status.duration_in_ms}}ms."
  consumes:
    - type: http
      namespace: adf
      baseUri: "https://management.azure.com/subscriptions/blackrock-sub/resourceGroups/data-rg/providers/Microsoft.DataFactory/factories"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: pipeline-runs
          path: "/{{factory_name}}/pipelineruns/{{run_id}}?api-version=2018-06-01"
          inputParameters:
            - name: factory_name
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-pipeline-run
              method: GET
    - type: http
      namespace: grafana
      baseUri: "https://grafana.blackrock.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: annotations
          path: "/annotations"
          operations:
            - name: create-annotation
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Executes an Azure Databricks notebook for quantitative research, stores output in Amazon S3, and updates a Confluence research wiki page with results.

naftiko: "0.5"
info:
  label: "Azure Databricks Notebook Execution"
  description: "Executes an Azure Databricks notebook for quantitative research, stores output in Amazon S3, and updates a Confluence research wiki page with results."
  tags:
    - research
    - quantitative
    - azure-databricks
    - amazon-s3
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: quant-research
      port: 8080
      tools:
        - name: run-research-notebook
          description: "Execute a Databricks notebook and publish results to S3 and Confluence."
          inputParameters:
            - name: notebook_path
              in: body
              type: string
              description: "Path to the Databricks notebook."
            - name: s3_bucket
              in: body
              type: string
              description: "S3 bucket for output storage."
            - name: confluence_page_id
              in: body
              type: string
              description: "Confluence page ID to update with results."
          steps:
            - name: run-notebook
              type: call
              call: "databricks.run-notebook"
              with:
                notebook_path: "{{notebook_path}}"
            - name: upload-to-s3
              type: call
              call: "s3.put-object"
              with:
                bucket: "{{s3_bucket}}"
                key: "research/{{run-notebook.run_id}}/output.json"
                body: "{{run-notebook.output}}"
            - name: update-wiki
              type: call
              call: "confluence.update-page"
              with:
                page_id: "{{confluence_page_id}}"
                body: "Research run {{run-notebook.run_id}} completed. Output: s3://{{s3_bucket}}/research/{{run-notebook.run_id}}/output.json"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://blackrock.cloud.databricks.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/runs/submit"
          operations:
            - name: run-notebook
              method: POST
    - type: http
      namespace: s3
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: bearer
        token: "$secrets.aws_s3_token"
      resources:
        - name: objects
          path: "/{{bucket}}/{{key}}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - type: http
      namespace: confluence
      baseUri: "https://blackrock.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: update-page
              method: PUT

Fetches a secret value from Azure Key Vault for use in secure configuration of trading or analytics services.

naftiko: "0.5"
info:
  label: "Azure Key Vault Secret Retrieval"
  description: "Fetches a secret value from Azure Key Vault for use in secure configuration of trading or analytics services."
  tags:
    - security
    - azure-key-vault
capability:
  exposes:
    - type: mcp
      namespace: secrets-mgmt
      port: 8080
      tools:
        - name: get-secret
          description: "Retrieve a secret value from Azure Key Vault by secret name."
          inputParameters:
            - name: secret_name
              in: body
              type: string
              description: "The name of the secret in Azure Key Vault."
          call: "keyvault.get-secret"
          with:
            secret_name: "{{secret_name}}"
  consumes:
    - type: http
      namespace: keyvault
      baseUri: "https://blackrock-vault.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_keyvault_token"
      resources:
        - name: secrets
          path: "/secrets/{{secret_name}}?api-version=7.4"
          inputParameters:
            - name: secret_name
              in: path
          operations:
            - name: get-secret
              method: GET

Routes investment orders through Bloomberg AIM, validates against Aladdin compliance, and logs execution details to Snowflake for audit.

naftiko: "0.5"
info:
  label: "Bloomberg AIM Order Routing"
  description: "Routes investment orders through Bloomberg AIM, validates against Aladdin compliance, and logs execution details to Snowflake for audit."
  tags:
    - trading
    - order-management
    - bloomberg-aim
    - aladdin
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: aim-routing
      port: 8080
      tools:
        - name: route-aim-order
          description: "Validate and route an order through Bloomberg AIM with compliance and audit logging."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "Aladdin portfolio identifier."
            - name: ticker
              in: body
              type: string
              description: "Security ticker."
            - name: side
              in: body
              type: string
              description: "BUY or SELL."
            - name: quantity
              in: body
              type: integer
              description: "Order quantity."
            - name: broker
              in: body
              type: string
              description: "Target broker code."
          steps:
            - name: compliance-check
              type: call
              call: "aladdin.check-compliance"
              with:
                portfolio_id: "{{portfolio_id}}"
                ticker: "{{ticker}}"
                side: "{{side}}"
                quantity: "{{quantity}}"
            - name: submit-aim-order
              type: call
              call: "aim.create-order"
              with:
                ticker: "{{ticker}}"
                side: "{{side}}"
                quantity: "{{quantity}}"
                broker: "{{broker}}"
            - name: log-execution
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO trading.order_audit VALUES ('{{submit-aim-order.order_id}}', '{{portfolio_id}}', '{{ticker}}', '{{side}}', {{quantity}}, '{{broker}}', CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: compliance
          path: "/compliance/check"
          operations:
            - name: check-compliance
              method: POST
    - type: http
      namespace: aim
      baseUri: "https://bsapi.bloomberg.com/aim/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_aim_token"
      resources:
        - name: orders
          path: "/orders"
          operations:
            - name: create-order
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Submits a new equity order through Bloomberg EMSX, specifying ticker, side, quantity, order type, and limit price.

naftiko: "0.5"
info:
  label: "Bloomberg EMSX Trade Submission"
  description: "Submits a new equity order through Bloomberg EMSX, specifying ticker, side, quantity, order type, and limit price."
  tags:
    - trading
    - bloomberg-emsx
capability:
  exposes:
    - type: mcp
      namespace: trade-execution
      port: 8080
      tools:
        - name: submit-emsx-order
          description: "Submit an equity order via Bloomberg EMSX with order parameters."
          inputParameters:
            - name: ticker
              in: body
              type: string
              description: "Bloomberg ticker symbol."
            - name: side
              in: body
              type: string
              description: "BUY or SELL."
            - name: quantity
              in: body
              type: integer
              description: "Number of shares."
            - name: order_type
              in: body
              type: string
              description: "Order type (MARKET, LIMIT)."
            - name: limit_price
              in: body
              type: number
              description: "Limit price if applicable."
          call: "emsx.create-order"
          with:
            ticker: "{{ticker}}"
            side: "{{side}}"
            quantity: "{{quantity}}"
            order_type: "{{order_type}}"
            limit_price: "{{limit_price}}"
  consumes:
    - type: http
      namespace: emsx
      baseUri: "https://bsapi.bloomberg.com/emsapi/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_emsx_token"
      resources:
        - name: orders
          path: "/orders"
          operations:
            - name: create-order
              method: POST

Pulls a real-time market data snapshot from Bloomberg Enterprise Data for a given security identifier, returning price, yield, and volume.

naftiko: "0.5"
info:
  label: "Bloomberg Market Data Snapshot"
  description: "Pulls a real-time market data snapshot from Bloomberg Enterprise Data for a given security identifier, returning price, yield, and volume."
  tags:
    - market-data
    - bloomberg-enterprise-data
capability:
  exposes:
    - type: mcp
      namespace: market-data
      port: 8080
      tools:
        - name: get-market-snapshot
          description: "Fetch the latest price, bid, ask, yield, and volume for a given Bloomberg security identifier."
          inputParameters:
            - name: security_id
              in: body
              type: string
              description: "The Bloomberg FIGI or ticker symbol."
          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_eap_token"
      resources:
        - name: snapshots
          path: "/snapshots/{{security_id}}"
          inputParameters:
            - name: security_id
              in: path
          operations:
            - name: get-snapshot
              method: GET

Downloads a file from Box by file ID, returning the file content and metadata for investment documentation retrieval.

naftiko: "0.5"
info:
  label: "Box Document Download"
  description: "Downloads a file from Box by file ID, returning the file content and metadata for investment documentation retrieval."
  tags:
    - document-management
    - box
capability:
  exposes:
    - type: mcp
      namespace: box-docs
      port: 8080
      tools:
        - name: download-file
          description: "Download a file from Box by its file ID."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "The Box file identifier."
          call: "box.get-file-content"
          with:
            file_id: "{{file_id}}"
  consumes:
    - type: http
      namespace: box
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}/content"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file-content
              method: GET

When a new institutional client is created in Salesforce, provisions an Aladdin portfolio, creates a SharePoint document library, and sends a welcome notification via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Client Onboarding Orchestrator"
  description: "When a new institutional client is created in Salesforce, provisions an Aladdin portfolio, creates a SharePoint document library, and sends a welcome notification via Microsoft Teams."
  tags:
    - sales
    - onboarding
    - salesforce
    - aladdin
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: client-onboarding
      port: 8080
      tools:
        - name: onboard-client
          description: "Orchestrate full client onboarding across Salesforce, Aladdin, SharePoint, and Teams."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID for the new client."
            - name: relationship_manager_email
              in: body
              type: string
              description: "Email of the assigned relationship manager."
          steps:
            - name: get-account
              type: call
              call: "salesforce.get-account"
              with:
                account_id: "{{account_id}}"
            - name: create-portfolio
              type: call
              call: "aladdin.create-portfolio"
              with:
                client_name: "{{get-account.Name}}"
                account_ref: "{{account_id}}"
            - name: provision-docs
              type: call
              call: "sharepoint.create-folder"
              with:
                site_id: "client-documents"
                folder_path: "Clients/{{get-account.Name}}"
            - name: notify-rm
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{relationship_manager_email}}"
                text: "New client {{get-account.Name}} onboarded. Aladdin portfolio: {{create-portfolio.portfolio_id}}. Docs: {{provision-docs.url}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://blackrock.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: portfolios
          path: "/portfolios"
          operations:
            - name: create-portfolio
              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

Fetches holdings from Aladdin, retrieves benchmark data from FactSet, generates a Tableau dashboard snapshot, and emails the review package to the client via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Client Portfolio Review Generator"
  description: "Fetches holdings from Aladdin, retrieves benchmark data from FactSet, generates a Tableau dashboard snapshot, and emails the review package to the client via Microsoft Outlook."
  tags:
    - client-reporting
    - aladdin
    - factset
    - tableau
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: portfolio-review
      port: 8080
      tools:
        - name: generate-review
          description: "Generate and distribute a client portfolio review package."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: client_email
              in: body
              type: string
              description: "Client email address for distribution."
            - name: benchmark_id
              in: body
              type: string
              description: "FactSet benchmark identifier."
          steps:
            - name: get-holdings
              type: call
              call: "aladdin.get-holdings"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: get-benchmark
              type: call
              call: "factset.get-benchmark-returns"
              with:
                benchmark_id: "{{benchmark_id}}"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-workbook"
              with:
                workbook_id: "portfolio-review-{{portfolio_id}}"
            - name: send-review
              type: call
              call: "outlook.send-email"
              with:
                to: "{{client_email}}"
                subject: "Portfolio Review — {{portfolio_id}}"
                body: "Your portfolio review is ready. Dashboard: {{refresh-dashboard.url}}. Total holdings: {{get-holdings.total_count}}."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: holdings
          path: "/portfolios/{{portfolio_id}}/holdings"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-holdings
              method: GET
    - type: http
      namespace: factset
      baseUri: "https://api.factset.com/analytics/v3"
      authentication:
        type: basic
        username: "$secrets.factset_user"
        password: "$secrets.factset_api_key"
      resources:
        - name: benchmarks
          path: "/benchmarks/{{benchmark_id}}/returns"
          inputParameters:
            - name: benchmark_id
              in: path
          operations:
            - name: get-benchmark-returns
              method: GET
    - type: http
      namespace: tableau
      baseUri: "https://tableau.blackrock.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/default/workbooks/{{workbook_id}}/refresh"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: refresh-workbook
              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-email
              method: POST

Pulls portfolio performance from Aladdin, generates attribution reports in Snowflake, creates presentation decks via Power BI, and distributes to relationship managers via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Client Quarterly Review Orchestrator"
  description: "Pulls portfolio performance from Aladdin, generates attribution reports in Snowflake, creates presentation decks via Power BI, and distributes to relationship managers via Microsoft Outlook."
  tags:
    - client-reporting
    - quarterly-review
    - aladdin
    - snowflake
    - power-bi
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: client-review
      port: 8080
      tools:
        - name: prepare-quarterly-review
          description: "Pull performance, generate attribution, create deck, and distribute."
          inputParameters:
            - name: client_id
              in: body
              type: string
              description: "The client identifier."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "Power BI workspace ID."
            - name: rm_email
              in: body
              type: string
              description: "Relationship manager email."
          steps:
            - name: get-performance
              type: call
              call: "aladdin.get-portfolio-performance"
              with:
                client_id: "{{client_id}}"
            - name: generate-attribution
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL GENERATE_ATTRIBUTION('{{client_id}}')"
                warehouse: "ANALYTICS_WH"
            - name: refresh-deck
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
            - name: distribute-report
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{rm_email}}"
                subject: "Q Review: {{client_id}} — {{get-performance.return_pct}}% return"
                body: "Portfolio return: {{get-performance.return_pct}}%. Benchmark: {{get-performance.benchmark_pct}}%. Alpha: {{generate-attribution.alpha_bps}}bps. Dashboard refreshed."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: performance
          path: "/clients/{{client_id}}/performance"
          inputParameters:
            - name: client_id
              in: path
          operations:
            - name: get-portfolio-performance
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

When an Aladdin compliance breach is detected, logs the violation in ServiceNow, notifies the portfolio manager via Teams, and creates a Jira ticket for the compliance team.

naftiko: "0.5"
info:
  label: "Compliance Breach Remediation Workflow"
  description: "When an Aladdin compliance breach is detected, logs the violation in ServiceNow, notifies the portfolio manager via Teams, and creates a Jira ticket for the compliance team."
  tags:
    - compliance
    - aladdin
    - servicenow
    - microsoft-teams
    - jira
capability:
  exposes:
    - type: mcp
      namespace: compliance-breach
      port: 8080
      tools:
        - name: remediate-breach
          description: "Process a compliance breach by logging, notifying, and tracking remediation."
          inputParameters:
            - name: breach_id
              in: body
              type: string
              description: "The Aladdin compliance breach identifier."
            - name: portfolio_manager_email
              in: body
              type: string
              description: "Email of the portfolio manager."
          steps:
            - name: get-breach
              type: call
              call: "aladdin.get-breach"
              with:
                breach_id: "{{breach_id}}"
            - name: log-incident
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Compliance breach {{breach_id}}: {{get-breach.rule_name}}"
                description: "Portfolio {{get-breach.portfolio_id}} breached rule {{get-breach.rule_name}}. Exposure: {{get-breach.current_value}} vs limit {{get-breach.limit_value}}."
                category: "compliance"
            - name: notify-pm
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{portfolio_manager_email}}"
                text: "Compliance breach on portfolio {{get-breach.portfolio_id}}: {{get-breach.rule_name}}. Incident: {{log-incident.number}}."
            - name: create-remediation-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "COMP"
                summary: "Remediate breach {{breach_id}} — {{get-breach.rule_name}}"
                description: "Breach details: {{get-breach.rule_name}} on portfolio {{get-breach.portfolio_id}}. ServiceNow: {{log-incident.number}}."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: breaches
          path: "/compliance/breaches/{{breach_id}}"
          inputParameters:
            - name: breach_id
              in: path
          operations:
            - name: get-breach
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Searches BlackRock's Confluence knowledge base for investment research documentation and internal policy pages.

naftiko: "0.5"
info:
  label: "Confluence Knowledge Base Search"
  description: "Searches BlackRock's Confluence knowledge base for investment research documentation and internal policy pages."
  tags:
    - knowledge-management
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: knowledge-search
      port: 8080
      tools:
        - name: search-confluence
          description: "Search Confluence for pages matching a query string."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The CQL search query."
          call: "confluence.search"
          with:
            cql: "{{search_query}}"
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://blackrock.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: search
          path: "/search?cql={{cql}}"
          inputParameters:
            - name: cql
              in: query
          operations:
            - name: search
              method: GET

Retrieves approved invoices from Coupa, validates against Oracle Financials GL codes, posts journal entries in Workday, and notifies the accounts payable team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Coupa Invoice Processing Pipeline"
  description: "Retrieves approved invoices from Coupa, validates against Oracle Financials GL codes, posts journal entries in Workday, and notifies the accounts payable team via Microsoft Teams."
  tags:
    - finance
    - accounts-payable
    - coupa
    - oracle-financials
    - workday
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: invoice-processing
      port: 8080
      tools:
        - name: process-invoice
          description: "Validate and post approved Coupa invoices to Workday with GL verification."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The Coupa invoice ID."
            - name: ap_channel_id
              in: body
              type: string
              description: "Teams channel for AP notifications."
          steps:
            - name: get-invoice
              type: call
              call: "coupa.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: validate-gl
              type: call
              call: "oracle.validate-gl-code"
              with:
                gl_code: "{{get-invoice.gl_code}}"
            - name: post-journal
              type: call
              call: "workday.create-journal"
              with:
                amount: "{{get-invoice.total}}"
                description: "Coupa invoice {{invoice_id}} - {{get-invoice.supplier_name}}"
                gl_code: "{{get-invoice.gl_code}}"
            - name: notify-ap
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{ap_channel_id}}"
                text: "Invoice {{invoice_id}} from {{get-invoice.supplier_name}} posted. Amount: {{get-invoice.total}}. Journal: {{post-journal.journal_id}}."
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://blackrock.coupahost.com/api"
      authentication:
        type: bearer
        token: "$secrets.coupa_token"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: oracle
      baseUri: "https://oracle-fin.blackrock.com/fscmRestApi/resources/v1"
      authentication:
        type: basic
        username: "$secrets.oracle_user"
        password: "$secrets.oracle_password"
      resources:
        - name: gl-codes
          path: "/generalLedgerAccounts/{{gl_code}}"
          inputParameters:
            - name: gl_code
              in: path
          operations:
            - name: validate-gl-code
              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: journals
          path: "/financial-management/journal-entries"
          operations:
            - name: create-journal
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves market prices from Bloomberg, calculates NAV in SimCorp, validates against Aladdin, and distributes to fund accountants via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Daily NAV Calculation Pipeline"
  description: "Retrieves market prices from Bloomberg, calculates NAV in SimCorp, validates against Aladdin, and distributes to fund accountants via Microsoft Outlook."
  tags:
    - nav-calculation
    - fund-accounting
    - bloomberg
    - simcorp-dimension
    - aladdin
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: daily-nav
      port: 8080
      tools:
        - name: calculate-nav
          description: "Calculate daily NAV, validate, and distribute."
          inputParameters:
            - name: fund_id
              in: body
              type: string
              description: "The fund identifier."
            - name: accountant_email
              in: body
              type: string
              description: "Fund accountant email."
          steps:
            - name: get-prices
              type: call
              call: "bloomberg.get-market-data"
              with:
                fund_id: "{{fund_id}}"
            - name: calculate-nav
              type: call
              call: "simcorp.calculate-nav"
              with:
                fund_id: "{{fund_id}}"
                prices: "{{get-prices.prices}}"
            - name: validate-nav
              type: call
              call: "aladdin.validate-nav"
              with:
                fund_id: "{{fund_id}}"
                calculated_nav: "{{calculate-nav.nav_per_share}}"
            - name: distribute-nav
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{accountant_email}}"
                subject: "Daily NAV: {{fund_id}} — ${{calculate-nav.nav_per_share}}"
                body: "NAV: ${{calculate-nav.nav_per_share}}. AUM: ${{calculate-nav.total_aum}}M. Validation: {{validate-nav.status}}. Variance: {{validate-nav.variance_bps}}bps."
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://bsapi.bloomberg.com/eap/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: market-data
          path: "/marketdata/snapshots"
          operations:
            - name: get-market-data
              method: GET
    - type: http
      namespace: simcorp
      baseUri: "https://simcorp.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.simcorp_token"
      resources:
        - name: nav
          path: "/funds/{{fund_id}}/nav"
          inputParameters:
            - name: fund_id
              in: path
          operations:
            - name: calculate-nav
              method: POST
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: nav-validation
          path: "/funds/{{fund_id}}/nav/validate"
          inputParameters:
            - name: fund_id
              in: path
          operations:
            - name: validate-nav
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Runs Informatica data quality checks on portfolio data, logs failures in Snowflake, creates a Jira ticket for data engineering, and sends a summary via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Data Quality Monitoring Pipeline"
  description: "Runs Informatica data quality checks on portfolio data, logs failures in Snowflake, creates a Jira ticket for data engineering, and sends a summary via Microsoft Teams."
  tags:
    - data-quality
    - informatica
    - snowflake
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-quality-check
          description: "Execute data quality checks and report findings across Jira and Teams."
          inputParameters:
            - name: profile_name
              in: body
              type: string
              description: "The Informatica data quality profile name."
            - name: dataset
              in: body
              type: string
              description: "Target dataset to validate."
          steps:
            - name: run-profile
              type: call
              call: "informatica.run-profile"
              with:
                profile_name: "{{profile_name}}"
                dataset: "{{dataset}}"
            - name: log-results
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO DQ.CHECK_RESULTS (profile, dataset, score, run_id) VALUES ('{{profile_name}}', '{{dataset}}', '{{run-profile.quality_score}}', '{{run-profile.run_id}}')"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "DATA"
                summary: "Data quality check: {{profile_name}} — Score: {{run-profile.quality_score}}"
                description: "Dataset: {{dataset}}. Quality score: {{run-profile.quality_score}}. Failed rules: {{run-profile.failed_rules}}."
                issue_type: "Task"
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "data-engineering@blackrock.com"
                text: "Data quality check complete: {{profile_name}} on {{dataset}}. Score: {{run-profile.quality_score}}. Jira: {{create-ticket.key}}."
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://dm-us.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: profiles
          path: "/profile/run"
          operations:
            - name: run-profile
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Databricks for the latest ML model inference metrics, checks drift thresholds in Snowflake, and creates a Jira ticket if model performance degrades beyond acceptable limits.

naftiko: "0.5"
info:
  label: "Databricks ML Model Performance Monitor"
  description: "Queries Databricks for the latest ML model inference metrics, checks drift thresholds in Snowflake, and creates a Jira ticket if model performance degrades beyond acceptable limits."
  tags:
    - machine-learning
    - monitoring
    - databricks
    - snowflake
    - jira
capability:
  exposes:
    - type: mcp
      namespace: ml-monitoring
      port: 8080
      tools:
        - name: check-model-performance
          description: "Monitor a deployed ML model's performance metrics and escalate if degradation is detected."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "The registered Databricks model name."
            - name: drift_threshold
              in: body
              type: number
              description: "Maximum acceptable drift score."
          steps:
            - name: get-model-metrics
              type: call
              call: "databricks.get-model-metrics"
              with:
                model_name: "{{model_name}}"
            - name: check-drift
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "SELECT drift_score FROM ml.model_drift WHERE model_name = '{{model_name}}' ORDER BY computed_at DESC LIMIT 1"
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "MLOPS"
                summary: "Model drift alert: {{model_name}} - score {{check-drift.drift_score}}"
                description: "Model {{model_name}} drift score {{check-drift.drift_score}} exceeds threshold {{drift_threshold}}. Accuracy: {{get-model-metrics.accuracy}}."
                issue_type: "Bug"
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://blackrock.cloud.databricks.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: model-metrics
          path: "/mlflow/runs/search"
          operations:
            - name: get-model-metrics
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves active Datadog alerts filtered by tag for BlackRock infrastructure monitoring.

naftiko: "0.5"
info:
  label: "Datadog Infrastructure Alert Check"
  description: "Retrieves active Datadog alerts filtered by tag for BlackRock infrastructure monitoring."
  tags:
    - monitoring
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: infra-monitoring
      port: 8080
      tools:
        - name: get-active-alerts
          description: "Fetch currently triggered Datadog monitors filtered by service tag."
          inputParameters:
            - name: service_tag
              in: body
              type: string
              description: "The service tag to filter monitors, e.g. service:aladdin."
          call: "datadog.get-monitors"
          with:
            tags: "{{service_tag}}"
  consumes:
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: monitors
          path: "/monitor?tags={{tags}}"
          inputParameters:
            - name: tags
              in: query
          operations:
            - name: get-monitors
              method: GET

Scans a Docker container image for vulnerabilities using SonarQube, deploys to Azure Kubernetes Service if clean, and posts the deployment status to a Jira release ticket.

naftiko: "0.5"
info:
  label: "Docker Container Image Scan and Deploy"
  description: "Scans a Docker container image for vulnerabilities using SonarQube, deploys to Azure Kubernetes Service if clean, and posts the deployment status to a Jira release ticket."
  tags:
    - devops
    - security
    - docker
    - sonarqube
    - azure-kubernetes-service
    - jira
capability:
  exposes:
    - type: mcp
      namespace: container-deploy
      port: 8080
      tools:
        - name: scan-and-deploy
          description: "Scan a container image and deploy to AKS if it passes security checks."
          inputParameters:
            - name: image_uri
              in: body
              type: string
              description: "Full Docker image URI with tag."
            - name: namespace
              in: body
              type: string
              description: "Target Kubernetes namespace."
            - name: deployment
              in: body
              type: string
              description: "Deployment name to update."
            - name: jira_ticket
              in: body
              type: string
              description: "Jira release ticket key."
          steps:
            - name: scan-image
              type: call
              call: "sonarqube.scan-project"
              with:
                project_key: "{{deployment}}"
            - name: update-deployment
              type: call
              call: "aks.update-image"
              with:
                namespace: "{{namespace}}"
                deployment: "{{deployment}}"
                image: "{{image_uri}}"
            - name: update-ticket
              type: call
              call: "jira.add-comment"
              with:
                issue_key: "{{jira_ticket}}"
                body: "Image {{image_uri}} deployed to {{namespace}}/{{deployment}}. Scan status: {{scan-image.status}}."
  consumes:
    - type: http
      namespace: sonarqube
      baseUri: "https://sonarqube.blackrock.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: projects
          path: "/qualitygates/project_status?projectKey={{project_key}}"
          inputParameters:
            - name: project_key
              in: query
          operations:
            - name: scan-project
              method: GET
    - type: http
      namespace: aks
      baseUri: "https://blackrock-aks.hcp.eastus.azmk8s.io/apis/apps/v1"
      authentication:
        type: bearer
        token: "$secrets.aks_token"
      resources:
        - name: deployments
          path: "/namespaces/{{namespace}}/deployments/{{deployment}}"
          inputParameters:
            - name: namespace
              in: path
            - name: deployment
              in: path
          operations:
            - name: update-image
              method: PATCH
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: comments
          path: "/issue/{{issue_key}}/comment"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: add-comment
              method: POST

Scans Docker container images for vulnerabilities in investment platform deployment pipelines.

naftiko: "0.5"
info:
  label: "Docker Image Vulnerability Scan"
  description: "Scans Docker container images for vulnerabilities in investment platform deployment pipelines."
  tags:
    - security
    - snyk
capability:
  exposes:
    - type: mcp
      namespace: container-security
      port: 8080
      tools:
        - name: scan-image
          description: "Scan a Docker image for vulnerabilities."
          inputParameters:
            - name: image
              in: body
              type: string
              description: "The Docker image reference."
          call: "snyk.test-image"
          with:
            image: "{{image}}"
          outputParameters:
            - name: vulnerability_count
              type: integer
              mapping: "$.summary.totalVulnerabilities"
            - name: critical_count
              type: integer
              mapping: "$.summary.criticalVulnerabilities"
  consumes:
    - type: http
      namespace: snyk
      baseUri: "https://api.snyk.io/v1"
      authentication:
        type: bearer
        token: "$secrets.snyk_token"
      resources:
        - name: test
          path: "/test/docker"
          operations:
            - name: test-image
              method: POST

Retrieves the signing status of a DocuSign envelope used for IMA or subscription agreements, returning recipient status and completion timestamps.

naftiko: "0.5"
info:
  label: "DocuSign Envelope Status"
  description: "Retrieves the signing status of a DocuSign envelope used for IMA or subscription agreements, returning recipient status and completion timestamps."
  tags:
    - legal
    - docusign
capability:
  exposes:
    - type: mcp
      namespace: docusign
      port: 8080
      tools:
        - name: get-envelope-status
          description: "Look up the current status of a DocuSign envelope by envelope ID."
          inputParameters:
            - name: envelope_id
              in: body
              type: string
              description: "The DocuSign envelope identifier."
          call: "docusign.get-envelope"
          with:
            envelope_id: "{{envelope_id}}"
  consumes:
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/$secrets.docusign_account_id"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/envelopes/{{envelope_id}}"
          inputParameters:
            - name: envelope_id
              in: path
          operations:
            - name: get-envelope
              method: GET

Queries Elasticsearch for trade execution logs, returning matching records for compliance investigation and audit.

naftiko: "0.5"
info:
  label: "Elastic Search Trade Log Query"
  description: "Queries Elasticsearch for trade execution logs, returning matching records for compliance investigation and audit."
  tags:
    - search
    - elasticsearch
capability:
  exposes:
    - type: mcp
      namespace: elasticsearch
      port: 8080
      tools:
        - name: search-trade-logs
          description: "Search trade execution logs in Elasticsearch."
          inputParameters:
            - name: index
              in: body
              type: string
              description: "The Elasticsearch index name."
            - name: query
              in: body
              type: string
              description: "The search query string."
          call: "elasticsearch.search"
          with:
            index: "{{index}}"
            q: "{{query}}"
          outputParameters:
            - name: total_hits
              type: integer
              mapping: "$.hits.total.value"
            - name: results
              type: array
              mapping: "$.hits.hits"
  consumes:
    - type: http
      namespace: elasticsearch
      baseUri: "https://elasticsearch.blackrock.com:9200"
      authentication:
        type: basic
        username: "$secrets.elasticsearch_user"
        password: "$secrets.elasticsearch_password"
      resources:
        - name: search
          path: "/{{index}}/_search"
          inputParameters:
            - name: index
              in: path
          operations:
            - name: search
              method: GET

When an employee exits in Workday, revokes their Azure Active Directory access, closes their ServiceNow access requests, archives their SharePoint documents, and notifies HR via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Employee Offboarding Orchestrator"
  description: "When an employee exits in Workday, revokes their Azure Active Directory access, closes their ServiceNow access requests, archives their SharePoint documents, and notifies HR via Microsoft Teams."
  tags:
    - hr
    - offboarding
    - workday
    - azure-active-directory
    - servicenow
    - sharepoint
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: offboard-employee
          description: "Orchestrate employee offboarding across identity, ticketing, document, and communication systems."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: hr_channel_id
              in: body
              type: string
              description: "Microsoft Teams channel ID for HR notifications."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: disable-account
              type: call
              call: "azuread.disable-user"
              with:
                user_principal_name: "{{get-employee.work_email}}"
            - name: close-tickets
              type: call
              call: "servicenow.update-incidents"
              with:
                query: "caller_id={{get-employee.work_email}}^state!=7"
                state: "7"
            - name: archive-docs
              type: call
              call: "sharepoint.move-folder"
              with:
                site_id: "employee-documents"
                source_path: "Active/{{get-employee.full_name}}"
                target_path: "Archived/{{get-employee.full_name}}"
            - name: notify-hr
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{hr_channel_id}}"
                text: "Offboarding complete for {{get-employee.full_name}}. AD disabled, tickets closed, documents archived."
  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: azuread
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_principal_name}}"
          inputParameters:
            - name: user_principal_name
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: update-incidents
              method: PATCH
    - 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:/{{source_path}}"
          inputParameters:
            - name: site_id
              in: path
            - name: source_path
              in: path
          operations:
            - name: move-folder
              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/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

On employee termination in Workday, disables the Azure AD account, revokes Aladdin access, and logs the action in ServiceNow.

naftiko: "0.5"
info:
  label: "Employee Termination Access Revocation"
  description: "On employee termination in Workday, disables the Azure AD account, revokes Aladdin access, and logs the action in ServiceNow."
  tags:
    - hr
    - security
    - workday
    - azure-active-directory
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: access-revocation
      port: 8080
      tools:
        - name: revoke-employee-access
          description: "Revoke all system access for a terminated employee."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker ID."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{worker_id}}"
            - name: disable-account
              type: call
              call: "azure-ad.disable-user"
              with:
                user_principal_name: "{{get-worker.email}}"
            - name: revoke-aladdin
              type: call
              call: "aladdin.revoke-user"
              with:
                user_id: "{{get-worker.email}}"
            - name: log-action
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Access revoked: {{get-worker.displayName}}"
                description: "Employee {{get-worker.displayName}} ({{worker_id}}) terminated. Azure AD disabled. Aladdin access revoked."
                category: "access_management"
  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: azure-ad
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_principal_name}}"
          inputParameters:
            - name: user_principal_name
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: users
          path: "/users/{{user_id}}/revoke"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: revoke-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Pulls ESG ratings from MSCI, enriches portfolio holdings in Aladdin with ESG scores, stores results in Snowflake, and refreshes the ESG Tableau dashboard.

naftiko: "0.5"
info:
  label: "ESG Data Integration Pipeline"
  description: "Pulls ESG ratings from MSCI, enriches portfolio holdings in Aladdin with ESG scores, stores results in Snowflake, and refreshes the ESG Tableau dashboard."
  tags:
    - esg
    - msci
    - aladdin
    - snowflake
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: esg-integration
      port: 8080
      tools:
        - name: integrate-esg-data
          description: "Pull ESG ratings, enrich portfolio holdings, store in Snowflake, and refresh dashboards."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
          steps:
            - name: get-holdings
              type: call
              call: "aladdin.get-holdings"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: get-esg-ratings
              type: call
              call: "msci.get-esg-ratings"
              with:
                isins: "{{get-holdings.isin_list}}"
            - name: store-scores
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL ESG.UPDATE_PORTFOLIO_SCORES('{{portfolio_id}}')"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-workbook"
              with:
                workbook_id: "esg-dashboard"
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: holdings
          path: "/portfolios/{{portfolio_id}}/holdings"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-holdings
              method: GET
    - type: http
      namespace: msci
      baseUri: "https://api.msci.com/esg/v2"
      authentication:
        type: bearer
        token: "$secrets.msci_token"
      resources:
        - name: ratings
          path: "/ratings"
          inputParameters:
            - name: isins
              in: query
          operations:
            - name: get-esg-ratings
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://tableau.blackrock.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/default/workbooks/{{workbook_id}}/refresh"
          inputParameters:
            - name: workbook_id
              in: path
          operations:
            - name: refresh-workbook
              method: POST

Retrieves company engagement records from Salesforce, scores ESG progress in Snowflake, updates Aladdin ESG signals, and distributes reports via SharePoint.

naftiko: "0.5"
info:
  label: "ESG Engagement Tracking Pipeline"
  description: "Retrieves company engagement records from Salesforce, scores ESG progress in Snowflake, updates Aladdin ESG signals, and distributes reports via SharePoint."
  tags:
    - esg
    - engagement
    - salesforce
    - snowflake
    - aladdin
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: esg-engagement
      port: 8080
      tools:
        - name: track-engagement
          description: "Track ESG engagement, score progress, update signals, and distribute."
          inputParameters:
            - name: company_id
              in: body
              type: string
              description: "The company identifier."
          steps:
            - name: get-engagements
              type: call
              call: "salesforce.get-engagement-records"
              with:
                company_id: "{{company_id}}"
            - name: score-progress
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL SCORE_ESG_ENGAGEMENT('{{company_id}}')"
                warehouse: "ESG_WH"
            - name: update-signals
              type: call
              call: "aladdin.update-esg-signal"
              with:
                company_id: "{{company_id}}"
                engagement_score: "{{score-progress.engagement_score}}"
            - name: publish-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "esg_site"
                folder_path: "Engagements/{{company_id}}"
                file_name: "engagement_report_{{company_id}}.pdf"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://blackrock.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: engagements
          path: "/sobjects/Engagement__c"
          operations:
            - name: get-engagement-records
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: esg-signals
          path: "/esg/signals"
          operations:
            - name: update-esg-signal
              method: PATCH
    - type: http
      namespace: sharepoint
      baseUri: "https://graph.microsoft.com/v1.0/sites"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: files
          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

Fetches ESG ratings from FactSet for a portfolio's holdings from Aladdin, aggregates scores, and stores the enriched dataset in Snowflake for reporting.

naftiko: "0.5"
info:
  label: "ESG Score Enrichment Pipeline"
  description: "Fetches ESG ratings from FactSet for a portfolio's holdings from Aladdin, aggregates scores, and stores the enriched dataset in Snowflake for reporting."
  tags:
    - esg
    - portfolio-management
    - factset
    - aladdin
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: esg-enrichment
      port: 8080
      tools:
        - name: enrich-portfolio-esg
          description: "Pull holdings from Aladdin, fetch ESG scores from FactSet, and store aggregated results in Snowflake."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
          steps:
            - name: get-holdings
              type: call
              call: "aladdin.get-holdings"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: fetch-esg-scores
              type: call
              call: "factset.get-esg-scores"
              with:
                ids: "{{get-holdings.tickers}}"
            - name: store-results
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO esg.portfolio_scores SELECT * FROM TABLE(RESULT_SCAN('{{fetch-esg-scores.request_id}}'))"
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2/portfolios"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: holdings
          path: "/{{portfolio_id}}/holdings"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-holdings
              method: GET
    - type: http
      namespace: factset
      baseUri: "https://api.factset.com/content/factset-esg/v1"
      authentication:
        type: basic
        username: "$secrets.factset_user"
        password: "$secrets.factset_password"
      resources:
        - name: esg-scores
          path: "/esg-scores"
          operations:
            - name: get-esg-scores
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Processes ETF creation/redemption baskets in Aladdin, updates NAV in SimCorp, settles with custodians via SWIFT, and notifies the ETF desk via Microsoft Teams.

naftiko: "0.5"
info:
  label: "ETF Creation Redemption Pipeline"
  description: "Processes ETF creation/redemption baskets in Aladdin, updates NAV in SimCorp, settles with custodians via SWIFT, and notifies the ETF desk via Microsoft Teams."
  tags:
    - etf
    - creation-redemption
    - aladdin
    - simcorp-dimension
    - swift
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: etf-cr
      port: 8080
      tools:
        - name: process-cr-basket
          description: "Process ETF creation/redemption basket across Aladdin, SimCorp, SWIFT, and Teams."
          inputParameters:
            - name: fund_id
              in: body
              type: string
              description: "The ETF fund identifier."
            - name: cr_type
              in: body
              type: string
              description: "CREATE or REDEEM."
            - name: units
              in: body
              type: integer
              description: "Number of creation/redemption units."
            - name: etf_channel
              in: body
              type: string
              description: "Microsoft Teams ETF desk channel."
          steps:
            - name: generate-basket
              type: call
              call: "aladdin.generate-cr-basket"
              with:
                fund_id: "{{fund_id}}"
                type: "{{cr_type}}"
                units: "{{units}}"
            - name: update-nav
              type: call
              call: "simcorp.update-fund-nav"
              with:
                fund_id: "{{fund_id}}"
                units: "{{units}}"
                cr_type: "{{cr_type}}"
            - name: send-settlement
              type: call
              call: "swift.send-message"
              with:
                message_type: "MT543"
                fund_id: "{{fund_id}}"
                basket: "{{generate-basket.basket}}"
            - name: notify-desk
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{etf_channel}}"
                text: "ETF {{cr_type}}: {{fund_id}}, {{units}} units. Basket value: ${{generate-basket.basket_value}}. SWIFT: {{send-settlement.reference}}. NAV updated."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: cr-baskets
          path: "/etf/{{fund_id}}/cr-basket"
          inputParameters:
            - name: fund_id
              in: path
          operations:
            - name: generate-cr-basket
              method: POST
    - type: http
      namespace: simcorp
      baseUri: "https://simcorp.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.simcorp_token"
      resources:
        - name: funds
          path: "/funds/{{fund_id}}/nav"
          inputParameters:
            - name: fund_id
              in: path
          operations:
            - name: update-fund-nav
              method: PATCH
    - type: http
      namespace: swift
      baseUri: "https://swift.blackrock.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.swift_token"
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Reconciles ETF portfolio positions between Aladdin and SimCorp Dimension, identifies breaks, logs discrepancies in Snowflake, and alerts operations via Slack.

naftiko: "0.5"
info:
  label: "ETF Daily Reconciliation Pipeline"
  description: "Reconciles ETF portfolio positions between Aladdin and SimCorp Dimension, identifies breaks, logs discrepancies in Snowflake, and alerts operations via Slack."
  tags:
    - etf-operations
    - aladdin
    - simcorp-dimension
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: etf-recon
      port: 8080
      tools:
        - name: run-daily-reconciliation
          description: "Reconcile ETF positions between Aladdin and SimCorp, log breaks, and alert operations."
          inputParameters:
            - name: fund_id
              in: body
              type: string
              description: "The ETF fund identifier."
            - name: recon_date
              in: body
              type: string
              description: "Reconciliation date in YYYY-MM-DD format."
          steps:
            - name: get-aladdin-positions
              type: call
              call: "aladdin.get-holdings"
              with:
                portfolio_id: "{{fund_id}}"
            - name: get-simcorp-positions
              type: call
              call: "simcorp.get-positions"
              with:
                portfolio_code: "{{fund_id}}"
                as_of_date: "{{recon_date}}"
            - name: log-breaks
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "INSERT INTO RECON.BREAKS SELECT * FROM TABLE(COMPARE_POSITIONS('{{fund_id}}', '{{recon_date}}'))"
            - name: alert-ops
              type: call
              call: "slack.post-message"
              with:
                channel: "#etf-operations"
                text: "Reconciliation complete for {{fund_id}} on {{recon_date}}. Review breaks in Snowflake RECON.BREAKS table."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: holdings
          path: "/portfolios/{{portfolio_id}}/holdings"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-holdings
              method: GET
    - type: http
      namespace: simcorp
      baseUri: "https://simcorp.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.simcorp_token"
      resources:
        - name: positions
          path: "/portfolios/{{portfolio_code}}/positions"
          inputParameters:
            - name: portfolio_code
              in: path
            - name: as_of_date
              in: query
          operations:
            - name: get-positions
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves fundamental financial data for a company from FactSet, including revenue, earnings, P/E ratio, and market cap.

naftiko: "0.5"
info:
  label: "FactSet Company Fundamentals Lookup"
  description: "Retrieves fundamental financial data for a company from FactSet, including revenue, earnings, P/E ratio, and market cap."
  tags:
    - research
    - factset
capability:
  exposes:
    - type: mcp
      namespace: factset-fundamentals
      port: 8080
      tools:
        - name: get-fundamentals
          description: "Retrieve key fundamental metrics for a company from FactSet given a ticker symbol."
          inputParameters:
            - name: ticker
              in: body
              type: string
              description: "The equity ticker symbol."
          call: "factset.get-fundamentals"
          with:
            ticker: "{{ticker}}"
  consumes:
    - type: http
      namespace: factset
      baseUri: "https://api.factset.com/content/factset-fundamentals/v2"
      authentication:
        type: basic
        username: "$secrets.factset_user"
        password: "$secrets.factset_password"
      resources:
        - name: fundamentals
          path: "/fundamentals?ids={{ticker}}"
          inputParameters:
            - name: ticker
              in: query
          operations:
            - name: get-fundamentals
              method: GET

Retrieves bond pricing from Bloomberg, computes duration and convexity analytics via Aladdin, stores results in Snowflake, and refreshes the Tableau fixed income dashboard.

naftiko: "0.5"
info:
  label: "Fixed Income Pricing and Analytics Pipeline"
  description: "Retrieves bond pricing from Bloomberg, computes duration and convexity analytics via Aladdin, stores results in Snowflake, and refreshes the Tableau fixed income dashboard."
  tags:
    - fixed-income
    - analytics
    - bloomberg-enterprise-data
    - aladdin
    - snowflake
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: fi-analytics
      port: 8080
      tools:
        - name: run-fi-analytics
          description: "Pull bond pricing, compute analytics, store, and refresh dashboards."
          inputParameters:
            - name: security_id
              in: body
              type: string
              description: "Bloomberg bond identifier."
            - name: portfolio_id
              in: body
              type: string
              description: "Aladdin portfolio for analytics context."
            - name: tableau_datasource_id
              in: body
              type: string
              description: "Tableau datasource LUID to refresh."
          steps:
            - name: get-bond-price
              type: call
              call: "bloomberg.get-snapshot"
              with:
                security_id: "{{security_id}}"
            - name: compute-analytics
              type: call
              call: "aladdin.compute-fi-analytics"
              with:
                security_id: "{{security_id}}"
                portfolio_id: "{{portfolio_id}}"
                price: "{{get-bond-price.price}}"
            - name: store-analytics
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO fixed_income.analytics VALUES ('{{security_id}}', '{{compute-analytics.duration}}', '{{compute-analytics.convexity}}', CURRENT_TIMESTAMP())"
            - name: refresh-dashboard
              type: call
              call: "tableau.refresh-datasource"
              with:
                datasource_id: "{{tableau_datasource_id}}"
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://bsapi.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_eap_token"
      resources:
        - name: snapshots
          path: "/snapshots/{{security_id}}"
          inputParameters:
            - name: security_id
              in: path
          operations:
            - name: get-snapshot
              method: GET
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: fi-analytics
          path: "/analytics/fixed-income"
          operations:
            - name: compute-fi-analytics
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: tableau
      baseUri: "https://tableau.blackrock.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/default/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-datasource
              method: POST

Calculates FX hedge requirements in Aladdin, submits trades via Tradeweb, updates positions in SimCorp, and notifies the FX desk via Slack.

naftiko: "0.5"
info:
  label: "FX Hedging Execution Pipeline"
  description: "Calculates FX hedge requirements in Aladdin, submits trades via Tradeweb, updates positions in SimCorp, and notifies the FX desk via Slack."
  tags:
    - fx-hedging
    - foreign-exchange
    - aladdin
    - tradeweb
    - simcorp-dimension
    - slack
capability:
  exposes:
    - type: mcp
      namespace: fx-hedging
      port: 8080
      tools:
        - name: execute-fx-hedge
          description: "Calculate FX hedges, execute trades, update positions, and notify."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for FX desk."
          steps:
            - name: calculate-hedges
              type: call
              call: "aladdin.calculate-fx-hedges"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: execute-trades
              type: call
              call: "tradeweb.submit-rfq"
              with:
                currency_pairs: "{{calculate-hedges.currency_pairs}}"
                notionals: "{{calculate-hedges.notionals}}"
            - name: update-positions
              type: call
              call: "simcorp.update-fx-positions"
              with:
                portfolio_id: "{{portfolio_id}}"
                trades: "{{execute-trades.executed_trades}}"
            - name: notify-desk
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "FX hedge executed for {{portfolio_id}}: {{calculate-hedges.trade_count}} trades. Total notional: ${{calculate-hedges.total_notional}}M. Avg rate improvement: {{execute-trades.avg_improvement_bps}}bps."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: fx-hedges
          path: "/portfolios/{{portfolio_id}}/fx-hedges"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: calculate-fx-hedges
              method: POST
    - type: http
      namespace: tradeweb
      baseUri: "https://api.tradeweb.com/v1"
      authentication:
        type: bearer
        token: "$secrets.tradeweb_token"
      resources:
        - name: rfq
          path: "/rfq"
          operations:
            - name: submit-rfq
              method: POST
    - type: http
      namespace: simcorp
      baseUri: "https://simcorp.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.simcorp_token"
      resources:
        - name: fx-positions
          path: "/portfolios/{{portfolio_id}}/fx-positions"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: update-fx-positions
              method: PATCH
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Executes an FX trade via Tradeweb, books the trade in Aladdin, generates a SWIFT confirmation, and logs the settlement in ServiceNow.

naftiko: "0.5"
info:
  label: "FX Trade Execution and Settlement"
  description: "Executes an FX trade via Tradeweb, books the trade in Aladdin, generates a SWIFT confirmation, and logs the settlement in ServiceNow."
  tags:
    - fx-trading
    - tradeweb
    - aladdin
    - swift
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: fx-execution
      port: 8080
      tools:
        - name: execute-fx-trade
          description: "Execute an FX trade and process through booking, confirmation, and settlement tracking."
          inputParameters:
            - name: currency_pair
              in: body
              type: string
              description: "Currency pair (e.g. EUR/USD)."
            - name: amount
              in: body
              type: number
              description: "Notional amount."
            - name: direction
              in: body
              type: string
              description: "BUY or SELL."
            - name: portfolio_id
              in: body
              type: string
              description: "Aladdin portfolio ID."
          steps:
            - name: execute-trade
              type: call
              call: "tradeweb.submit-rfq"
              with:
                currency_pair: "{{currency_pair}}"
                amount: "{{amount}}"
                direction: "{{direction}}"
            - name: book-trade
              type: call
              call: "aladdin.create-trade"
              with:
                portfolio_id: "{{portfolio_id}}"
                instrument: "{{currency_pair}}"
                quantity: "{{amount}}"
                price: "{{execute-trade.rate}}"
            - name: send-confirmation
              type: call
              call: "swift.send-mt300"
              with:
                trade_ref: "{{book-trade.trade_id}}"
                counterparty_bic: "{{execute-trade.counterparty_bic}}"
                amount: "{{amount}}"
                rate: "{{execute-trade.rate}}"
            - name: track-settlement
              type: call
              call: "servicenow.create-task"
              with:
                short_description: "FX settlement: {{currency_pair}} {{amount}} @ {{execute-trade.rate}}"
                description: "Trade: {{book-trade.trade_id}}. SWIFT: {{send-confirmation.reference}}. Settlement date: {{execute-trade.settlement_date}}."
                category: "fx_settlement"
  consumes:
    - type: http
      namespace: tradeweb
      baseUri: "https://api.tradeweb.com/v1"
      authentication:
        type: bearer
        token: "$secrets.tradeweb_token"
      resources:
        - name: rfqs
          path: "/fx/rfq"
          operations:
            - name: submit-rfq
              method: POST
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: trades
          path: "/portfolios/{{portfolio_id}}/trades"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: create-trade
              method: POST
    - type: http
      namespace: swift
      baseUri: "https://swift.blackrock.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.swift_token"
      resources:
        - name: messages
          path: "/messages/mt300"
          operations:
            - name: send-mt300
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/task"
          operations:
            - name: create-task
              method: POST

Checks the latest GitHub Actions workflow run status for a BlackRock repository and posts results to a Microsoft Teams development channel.

naftiko: "0.5"
info:
  label: "GitHub Actions CI Pipeline Status"
  description: "Checks the latest GitHub Actions workflow run status for a BlackRock repository and posts results to a Microsoft Teams development channel."
  tags:
    - development
    - ci-cd
    - github-actions
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: ci-status
      port: 8080
      tools:
        - name: check-ci-and-notify
          description: "Fetch the latest CI run status from GitHub Actions and post to a Teams channel."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository name (org/repo format)."
            - name: channel_id
              in: body
              type: string
              description: "Teams channel ID for dev notifications."
          steps:
            - name: get-latest-run
              type: call
              call: "github.get-workflow-runs"
              with:
                repo: "{{repo}}"
            - name: post-status
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{channel_id}}"
                text: "CI Status for {{repo}}: {{get-latest-run.workflow_runs[0].conclusion}} ({{get-latest-run.workflow_runs[0].name}}). Commit: {{get-latest-run.workflow_runs[0].head_sha}}."
  consumes:
    - type: http
      namespace: github
      baseUri: "https://api.github.com/repos"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-runs
          path: "/{{repo}}/actions/runs?per_page=1"
          inputParameters:
            - name: repo
              in: path
          operations:
            - name: get-workflow-runs
              method: GET
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Launches a Google Cloud Dataflow streaming job for real-time trade event processing and posts job status to a Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Google Cloud Dataflow Job Launcher"
  description: "Launches a Google Cloud Dataflow streaming job for real-time trade event processing and posts job status to a Microsoft Teams channel."
  tags:
    - data-engineering
    - streaming
    - google-cloud-dataflow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: dataflow-ops
      port: 8080
      tools:
        - name: launch-dataflow-job
          description: "Launch a Dataflow streaming job and notify the team."
          inputParameters:
            - name: template_name
              in: body
              type: string
              description: "Dataflow template name."
            - name: project_id
              in: body
              type: string
              description: "GCP project ID."
            - name: channel_id
              in: body
              type: string
              description: "Teams channel for notifications."
          steps:
            - name: launch-job
              type: call
              call: "dataflow.launch-template"
              with:
                project_id: "{{project_id}}"
                template_name: "{{template_name}}"
            - name: notify-team
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{channel_id}}"
                text: "Dataflow job launched: {{template_name}} in project {{project_id}}. Job ID: {{launch-job.job_id}}. State: {{launch-job.currentState}}."
  consumes:
    - type: http
      namespace: dataflow
      baseUri: "https://dataflow.googleapis.com/v1b3/projects"
      authentication:
        type: bearer
        token: "$secrets.gcp_token"
      resources:
        - name: templates
          path: "/{{project_id}}/templates:launch"
          inputParameters:
            - name: project_id
              in: path
          operations:
            - name: launch-template
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Creates a shareable Grafana dashboard snapshot for investment platform performance metrics.

naftiko: "0.5"
info:
  label: "Grafana Dashboard Snapshot"
  description: "Creates a shareable Grafana dashboard snapshot for investment platform performance metrics."
  tags:
    - monitoring
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: grafana
      port: 8080
      tools:
        - name: create-snapshot
          description: "Create a shareable snapshot of a Grafana dashboard."
          inputParameters:
            - name: dashboard_uid
              in: body
              type: string
              description: "The Grafana dashboard UID."
            - name: expires_in
              in: body
              type: integer
              description: "Snapshot expiry in seconds."
          call: "grafana.create-snapshot"
          with:
            dashboard_uid: "{{dashboard_uid}}"
            expires: "{{expires_in}}"
          outputParameters:
            - name: snapshot_url
              type: string
              mapping: "$.url"
            - name: snapshot_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.blackrock.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: snapshots
          path: "/snapshots"
          operations:
            - name: create-snapshot
              method: POST

Rotates a secret in HashiCorp Vault, updates the corresponding Azure Key Vault entry, and logs the rotation event in ServiceNow for audit compliance.

naftiko: "0.5"
info:
  label: "HashiCorp Vault Secret Rotation"
  description: "Rotates a secret in HashiCorp Vault, updates the corresponding Azure Key Vault entry, and logs the rotation event in ServiceNow for audit compliance."
  tags:
    - security
    - secret-management
    - hashicorp-vault
    - azure-key-vault
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: secret-rotation
      port: 8080
      tools:
        - name: rotate-secret
          description: "Rotate a secret across Vault and Azure Key Vault with audit logging."
          inputParameters:
            - name: secret_path
              in: body
              type: string
              description: "The Vault secret path."
            - name: azure_secret_name
              in: body
              type: string
              description: "Corresponding Azure Key Vault secret name."
          steps:
            - name: rotate-vault-secret
              type: call
              call: "vault.rotate-secret"
              with:
                path: "{{secret_path}}"
            - name: update-azure-kv
              type: call
              call: "keyvault.set-secret"
              with:
                secret_name: "{{azure_secret_name}}"
                value: "{{rotate-vault-secret.new_value}}"
            - name: log-rotation
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Secret rotation: {{secret_path}}"
                category: "security_audit"
                assigned_group: "Security_Ops"
                description: "Secret {{secret_path}} rotated. Azure KV {{azure_secret_name}} updated. Version: {{update-azure-kv.version}}."
  consumes:
    - type: http
      namespace: vault
      baseUri: "https://vault.blackrock.com/v1"
      authentication:
        type: bearer
        token: "$secrets.vault_token"
      resources:
        - name: secrets
          path: "/secret/data/{{path}}"
          inputParameters:
            - name: path
              in: path
          operations:
            - name: rotate-secret
              method: POST
    - type: http
      namespace: keyvault
      baseUri: "https://blackrock-vault.vault.azure.net"
      authentication:
        type: bearer
        token: "$secrets.azure_keyvault_token"
      resources:
        - name: secrets
          path: "/secrets/{{secret_name}}?api-version=7.4"
          inputParameters:
            - name: secret_name
              in: path
          operations:
            - name: set-secret
              method: PUT
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Packages and deploys a Helm chart to Azure Kubernetes Service, runs post-deployment health checks via Datadog, and updates the Jira deployment ticket.

naftiko: "0.5"
info:
  label: "Helm Chart Deployment Pipeline"
  description: "Packages and deploys a Helm chart to Azure Kubernetes Service, runs post-deployment health checks via Datadog, and updates the Jira deployment ticket."
  tags:
    - devops
    - helm
    - azure-kubernetes-service
    - datadog
    - jira
capability:
  exposes:
    - type: mcp
      namespace: helm-deploy
      port: 8080
      tools:
        - name: deploy-helm-chart
          description: "Deploy a Helm chart to AKS with health verification and ticket update."
          inputParameters:
            - name: chart_name
              in: body
              type: string
              description: "Helm chart name."
            - name: chart_version
              in: body
              type: string
              description: "Chart version to deploy."
            - name: namespace
              in: body
              type: string
              description: "Target Kubernetes namespace."
            - name: jira_ticket
              in: body
              type: string
              description: "Deployment Jira ticket key."
          steps:
            - name: deploy-chart
              type: call
              call: "aks.deploy-helm"
              with:
                chart_name: "{{chart_name}}"
                chart_version: "{{chart_version}}"
                namespace: "{{namespace}}"
            - name: health-check
              type: call
              call: "datadog.get-monitors"
              with:
                tags: "service:{{chart_name}},env:{{namespace}}"
            - name: update-ticket
              type: call
              call: "jira.add-comment"
              with:
                issue_key: "{{jira_ticket}}"
                body: "Deployed {{chart_name}}:{{chart_version}} to {{namespace}}. Health: {{health-check.overall_state}}."
  consumes:
    - type: http
      namespace: aks
      baseUri: "https://blackrock-aks.hcp.eastus.azmk8s.io/apis/helm/v1"
      authentication:
        type: bearer
        token: "$secrets.aks_token"
      resources:
        - name: releases
          path: "/namespaces/{{namespace}}/releases"
          inputParameters:
            - name: namespace
              in: path
          operations:
            - name: deploy-helm
              method: POST
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      inputParameters:
        - name: DD-APPLICATION-KEY
          in: header
          value: "$secrets.datadog_app_key"
      resources:
        - name: monitors
          path: "/monitor?tags={{tags}}"
          inputParameters:
            - name: tags
              in: query
          operations:
            - name: get-monitors
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: comments
          path: "/issue/{{issue_key}}/comment"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: add-comment
              method: POST

When a critical ServiceNow incident is created for Aladdin infrastructure, queries Datadog for related metrics, creates a Jira investigation ticket, and posts a summary to the operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Incident-Triggered Runbook Executor"
  description: "When a critical ServiceNow incident is created for Aladdin infrastructure, queries Datadog for related metrics, creates a Jira investigation ticket, and posts a summary to the operations Microsoft Teams channel."
  tags:
    - operations
    - incident-response
    - servicenow
    - datadog
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: incident-runbook
      port: 8080
      tools:
        - name: execute-incident-runbook
          description: "Orchestrate incident investigation across ServiceNow, Datadog, Jira, and Teams."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "The ServiceNow incident number."
            - name: ops_channel_id
              in: body
              type: string
              description: "The Teams channel ID for operations alerts."
          steps:
            - name: get-incident
              type: call
              call: "servicenow.get-incident"
              with:
                incident_number: "{{incident_number}}"
            - name: query-metrics
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:system.cpu.user{service:{{get-incident.cmdb_ci}}}"
                from: "{{get-incident.opened_at}}"
            - name: create-investigation
              type: call
              call: "jira.create-issue"
              with:
                project: "OPS"
                summary: "Investigate: {{get-incident.short_description}}"
                description: "ServiceNow {{incident_number}}. CPU metrics: {{query-metrics.series}}"
                issue_type: "Task"
            - name: post-summary
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{ops_channel_id}}"
                text: "Incident {{incident_number}}: {{get-incident.short_description}}. Jira: {{create-investigation.key}}. Datadog metrics attached."
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.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
    - type: http
      namespace: datadog
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.datadog_api_key"
      resources:
        - name: query
          path: "/query"
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Triggers an Informatica data quality job for client reference data, stores quality scores in Snowflake, and creates a ServiceNow ticket for data stewards if quality drops below threshold.

naftiko: "0.5"
info:
  label: "Informatica Data Quality Pipeline"
  description: "Triggers an Informatica data quality job for client reference data, stores quality scores in Snowflake, and creates a ServiceNow ticket for data stewards if quality drops below threshold."
  tags:
    - data-quality
    - informatica
    - snowflake
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: data-quality
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Execute Informatica DQ job and escalate quality issues."
          inputParameters:
            - name: job_id
              in: body
              type: string
              description: "Informatica DQ job identifier."
            - name: quality_threshold
              in: body
              type: number
              description: "Minimum acceptable quality score (0-100)."
          steps:
            - name: run-dq-job
              type: call
              call: "informatica.run-job"
              with:
                job_id: "{{job_id}}"
            - name: store-scores
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO data_quality.scores VALUES ('{{job_id}}', '{{run-dq-job.quality_score}}', CURRENT_TIMESTAMP())"
            - name: create-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Data quality below threshold for job {{job_id}}"
                category: "data_quality"
                assigned_group: "Data_Stewards"
                description: "Quality score: {{run-dq-job.quality_score}}. Threshold: {{quality_threshold}}."
  consumes:
    - type: http
      namespace: informatica
      baseUri: "https://dm-us.informaticacloud.com/saas/api/v2"
      authentication:
        type: bearer
        token: "$secrets.informatica_token"
      resources:
        - name: jobs
          path: "/job/{{job_id}}"
          inputParameters:
            - name: job_id
              in: path
          operations:
            - name: run-job
              method: POST
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Queries Azure cost data, identifies underutilized resources via Datadog metrics, creates optimization recommendations in Jira, and posts a summary to the FinOps Slack channel.

naftiko: "0.5"
info:
  label: "Infrastructure Cost Optimization Workflow"
  description: "Queries Azure cost data, identifies underutilized resources via Datadog metrics, creates optimization recommendations in Jira, and posts a summary to the FinOps Slack channel."
  tags:
    - finops
    - microsoft-azure
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cost-optimization
      port: 8080
      tools:
        - name: optimize-costs
          description: "Identify and track cost optimization opportunities across Azure infrastructure."
          inputParameters:
            - name: subscription_id
              in: body
              type: string
              description: "Azure subscription identifier."
            - name: threshold_percent
              in: body
              type: integer
              description: "CPU utilization threshold below which resources are flagged."
          steps:
            - name: get-costs
              type: call
              call: "azure.get-cost-details"
              with:
                subscription_id: "{{subscription_id}}"
            - name: get-utilization
              type: call
              call: "datadog.query-metrics"
              with:
                query: "avg:azure.vm.percentage_cpu{subscription_id:{{subscription_id}}} by {resource_name}"
                period: "7d"
            - name: create-recommendations
              type: call
              call: "jira.create-issue"
              with:
                project: "FINOPS"
                summary: "Cost optimization: {{subscription_id}} — ${{get-costs.total_cost}} monthly"
                description: "Underutilized resources identified. Current spend: ${{get-costs.total_cost}}. Resources below {{threshold_percent}}% CPU: {{get-utilization.low_util_count}}."
                issue_type: "Story"
            - name: post-summary
              type: call
              call: "slack.post-message"
              with:
                channel: "#finops"
                text: "Cost optimization scan complete for {{subscription_id}}. Monthly spend: ${{get-costs.total_cost}}. Recommendations: {{create-recommendations.key}}."
  consumes:
    - type: http
      namespace: azure
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: costs
          path: "/subscriptions/{{subscription_id}}/providers/Microsoft.CostManagement/query"
          inputParameters:
            - name: subscription_id
              in: path
          operations:
            - name: get-cost-details
              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"
          inputParameters:
            - name: query
              in: query
            - name: period
              in: query
          operations:
            - name: query-metrics
              method: GET
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves research notes from Confluence, enriches with market data from Bloomberg, generates formatted reports via Power BI, and distributes to PMs via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Investment Research Distribution Pipeline"
  description: "Retrieves research notes from Confluence, enriches with market data from Bloomberg, generates formatted reports via Power BI, and distributes to PMs via Microsoft Outlook."
  tags:
    - research
    - distribution
    - confluence
    - bloomberg
    - power-bi
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: research-distribution
      port: 8080
      tools:
        - name: distribute-research
          description: "Retrieve research, enrich with data, format report, and distribute."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "Confluence research page ID."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
            - name: group_id
              in: body
              type: string
              description: "Power BI workspace ID."
            - name: pm_list
              in: body
              type: string
              description: "PM distribution list email."
          steps:
            - name: get-research
              type: call
              call: "confluence.get-page"
              with:
                page_id: "{{page_id}}"
            - name: get-market-data
              type: call
              call: "bloomberg.get-market-data"
              with:
                tickers: "{{get-research.tickers}}"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                group_id: "{{group_id}}"
                dataset_id: "{{dataset_id}}"
            - name: distribute
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{pm_list}}"
                subject: "Research: {{get-research.title}}"
                body: "New research published: {{get-research.title}}. Key thesis: {{get-research.summary}}. Dashboard refreshed."
  consumes:
    - type: http
      namespace: confluence
      baseUri: "https://blackrock.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}?expand=body.storage"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET
    - type: http
      namespace: bloomberg
      baseUri: "https://bsapi.bloomberg.com/eap/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_token"
      resources:
        - name: market-data
          path: "/marketdata/snapshots"
          operations:
            - name: get-market-data
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Looks up a Jira issue by key and returns its current status, assignee, priority, and last updated timestamp.

naftiko: "0.5"
info:
  label: "Jira Issue Status Check"
  description: "Looks up a Jira issue by key and returns its current status, assignee, priority, and last updated timestamp."
  tags:
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: project-tracking
      port: 8080
      tools:
        - name: get-jira-issue
          description: "Retrieve a Jira issue by key to check its status and assignment."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key, e.g. RISK-1234."
          call: "jira.get-issue"
          with:
            issue_key: "{{issue_key}}"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{issue_key}}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET

Scales an Azure Kubernetes Service deployment for Aladdin microservices, verifies pod readiness, and updates Grafana annotations for tracking.

naftiko: "0.5"
info:
  label: "Kubernetes Deployment Scaler"
  description: "Scales an Azure Kubernetes Service deployment for Aladdin microservices, verifies pod readiness, and updates Grafana annotations for tracking."
  tags:
    - infrastructure
    - azure-kubernetes-service
    - grafana
capability:
  exposes:
    - type: mcp
      namespace: k8s-ops
      port: 8080
      tools:
        - name: scale-and-annotate
          description: "Scale an AKS deployment and record the event in Grafana."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "Kubernetes namespace."
            - name: deployment
              in: body
              type: string
              description: "Deployment name."
            - name: replicas
              in: body
              type: integer
              description: "Desired replica count."
          steps:
            - name: scale-deployment
              type: call
              call: "aks.scale-deployment"
              with:
                namespace: "{{namespace}}"
                deployment: "{{deployment}}"
                replicas: "{{replicas}}"
            - name: annotate-grafana
              type: call
              call: "grafana.create-annotation"
              with:
                dashboard_id: "aladdin-infra"
                text: "Scaled {{deployment}} in {{namespace}} to {{replicas}} replicas"
  consumes:
    - type: http
      namespace: aks
      baseUri: "https://blackrock-aks.hcp.eastus.azmk8s.io/apis/apps/v1"
      authentication:
        type: bearer
        token: "$secrets.aks_token"
      resources:
        - name: deployments
          path: "/namespaces/{{namespace}}/deployments/{{deployment}}/scale"
          inputParameters:
            - name: namespace
              in: path
            - name: deployment
              in: path
          operations:
            - name: scale-deployment
              method: PATCH
    - type: http
      namespace: grafana
      baseUri: "https://grafana.blackrock.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: annotations
          path: "/annotations"
          operations:
            - name: create-annotation
              method: POST

Monitors Bloomberg market data for anomalies, runs detection models in Azure Databricks, logs alerts in Splunk, and notifies the quant team via Slack.

naftiko: "0.5"
info:
  label: "Market Data Anomaly Detection Pipeline"
  description: "Monitors Bloomberg market data for anomalies, runs detection models in Azure Databricks, logs alerts in Splunk, and notifies the quant team via Slack."
  tags:
    - market-data
    - bloomberg
    - azure-databricks
    - splunk
    - slack
capability:
  exposes:
    - type: mcp
      namespace: anomaly-detection
      port: 8080
      tools:
        - name: detect-anomalies
          description: "Run market data anomaly detection and alert the quant team."
          inputParameters:
            - name: asset_class
              in: body
              type: string
              description: "Asset class to monitor (equities, fixed_income, fx)."
            - name: lookback_hours
              in: body
              type: integer
              description: "Hours of data to analyze."
          steps:
            - name: get-market-data
              type: call
              call: "bloomberg.get-bulk-data"
              with:
                asset_class: "{{asset_class}}"
                lookback: "{{lookback_hours}}h"
            - name: run-detection
              type: call
              call: "databricks.submit-job"
              with:
                job_name: "anomaly-detection-{{asset_class}}"
                parameters: "{{get-market-data.snapshot_id}}"
            - name: log-alerts
              type: call
              call: "splunk.create-event"
              with:
                index: "market-data-anomalies"
                source: "anomaly-detector"
                event: "{{run-detection.anomalies}}"
            - name: notify-quants
              type: call
              call: "slack.post-message"
              with:
                channel: "#quant-alerts"
                text: "Anomaly detection complete for {{asset_class}}. Found {{run-detection.anomaly_count}} anomalies. Review in Splunk."
  consumes:
    - type: http
      namespace: bloomberg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_api_key"
      resources:
        - name: bulk-data
          path: "/snapshots"
          inputParameters:
            - name: asset_class
              in: query
            - name: lookback
              in: query
          operations:
            - name: get-bulk-data
              method: GET
    - type: http
      namespace: databricks
      baseUri: "https://adb-blackrock.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: jobs
          path: "/jobs/run-now"
          operations:
            - name: submit-job
              method: POST
    - type: http
      namespace: splunk
      baseUri: "https://splunk.blackrock.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: events
          path: "/receivers/simple"
          operations:
            - name: create-event
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Posts notifications to Microsoft Teams channels for investment team alerts and portfolio updates.

naftiko: "0.5"
info:
  label: "Microsoft Teams Channel Notification"
  description: "Posts notifications to Microsoft Teams channels for investment team alerts and portfolio updates."
  tags:
    - messaging
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: msteams
      port: 8080
      tools:
        - name: post-message
          description: "Post a message to a Microsoft Teams channel."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "The Teams channel ID."
            - name: text
              in: body
              type: string
              description: "Message text."
          call: "msteams.post-channel-message"
          with:
            channel_id: "{{channel_id}}"
            text: "{{text}}"
          outputParameters:
            - name: message_id
              type: string
              mapping: "$.id"
  consumes:
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Deploys a trained model from Azure Databricks to Azure Machine Learning, creates a Grafana monitoring dashboard, and notifies the data science team via Slack.

naftiko: "0.5"
info:
  label: "ML Model Deployment and Monitoring"
  description: "Deploys a trained model from Azure Databricks to Azure Machine Learning, creates a Grafana monitoring dashboard, and notifies the data science team via Slack."
  tags:
    - machine-learning
    - azure-databricks
    - azure-machine-learning
    - grafana
    - slack
capability:
  exposes:
    - type: mcp
      namespace: ml-deploy
      port: 8080
      tools:
        - name: deploy-model
          description: "Deploy a model to production with monitoring and notifications."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "Name of the registered model."
            - name: model_version
              in: body
              type: string
              description: "Model version to deploy."
          steps:
            - name: get-model
              type: call
              call: "databricks.get-model-version"
              with:
                name: "{{model_name}}"
                version: "{{model_version}}"
            - name: deploy-endpoint
              type: call
              call: "azure-ml.create-deployment"
              with:
                model_uri: "{{get-model.source}}"
                endpoint_name: "{{model_name}}-prod"
            - name: create-dashboard
              type: call
              call: "grafana.create-dashboard"
              with:
                title: "ML Model — {{model_name}} v{{model_version}}"
                endpoint: "{{deploy-endpoint.scoring_uri}}"
            - name: notify-team
              type: call
              call: "slack.post-message"
              with:
                channel: "#data-science"
                text: "Model {{model_name}} v{{model_version}} deployed. Endpoint: {{deploy-endpoint.scoring_uri}}. Dashboard: {{create-dashboard.url}}."
  consumes:
    - type: http
      namespace: databricks
      baseUri: "https://adb-blackrock.azuredatabricks.net/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: models
          path: "/mlflow/model-versions/get"
          inputParameters:
            - name: name
              in: query
            - name: version
              in: query
          operations:
            - name: get-model-version
              method: GET
    - type: http
      namespace: azure-ml
      baseUri: "https://ml.azure.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.azure_ml_token"
      resources:
        - name: deployments
          path: "/deployments"
          operations:
            - name: create-deployment
              method: POST
    - type: http
      namespace: grafana
      baseUri: "https://grafana.blackrock.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: dashboards
          path: "/dashboards/db"
          operations:
            - name: create-dashboard
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches Morningstar category-level performance and ranking data for a given fund, returning percentile rank and peer group statistics.

naftiko: "0.5"
info:
  label: "Morningstar Category Performance"
  description: "Fetches Morningstar category-level performance and ranking data for a given fund, returning percentile rank and peer group statistics."
  tags:
    - fund-analytics
    - morningstar
capability:
  exposes:
    - type: mcp
      namespace: morningstar-perf
      port: 8080
      tools:
        - name: get-category-performance
          description: "Retrieve Morningstar category performance and percentile rank for a fund by its SecId."
          inputParameters:
            - name: sec_id
              in: body
              type: string
              description: "The Morningstar security identifier."
          call: "morningstar.get-performance"
          with:
            sec_id: "{{sec_id}}"
  consumes:
    - type: http
      namespace: morningstar
      baseUri: "https://api.morningstar.com/v2"
      authentication:
        type: apiKey
        name: "X-API-KEY"
        in: header
        value: "$secrets.morningstar_api_key"
      resources:
        - name: performance
          path: "/securities/{{sec_id}}/performance"
          inputParameters:
            - name: sec_id
              in: path
          operations:
            - name: get-performance
              method: GET

Retrieves fund performance data and ratings from Morningstar for competitive analysis and client reporting.

naftiko: "0.5"
info:
  label: "Morningstar Fund Data Lookup"
  description: "Retrieves fund performance data and ratings from Morningstar for competitive analysis and client reporting."
  tags:
    - fund-data
    - morningstar
capability:
  exposes:
    - type: mcp
      namespace: morningstar
      port: 8080
      tools:
        - name: get-fund-data
          description: "Look up fund performance data from Morningstar."
          inputParameters:
            - name: fund_id
              in: body
              type: string
              description: "The Morningstar fund identifier."
          call: "morningstar.get-fund"
          with:
            fund_id: "{{fund_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.fund.name"
            - name: star_rating
              type: integer
              mapping: "$.fund.starRating"
            - name: ytd_return
              type: number
              mapping: "$.fund.ytdReturn"
  consumes:
    - type: http
      namespace: morningstar
      baseUri: "https://api.morningstar.com/v2"
      authentication:
        type: apiKey
        name: "x-api-key"
        in: header
        value: "$secrets.morningstar_api_key"
      resources:
        - name: funds
          path: "/funds/{{fund_id}}"
          inputParameters:
            - name: fund_id
              in: path
          operations:
            - name: get-fund
              method: GET

Retrieves MSCI index constituent data and weightings for benchmark tracking and portfolio construction.

naftiko: "0.5"
info:
  label: "MSCI Index Data Retrieval"
  description: "Retrieves MSCI index constituent data and weightings for benchmark tracking and portfolio construction."
  tags:
    - index-data
    - msci
capability:
  exposes:
    - type: mcp
      namespace: msci
      port: 8080
      tools:
        - name: get-index-data
          description: "Retrieve MSCI index constituent data."
          inputParameters:
            - name: index_code
              in: body
              type: string
              description: "The MSCI index code."
          call: "msci.get-constituents"
          with:
            index_code: "{{index_code}}"
          outputParameters:
            - name: constituents
              type: array
              mapping: "$.constituents"
            - name: total_weight
              type: number
              mapping: "$.totalWeight"
  consumes:
    - type: http
      namespace: msci
      baseUri: "https://api.msci.com/v1"
      authentication:
        type: bearer
        token: "$secrets.msci_token"
      resources:
        - name: indices
          path: "/indices/{{index_code}}/constituents"
          inputParameters:
            - name: index_code
              in: path
          operations:
            - name: get-constituents
              method: GET

Pulls performance attribution from Aladdin, enriches with Bloomberg benchmark data, stores in Snowflake, uploads to SharePoint, and emails the report via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Multi-Asset Portfolio Attribution Report"
  description: "Pulls performance attribution from Aladdin, enriches with Bloomberg benchmark data, stores in Snowflake, uploads to SharePoint, and emails the report via Microsoft Outlook."
  tags:
    - portfolio-management
    - attribution
    - aladdin
    - bloomberg-enterprise-data
    - snowflake
    - sharepoint
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: attribution-report
      port: 8080
      tools:
        - name: generate-attribution-report
          description: "Build and distribute a multi-asset performance attribution report."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: benchmark_id
              in: body
              type: string
              description: "Bloomberg benchmark identifier."
            - name: period
              in: body
              type: string
              description: "Reporting period (e.g. 2026-Q1)."
            - name: recipient_email
              in: body
              type: string
              description: "Email address for report delivery."
          steps:
            - name: get-attribution
              type: call
              call: "aladdin.get-attribution"
              with:
                portfolio_id: "{{portfolio_id}}"
                period: "{{period}}"
            - name: get-benchmark
              type: call
              call: "bloomberg.get-snapshot"
              with:
                security_id: "{{benchmark_id}}"
            - name: store-attribution
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO performance.attribution VALUES ('{{portfolio_id}}', '{{period}}', '{{get-attribution.total_return}}', '{{get-benchmark.price}}')"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "performance-reports"
                file_path: "Attribution/{{portfolio_id}}_{{period}}.pdf"
                content: "{{get-attribution.report_data}}"
            - name: email-report
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{recipient_email}}"
                subject: "Attribution Report - Portfolio {{portfolio_id}} - {{period}}"
                body: "Please find attached the performance attribution report. Total return: {{get-attribution.total_return}}. Benchmark: {{get-benchmark.price}}."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: attribution
          path: "/portfolios/{{portfolio_id}}/attribution"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-attribution
              method: GET
    - type: http
      namespace: bloomberg
      baseUri: "https://bsapi.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_eap_token"
      resources:
        - name: snapshots
          path: "/snapshots/{{security_id}}"
          inputParameters:
            - name: security_id
              in: path
          operations:
            - name: get-snapshot
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: 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:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Provisions a new fund by creating the Aladdin portfolio, registering in SimCorp Dimension, setting up the Confluence documentation space, and notifying stakeholders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "New Fund Launch Orchestrator"
  description: "Provisions a new fund by creating the Aladdin portfolio, registering in SimCorp Dimension, setting up the Confluence documentation space, and notifying stakeholders via Microsoft Teams."
  tags:
    - fund-operations
    - aladdin
    - simcorp-dimension
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: fund-launch
      port: 8080
      tools:
        - name: launch-fund
          description: "Orchestrate new fund setup across Aladdin, SimCorp, Confluence, and Teams."
          inputParameters:
            - name: fund_name
              in: body
              type: string
              description: "Name of the new fund."
            - name: fund_type
              in: body
              type: string
              description: "Fund type (ETF, mutual_fund, alternatives)."
            - name: pm_email
              in: body
              type: string
              description: "Portfolio manager email."
          steps:
            - name: create-portfolio
              type: call
              call: "aladdin.create-portfolio"
              with:
                name: "{{fund_name}}"
                type: "{{fund_type}}"
            - name: register-fund
              type: call
              call: "simcorp.create-portfolio"
              with:
                portfolio_name: "{{fund_name}}"
                portfolio_ref: "{{create-portfolio.portfolio_id}}"
            - name: create-docs-space
              type: call
              call: "confluence.create-space"
              with:
                key: "FUND-{{create-portfolio.portfolio_id}}"
                name: "{{fund_name}} Documentation"
            - name: notify-stakeholders
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{pm_email}}"
                text: "Fund {{fund_name}} launched. Aladdin: {{create-portfolio.portfolio_id}}. SimCorp: {{register-fund.portfolio_code}}. Docs: {{create-docs-space.url}}."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: portfolios
          path: "/portfolios"
          operations:
            - name: create-portfolio
              method: POST
    - type: http
      namespace: simcorp
      baseUri: "https://simcorp.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.simcorp_token"
      resources:
        - name: portfolios
          path: "/portfolios"
          operations:
            - name: create-portfolio
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://blackrock.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: spaces
          path: "/space"
          operations:
            - name: create-space
              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

Pulls fundamental data from FactSet, retrieves recent Bloomberg news, sends both to OpenAI for an investment memo draft, and uploads the result to SharePoint.

naftiko: "0.5"
info:
  label: "OpenAI-Powered Investment Memo Drafter"
  description: "Pulls fundamental data from FactSet, retrieves recent Bloomberg news, sends both to OpenAI for an investment memo draft, and uploads the result to SharePoint."
  tags:
    - research
    - ai
    - factset
    - bloomberg-news
    - openai
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: ai-research
      port: 8080
      tools:
        - name: draft-investment-memo
          description: "Generate an AI-drafted investment memo from market data and news."
          inputParameters:
            - name: ticker
              in: body
              type: string
              description: "Equity ticker symbol."
            - name: analyst_name
              in: body
              type: string
              description: "Name of the requesting analyst."
          steps:
            - name: get-fundamentals
              type: call
              call: "factset.get-fundamentals"
              with:
                ticker: "{{ticker}}"
            - name: get-news
              type: call
              call: "bloomberg-news.get-articles"
              with:
                query: "{{ticker}}"
                limit: 10
            - name: generate-memo
              type: call
              call: "openai.create-completion"
              with:
                model: "gpt-4"
                prompt: "Draft an investment memo for {{ticker}}. Fundamentals: {{get-fundamentals.data}}. Recent news: {{get-news.articles}}. Analyst: {{analyst_name}}."
            - name: upload-memo
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "investment-research"
                file_path: "Memos/{{ticker}}_memo.md"
                content: "{{generate-memo.text}}"
  consumes:
    - type: http
      namespace: factset
      baseUri: "https://api.factset.com/content/factset-fundamentals/v2"
      authentication:
        type: basic
        username: "$secrets.factset_user"
        password: "$secrets.factset_password"
      resources:
        - name: fundamentals
          path: "/fundamentals?ids={{ticker}}"
          inputParameters:
            - name: ticker
              in: query
          operations:
            - name: get-fundamentals
              method: GET
    - type: http
      namespace: bloomberg-news
      baseUri: "https://bsapi.bloomberg.com/eap/catalogs/bbg"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_eap_token"
      resources:
        - name: articles
          path: "/news?query={{query}}&limit={{limit}}"
          inputParameters:
            - name: query
              in: query
            - name: limit
              in: query
          operations:
            - name: get-articles
              method: GET
    - type: http
      namespace: openai
      baseUri: "https://api.openai.com/v1"
      authentication:
        type: bearer
        token: "$secrets.openai_api_key"
      resources:
        - name: completions
          path: "/chat/completions"
          operations:
            - name: create-completion
              method: POST
    - type: http
      namespace: 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:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: upload-file
              method: PUT

Creates an OpsGenie alert for Aladdin platform and trading infrastructure issues.

naftiko: "0.5"
info:
  label: "OpsGenie Alert Creation"
  description: "Creates an OpsGenie alert for Aladdin platform and trading infrastructure issues."
  tags:
    - alerting
    - opsgenie
capability:
  exposes:
    - type: mcp
      namespace: opsgenie
      port: 8080
      tools:
        - name: create-alert
          description: "Create a new OpsGenie alert."
          inputParameters:
            - name: message
              in: body
              type: string
              description: "Alert message."
            - name: priority
              in: body
              type: string
              description: "Priority level: P1 through P5."
            - name: team
              in: body
              type: string
              description: "Responder team name."
          call: "opsgenie.create-alert"
          with:
            message: "{{message}}"
            priority: "{{priority}}"
            team: "{{team}}"
          outputParameters:
            - name: request_id
              type: string
              mapping: "$.requestId"
  consumes:
    - type: http
      namespace: opsgenie
      baseUri: "https://api.opsgenie.com/v2"
      authentication:
        type: apiKey
        name: "Authorization"
        in: header
        value: "GenieKey $secrets.opsgenie_api_key"
      resources:
        - name: alerts
          path: "/alerts"
          operations:
            - name: create-alert
              method: POST

Extracts departmental budgets from Oracle Hyperion, reconciles against Workday actuals, stores variance analysis in Snowflake, and emails the CFO a summary via Microsoft Outlook.

naftiko: "0.5"
info:
  label: "Oracle Hyperion Budget Consolidation"
  description: "Extracts departmental budgets from Oracle Hyperion, reconciles against Workday actuals, stores variance analysis in Snowflake, and emails the CFO a summary via Microsoft Outlook."
  tags:
    - finance
    - budgeting
    - oracle-hyperion
    - workday
    - snowflake
    - microsoft-outlook
capability:
  exposes:
    - type: mcp
      namespace: budget-consolidation
      port: 8080
      tools:
        - name: consolidate-budgets
          description: "Consolidate Hyperion budgets against Workday actuals and distribute variance report."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period identifier (e.g. FY2026-Q1)."
            - name: cfo_email
              in: body
              type: string
              description: "CFO email for report delivery."
          steps:
            - name: get-budgets
              type: call
              call: "hyperion.get-budget-data"
              with:
                period: "{{fiscal_period}}"
            - name: get-actuals
              type: call
              call: "workday.get-actuals"
              with:
                period: "{{fiscal_period}}"
            - name: store-variance
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO finance.budget_variance SELECT '{{fiscal_period}}', budget.dept, budget.amount, actual.amount, (budget.amount - actual.amount) AS variance FROM ({{get-budgets.data}}) budget JOIN ({{get-actuals.data}}) actual ON budget.dept = actual.dept"
            - name: email-cfo
              type: call
              call: "outlook.send-mail"
              with:
                to: "{{cfo_email}}"
                subject: "Budget Variance Report - {{fiscal_period}}"
                body: "Budget consolidation complete for {{fiscal_period}}. Total budget: {{get-budgets.total}}. Total actuals: {{get-actuals.total}}. Variance analysis stored in Snowflake."
  consumes:
    - type: http
      namespace: hyperion
      baseUri: "https://hyperion.blackrock.com/HyperionPlanning/rest/v3"
      authentication:
        type: basic
        username: "$secrets.hyperion_user"
        password: "$secrets.hyperion_password"
      resources:
        - name: budget-data
          path: "/applications/BudgetApp/plantypes/Plan1/exportDataSlice"
          operations:
            - name: get-budget-data
              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: actuals
          path: "/financial-management/actuals?period={{period}}"
          inputParameters:
            - name: period
              in: query
          operations:
            - name: get-actuals
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: outlook
      baseUri: "https://graph.microsoft.com/v1.0/me"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: send-mail
          path: "/sendMail"
          operations:
            - name: send-mail
              method: POST

Triggers a PagerDuty incident for critical trading platform and infrastructure alerts.

naftiko: "0.5"
info:
  label: "PagerDuty Incident Trigger"
  description: "Triggers a PagerDuty incident for critical trading platform and infrastructure alerts."
  tags:
    - incident-management
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: pagerduty
      port: 8080
      tools:
        - name: trigger-incident
          description: "Create a new PagerDuty incident."
          inputParameters:
            - name: service_id
              in: body
              type: string
              description: "The PagerDuty service ID."
            - name: title
              in: body
              type: string
              description: "Incident title."
            - name: urgency
              in: body
              type: string
              description: "Incident urgency: high or low."
          call: "pagerduty.create-incident"
          with:
            service_id: "{{service_id}}"
            title: "{{title}}"
            urgency: "{{urgency}}"
          outputParameters:
            - name: incident_id
              type: string
              mapping: "$.incident.id"
            - name: incident_url
              type: string
              mapping: "$.incident.html_url"
  consumes:
    - 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

Retrieves the current on-call engineer for a given PagerDuty escalation policy, returning name, email, and escalation level.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Lookup"
  description: "Retrieves the current on-call engineer for a given PagerDuty escalation policy, returning name, email, and escalation level."
  tags:
    - incident-management
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: pagerduty-oncall
      port: 8080
      tools:
        - name: get-oncall
          description: "Look up who is currently on call for a given PagerDuty escalation policy."
          inputParameters:
            - name: policy_id
              in: body
              type: string
              description: "The PagerDuty escalation policy ID."
          call: "pagerduty.get-oncalls"
          with:
            escalation_policy_ids: "{{policy_id}}"
  consumes:
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: bearer
        token: "$secrets.pagerduty_token"
      resources:
        - name: oncalls
          path: "/oncalls"
          inputParameters:
            - name: escalation_policy_ids
              in: query
          operations:
            - name: get-oncalls
              method: GET

Calculates rebalancing trades in Aladdin, validates compliance, submits orders via Bloomberg EMSX, and notifies the portfolio manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Portfolio Rebalancing Execution Pipeline"
  description: "Calculates rebalancing trades in Aladdin, validates compliance, submits orders via Bloomberg EMSX, and notifies the portfolio manager via Microsoft Teams."
  tags:
    - portfolio-management
    - rebalancing
    - aladdin
    - bloomberg-emsx
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: portfolio-rebalancing
      port: 8080
      tools:
        - name: execute-rebalance
          description: "Calculate, validate, execute, and notify for portfolio rebalancing."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: pm_channel
              in: body
              type: string
              description: "Microsoft Teams PM channel."
          steps:
            - name: calculate-trades
              type: call
              call: "aladdin.calculate-rebalance"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: check-compliance
              type: call
              call: "aladdin.check-compliance"
              with:
                portfolio_id: "{{portfolio_id}}"
                trades: "{{calculate-trades.proposed_trades}}"
            - name: submit-orders
              type: call
              call: "emsx.create-order-batch"
              with:
                orders: "{{calculate-trades.proposed_trades}}"
            - name: notify-pm
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{pm_channel}}"
                text: "Rebalance executed for {{portfolio_id}}: {{calculate-trades.trade_count}} trades. Compliance: {{check-compliance.status}}. EMSX batch: {{submit-orders.batch_id}}."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: rebalance
          path: "/portfolios/{{portfolio_id}}/rebalance"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: calculate-rebalance
              method: POST
        - name: compliance
          path: "/compliance/check"
          operations:
            - name: check-compliance
              method: POST
    - type: http
      namespace: emsx
      baseUri: "https://bsapi.bloomberg.com/emsapi/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_emsx_token"
      resources:
        - name: orders
          path: "/orders/batch"
          operations:
            - name: create-order-batch
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/general/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves portfolio holdings from Aladdin, queries risk factor exposures from Snowflake, generates a summary, and uploads the report to SharePoint for distribution.

naftiko: "0.5"
info:
  label: "Portfolio Risk Report Generator"
  description: "Retrieves portfolio holdings from Aladdin, queries risk factor exposures from Snowflake, generates a summary, and uploads the report to SharePoint for distribution."
  tags:
    - risk-analytics
    - portfolio-management
    - aladdin
    - snowflake
    - sharepoint
capability:
  exposes:
    - type: mcp
      namespace: risk-reporting
      port: 8080
      tools:
        - name: generate-risk-report
          description: "Build a risk report for a portfolio by combining holdings and factor exposures, then upload to SharePoint."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: as_of_date
              in: body
              type: string
              description: "Report date in YYYY-MM-DD format."
          steps:
            - name: get-holdings
              type: call
              call: "aladdin.get-holdings"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: get-risk-factors
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "SELECT factor_name, exposure, contribution FROM risk.factor_exposures WHERE portfolio_id = '{{portfolio_id}}' AND as_of_date = '{{as_of_date}}'"
            - name: upload-report
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "risk-reports-site"
                file_path: "RiskReports/{{portfolio_id}}_{{as_of_date}}.json"
                content: "{{get-risk-factors.data}}"
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2/portfolios"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: holdings
          path: "/{{portfolio_id}}/holdings"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-holdings
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: 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:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: upload-file
              method: PUT

Triggers a refresh of a Power BI dataset used for portfolio performance reporting.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh"
  description: "Triggers a refresh of a Power BI dataset used for portfolio performance reporting."
  tags:
    - reporting
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: bi-refresh
      port: 8080
      tools:
        - name: refresh-pbi-dataset
          description: "Trigger a refresh for a Power BI dataset by group and dataset ID."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "The Power BI workspace group ID."
            - name: dataset_id
              in: body
              type: string
              description: "The Power BI dataset ID."
          call: "powerbi.refresh-dataset"
          with:
            group_id: "{{group_id}}"
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST

Tracks private market deal progress by fetching deal data from Salesforce, updating Aladdin with valuation, logging milestones in Confluence, and alerting the deal team via Teams.

naftiko: "0.5"
info:
  label: "Private Markets Deal Tracking Pipeline"
  description: "Tracks private market deal progress by fetching deal data from Salesforce, updating Aladdin with valuation, logging milestones in Confluence, and alerting the deal team via Teams."
  tags:
    - alternatives
    - salesforce
    - aladdin
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: deal-tracking
      port: 8080
      tools:
        - name: update-deal-status
          description: "Update deal tracking across Salesforce, Aladdin, Confluence, and Teams."
          inputParameters:
            - name: deal_id
              in: body
              type: string
              description: "The Salesforce deal record ID."
            - name: valuation
              in: body
              type: number
              description: "Updated deal valuation."
            - name: status
              in: body
              type: string
              description: "Deal status (pipeline, due_diligence, committed, closed)."
          steps:
            - name: get-deal
              type: call
              call: "salesforce.get-deal"
              with:
                deal_id: "{{deal_id}}"
            - name: update-valuation
              type: call
              call: "aladdin.update-private-asset"
              with:
                asset_ref: "{{get-deal.Aladdin_Ref__c}}"
                valuation: "{{valuation}}"
                status: "{{status}}"
            - name: log-milestone
              type: call
              call: "confluence.create-page"
              with:
                space_key: "DEALS"
                title: "Deal Update: {{get-deal.Name}} — {{status}}"
                body: "Valuation: ${{valuation}}. Status: {{status}}. Updated by: {{get-deal.Owner.Name}}."
            - name: notify-team
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-deal.Owner.Email}}"
                text: "Deal {{get-deal.Name}} updated to {{status}}. Valuation: ${{valuation}}. Confluence: {{log-milestone.url}}."
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://blackrock.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: deals
          path: "/sobjects/Deal__c/{{deal_id}}"
          inputParameters:
            - name: deal_id
              in: path
          operations:
            - name: get-deal
              method: GET
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: private-assets
          path: "/private-assets/{{asset_ref}}"
          inputParameters:
            - name: asset_ref
              in: path
          operations:
            - name: update-private-asset
              method: PATCH
    - type: http
      namespace: confluence
      baseUri: "https://blackrock.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              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

When a Prometheus alert fires for an Aladdin microservice, queries Grafana for dashboard context, creates a PagerDuty incident, and logs the event in ServiceNow.

naftiko: "0.5"
info:
  label: "Prometheus Alert to PagerDuty Escalation"
  description: "When a Prometheus alert fires for an Aladdin microservice, queries Grafana for dashboard context, creates a PagerDuty incident, and logs the event in ServiceNow."
  tags:
    - monitoring
    - incident-response
    - prometheus
    - grafana
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: alert-escalation
      port: 8080
      tools:
        - name: escalate-prometheus-alert
          description: "Escalate a Prometheus alert through Grafana context, PagerDuty, and ServiceNow."
          inputParameters:
            - name: alert_name
              in: body
              type: string
              description: "Prometheus alert name."
            - name: service
              in: body
              type: string
              description: "Affected service name."
            - name: severity
              in: body
              type: string
              description: "Alert severity (critical, warning)."
          steps:
            - name: get-dashboard
              type: call
              call: "grafana.get-dashboard"
              with:
                uid: "{{service}}-overview"
            - name: create-pagerduty-incident
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{service}}"
                title: "{{alert_name}} - {{severity}}"
                body: "Prometheus alert {{alert_name}} fired for {{service}}. Dashboard: {{get-dashboard.url}}"
            - name: log-to-servicenow
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Prometheus: {{alert_name}} on {{service}}"
                category: "infrastructure"
                assigned_group: "SRE_Team"
                description: "Alert: {{alert_name}}. Severity: {{severity}}. PagerDuty: {{create-pagerduty-incident.incident_id}}."
  consumes:
    - type: http
      namespace: grafana
      baseUri: "https://grafana.blackrock.com/api"
      authentication:
        type: bearer
        token: "$secrets.grafana_token"
      resources:
        - name: dashboards
          path: "/dashboards/uid/{{uid}}"
          inputParameters:
            - name: uid
              in: path
          operations:
            - name: get-dashboard
              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: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Pulls portfolio holdings from Aladdin, fetches benchmark data from MSCI, generates an attribution report in Power BI, and distributes it via Salesforce to relationship managers.

naftiko: "0.5"
info:
  label: "Quarterly Attribution Report Pipeline"
  description: "Pulls portfolio holdings from Aladdin, fetches benchmark data from MSCI, generates an attribution report in Power BI, and distributes it via Salesforce to relationship managers."
  tags:
    - reporting
    - aladdin
    - msci
    - power-bi
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: attribution-report
      port: 8080
      tools:
        - name: generate-attribution-report
          description: "Generate and distribute a quarterly performance attribution report for a portfolio."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: benchmark_id
              in: body
              type: string
              description: "The MSCI benchmark index ID."
            - name: quarter
              in: body
              type: string
              description: "Reporting quarter in YYYY-Q format."
          steps:
            - name: get-holdings
              type: call
              call: "aladdin.get-holdings"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: get-benchmark
              type: call
              call: "msci.get-index-returns"
              with:
                index_id: "{{benchmark_id}}"
                period: "{{quarter}}"
            - name: refresh-report
              type: call
              call: "powerbi.refresh-dataset"
              with:
                dataset_id: "attribution-{{portfolio_id}}"
            - name: notify-rms
              type: call
              call: "salesforce.send-report-notification"
              with:
                subject: "Q{{quarter}} Attribution Report — Portfolio {{portfolio_id}}"
                body: "Attribution report refreshed. Active return: {{get-benchmark.active_return}}. View in Power BI."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: holdings
          path: "/portfolios/{{portfolio_id}}/holdings"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-holdings
              method: GET
    - type: http
      namespace: msci
      baseUri: "https://api.msci.com/index/v1"
      authentication:
        type: bearer
        token: "$secrets.msci_token"
      resources:
        - name: returns
          path: "/indexes/{{index_id}}/returns"
          inputParameters:
            - name: index_id
              in: path
            - name: period
              in: query
          operations:
            - name: get-index-returns
              method: GET
    - type: http
      namespace: powerbi
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: datasets
          path: "/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: dataset_id
              in: path
          operations:
            - name: refresh-dataset
              method: POST
    - type: http
      namespace: salesforce
      baseUri: "https://blackrock.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: notifications
          path: "/sobjects/Task"
          operations:
            - name: send-report-notification
              method: POST

Retrieves cached market data from Redis for low-latency price lookups in trading systems.

naftiko: "0.5"
info:
  label: "Redis Cache Market Data Lookup"
  description: "Retrieves cached market data from Redis for low-latency price lookups in trading systems."
  tags:
    - caching
    - redis
capability:
  exposes:
    - type: mcp
      namespace: redis-cache
      port: 8080
      tools:
        - name: get-value
          description: "Look up a cached market data value in Redis by key."
          inputParameters:
            - name: key
              in: body
              type: string
              description: "The Redis key to retrieve."
          call: "redis.get-key"
          with:
            key: "{{key}}"
          outputParameters:
            - name: value
              type: string
              mapping: "$.value"
            - name: ttl
              type: integer
              mapping: "$.ttl"
  consumes:
    - type: http
      namespace: redis
      baseUri: "https://redis.blackrock.com:6380"
      authentication:
        type: apiKey
        name: "Authorization"
        in: header
        value: "$secrets.redis_token"
      resources:
        - name: keys
          path: "/get/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: get-key
              method: GET

Fetches frequently accessed securities from Snowflake, pulls latest prices from Bloomberg, and pre-loads them into Redis for low-latency market data access.

naftiko: "0.5"
info:
  label: "Redis Cache Warm-Up for Market Data"
  description: "Fetches frequently accessed securities from Snowflake, pulls latest prices from Bloomberg, and pre-loads them into Redis for low-latency market data access."
  tags:
    - performance
    - caching
    - snowflake
    - bloomberg-enterprise-data
    - redis
capability:
  exposes:
    - type: mcp
      namespace: cache-warmup
      port: 8080
      tools:
        - name: warm-market-data-cache
          description: "Pre-load top securities pricing into Redis from Bloomberg via Snowflake universe list."
          inputParameters:
            - name: universe_name
              in: body
              type: string
              description: "Security universe name in Snowflake."
          steps:
            - name: get-universe
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "SELECT security_id FROM market_data.universes WHERE universe_name = '{{universe_name}}' LIMIT 500"
            - name: fetch-prices
              type: call
              call: "bloomberg.get-bulk-snapshots"
              with:
                security_ids: "{{get-universe.data}}"
            - name: load-cache
              type: call
              call: "redis.mset"
              with:
                key_prefix: "mktdata:"
                data: "{{fetch-prices.snapshots}}"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: bloomberg
      baseUri: "https://bsapi.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_eap_token"
      resources:
        - name: bulk-snapshots
          path: "/snapshots/bulk"
          operations:
            - name: get-bulk-snapshots
              method: POST
    - type: http
      namespace: redis
      baseUri: "https://redis-api.blackrock.com/v1"
      authentication:
        type: bearer
        token: "$secrets.redis_token"
      resources:
        - name: commands
          path: "/mset"
          operations:
            - name: mset
              method: POST

Retrieves credit spread data for a corporate bond from Refinitiv, returning z-spread, OAS, and benchmark spread values.

naftiko: "0.5"
info:
  label: "Refinitiv Credit Spread Lookup"
  description: "Retrieves credit spread data for a corporate bond from Refinitiv, returning z-spread, OAS, and benchmark spread values."
  tags:
    - fixed-income
    - refinitiv
capability:
  exposes:
    - type: mcp
      namespace: refinitiv-credit
      port: 8080
      tools:
        - name: get-credit-spread
          description: "Fetch credit spread metrics for a bond by its ISIN from Refinitiv."
          inputParameters:
            - name: isin
              in: body
              type: string
              description: "The ISIN of the bond instrument."
          call: "refinitiv.get-spreads"
          with:
            isin: "{{isin}}"
  consumes:
    - type: http
      namespace: refinitiv
      baseUri: "https://api.refinitiv.com/data/pricing/v1"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: spreads
          path: "/instruments/{{isin}}/spreads"
          inputParameters:
            - name: isin
              in: path
          operations:
            - name: get-spreads
              method: GET

Retrieves security reference data from Refinitiv Eikon for instrument identification and classification.

naftiko: "0.5"
info:
  label: "Refinitiv Eikon Security Lookup"
  description: "Retrieves security reference data from Refinitiv Eikon for instrument identification and classification."
  tags:
    - reference-data
    - refinitiv
capability:
  exposes:
    - type: mcp
      namespace: refinitiv
      port: 8080
      tools:
        - name: lookup-security
          description: "Look up security reference data from Refinitiv."
          inputParameters:
            - name: ric
              in: body
              type: string
              description: "The Reuters Instrument Code."
          call: "refinitiv.get-instrument"
          with:
            ric: "{{ric}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.instrument.name"
            - name: isin
              type: string
              mapping: "$.instrument.isin"
            - name: currency
              type: string
              mapping: "$.instrument.currency"
  consumes:
    - type: http
      namespace: refinitiv
      baseUri: "https://api.refinitiv.com/data/v1"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: instruments
          path: "/instruments/{{ric}}"
          inputParameters:
            - name: ric
              in: path
          operations:
            - name: get-instrument
              method: GET

Pulls security reference data from Refinitiv, validates against Aladdin security master, and updates discrepancies in Snowflake.

naftiko: "0.5"
info:
  label: "Refinitiv Reference Data Sync"
  description: "Pulls security reference data from Refinitiv, validates against Aladdin security master, and updates discrepancies in Snowflake."
  tags:
    - market-data
    - reference-data
    - refinitiv
    - aladdin
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: ref-data-sync
      port: 8080
      tools:
        - name: sync-reference-data
          description: "Compare Refinitiv and Aladdin security reference data and log differences."
          inputParameters:
            - name: ric
              in: body
              type: string
              description: "Reuters Instrument Code."
          steps:
            - name: get-refinitiv-data
              type: call
              call: "refinitiv.get-security"
              with:
                ric: "{{ric}}"
            - name: get-aladdin-security
              type: call
              call: "aladdin.get-security"
              with:
                identifier: "{{ric}}"
            - name: log-differences
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO reference_data.sync_log VALUES ('{{ric}}', '{{get-refinitiv-data.name}}', '{{get-aladdin-security.name}}', CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: refinitiv
      baseUri: "https://api.refinitiv.com/data/pricing/v1"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: instruments
          path: "/instruments/{{ric}}"
          inputParameters:
            - name: ric
              in: path
          operations:
            - name: get-security
              method: GET
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: securities
          path: "/securities/{{identifier}}"
          inputParameters:
            - name: identifier
              in: path
          operations:
            - name: get-security
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Extracts portfolio data from Aladdin, queries compliance metadata from Snowflake, generates a regulatory report, uploads to SharePoint, and creates a DocuSign envelope for sign-off.

naftiko: "0.5"
info:
  label: "Regulatory Filing Preparation Workflow"
  description: "Extracts portfolio data from Aladdin, queries compliance metadata from Snowflake, generates a regulatory report, uploads to SharePoint, and creates a DocuSign envelope for sign-off."
  tags:
    - compliance
    - regulatory
    - aladdin
    - snowflake
    - sharepoint
    - docusign
capability:
  exposes:
    - type: mcp
      namespace: regulatory-filing
      port: 8080
      tools:
        - name: prepare-regulatory-filing
          description: "Assemble a regulatory filing package from portfolio data, compliance metadata, and route for signature."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: filing_type
              in: body
              type: string
              description: "Regulatory filing type (e.g. 13F, N-PORT)."
            - name: signer_email
              in: body
              type: string
              description: "Email of the authorized signatory."
          steps:
            - name: get-holdings
              type: call
              call: "aladdin.get-holdings"
              with:
                portfolio_id: "{{portfolio_id}}"
            - name: get-compliance-metadata
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "SELECT * FROM compliance.filing_metadata WHERE portfolio_id = '{{portfolio_id}}' AND filing_type = '{{filing_type}}'"
            - name: upload-filing
              type: call
              call: "sharepoint.upload-file"
              with:
                site_id: "regulatory-filings"
                file_path: "Filings/{{filing_type}}/{{portfolio_id}}_draft.pdf"
                content: "{{get-compliance-metadata.data}}"
            - name: send-for-signature
              type: call
              call: "docusign.create-envelope"
              with:
                signer_email: "{{signer_email}}"
                document_url: "{{upload-filing.url}}"
                subject: "{{filing_type}} Filing - Portfolio {{portfolio_id}}"
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2/portfolios"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: holdings
          path: "/{{portfolio_id}}/holdings"
          inputParameters:
            - name: portfolio_id
              in: path
          operations:
            - name: get-holdings
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: 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:/{{file_path}}:/content"
          inputParameters:
            - name: site_id
              in: path
            - name: file_path
              in: path
          operations:
            - name: upload-file
              method: PUT
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/blackrock"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/envelopes"
          operations:
            - name: create-envelope
              method: POST

Extracts positions from Aladdin, generates regulatory report data in Snowflake, exports to Azure Blob Storage, and creates a Confluence page with the filing summary.

naftiko: "0.5"
info:
  label: "Regulatory Reporting Automation"
  description: "Extracts positions from Aladdin, generates regulatory report data in Snowflake, exports to Azure Blob Storage, and creates a Confluence page with the filing summary."
  tags:
    - regulatory
    - aladdin
    - snowflake
    - azure-blob-storage
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: reg-reporting
      port: 8080
      tools:
        - name: generate-regulatory-report
          description: "Generate and file a regulatory report with supporting documentation."
          inputParameters:
            - name: report_type
              in: body
              type: string
              description: "Regulatory report type (e.g. 13F, N-PORT, PF)."
            - name: reporting_period
              in: body
              type: string
              description: "Reporting period end date in YYYY-MM-DD."
          steps:
            - name: extract-positions
              type: call
              call: "aladdin.get-all-positions"
              with:
                as_of_date: "{{reporting_period}}"
            - name: generate-report
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "CALL REG.GENERATE_REPORT('{{report_type}}', '{{reporting_period}}')"
            - name: export-filing
              type: call
              call: "azure-blob.upload"
              with:
                container: "regulatory-filings"
                blob_name: "{{report_type}}/{{reporting_period}}/filing.xml"
                content: "{{generate-report.filing_xml}}"
            - name: create-summary
              type: call
              call: "confluence.create-page"
              with:
                space_key: "REG"
                title: "{{report_type}} Filing — {{reporting_period}}"
                body: "Filing complete. Report: {{export-filing.url}}. Total positions: {{extract-positions.count}}. Generated: {{generate-report.timestamp}}."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: positions
          path: "/positions"
          inputParameters:
            - name: as_of_date
              in: query
          operations:
            - name: get-all-positions
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: azure-blob
      baseUri: "https://blackrockdata.blob.core.windows.net"
      authentication:
        type: bearer
        token: "$secrets.azure_storage_token"
      resources:
        - name: blobs
          path: "/{{container}}/{{blob_name}}"
          inputParameters:
            - name: container
              in: path
            - name: blob_name
              in: path
          operations:
            - name: upload
              method: PUT
    - type: http
      namespace: confluence
      baseUri: "https://blackrock.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves current risk factor exposures from Snowflake, runs stress scenarios through Aladdin Risk, stores results in Azure Blob Storage, and notifies the risk team via Slack.

naftiko: "0.5"
info:
  label: "Risk Factor Stress Test Pipeline"
  description: "Retrieves current risk factor exposures from Snowflake, runs stress scenarios through Aladdin Risk, stores results in Azure Blob Storage, and notifies the risk team via Slack."
  tags:
    - risk-management
    - snowflake
    - aladdin
    - azure-blob-storage
    - slack
capability:
  exposes:
    - type: mcp
      namespace: stress-test
      port: 8080
      tools:
        - name: run-stress-test
          description: "Execute a stress test scenario and distribute results."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The portfolio identifier."
            - name: scenario_name
              in: body
              type: string
              description: "Name of the stress scenario to run."
          steps:
            - name: get-exposures
              type: call
              call: "snowflake.execute-statement"
              with:
                statement: "SELECT * FROM RISK.FACTOR_EXPOSURES WHERE portfolio_id = '{{portfolio_id}}'"
            - name: run-scenario
              type: call
              call: "aladdin.run-stress-test"
              with:
                portfolio_id: "{{portfolio_id}}"
                scenario: "{{scenario_name}}"
            - name: store-results
              type: call
              call: "azure-blob.upload"
              with:
                container: "stress-test-results"
                blob_name: "{{portfolio_id}}/{{scenario_name}}/latest.json"
                content: "{{run-scenario.results}}"
            - name: notify-risk
              type: call
              call: "slack.post-message"
              with:
                channel: "#risk-management"
                text: "Stress test complete: {{scenario_name}} on {{portfolio_id}}. P&L impact: {{run-scenario.pnl_impact}}. Results: {{store-results.url}}."
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: stress-tests
          path: "/risk/stress-tests"
          operations:
            - name: run-stress-test
              method: POST
    - type: http
      namespace: azure-blob
      baseUri: "https://blackrockdata.blob.core.windows.net"
      authentication:
        type: bearer
        token: "$secrets.azure_storage_token"
      resources:
        - name: blobs
          path: "/{{container}}/{{blob_name}}"
          inputParameters:
            - name: container
              in: path
            - name: blob_name
              in: path
          operations:
            - name: upload
              method: PUT
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a Salesforce account summary for an institutional client, returning AUM, relationship tier, and contact details.

naftiko: "0.5"
info:
  label: "Salesforce Client Account Summary"
  description: "Retrieves a Salesforce account summary for an institutional client, returning AUM, relationship tier, and contact details."
  tags:
    - sales
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: crm
      port: 8080
      tools:
        - name: get-client-account
          description: "Fetch a Salesforce account record for an institutional client by account ID."
          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://blackrock.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{account_id}}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET

When a Salesforce opportunity is won, provisions an Aladdin portfolio, creates a DocuSign IMA envelope, and opens a ServiceNow implementation ticket.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity to Aladdin Pipeline"
  description: "When a Salesforce opportunity is won, provisions an Aladdin portfolio, creates a DocuSign IMA envelope, and opens a ServiceNow implementation ticket."
  tags:
    - sales
    - salesforce
    - aladdin
    - docusign
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: opportunity-pipeline
      port: 8080
      tools:
        - name: process-won-opportunity
          description: "Provision portfolio and initiate client agreement when an opportunity is won."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-portfolio
              type: call
              call: "aladdin.create-portfolio"
              with:
                name: "{{get-opportunity.Account.Name}} — {{get-opportunity.Name}}"
                mandate_type: "{{get-opportunity.Investment_Strategy__c}}"
            - name: send-ima
              type: call
              call: "docusign.create-envelope"
              with:
                template_id: "IMA-STANDARD"
                signer_email: "{{get-opportunity.Contact_Email__c}}"
                signer_name: "{{get-opportunity.Contact_Name__c}}"
                portfolio_id: "{{create-portfolio.portfolio_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "Implementation: {{get-opportunity.Account.Name}}"
                description: "Opportunity {{opportunity_id}} won. Portfolio: {{create-portfolio.portfolio_id}}. IMA: {{send-ima.envelope_id}}."
                category: "client_implementation"
  consumes:
    - type: http
      namespace: salesforce
      baseUri: "https://blackrock.my.salesforce.com/services/data/v59.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opportunity_id}}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: portfolios
          path: "/portfolios"
          operations:
            - name: create-portfolio
              method: POST
    - type: http
      namespace: docusign
      baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/$secrets.docusign_account_id"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/envelopes"
          operations:
            - name: create-envelope
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Retrieves pending expense reports from SAP Concur, matches them against budget codes in Snowflake, and creates Workday journal entries for approved expenses.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Report Sync"
  description: "Retrieves pending expense reports from SAP Concur, matches them against budget codes in Snowflake, and creates Workday journal entries for approved expenses."
  tags:
    - finance
    - expenses
    - sap-concur
    - snowflake
    - workday
capability:
  exposes:
    - type: mcp
      namespace: expense-sync
      port: 8080
      tools:
        - name: sync-expenses
          description: "Pull Concur expenses, validate budgets, and post to Workday."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
          steps:
            - name: get-expense-report
              type: call
              call: "concur.get-report"
              with:
                report_id: "{{report_id}}"
            - name: validate-budget
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "SELECT budget_code, remaining_amount FROM finance.budgets WHERE cost_center = '{{get-expense-report.cost_center}}'"
            - name: post-journal
              type: call
              call: "workday.create-journal"
              with:
                cost_center: "{{get-expense-report.cost_center}}"
                amount: "{{get-expense-report.total_amount}}"
                description: "Expense report {{report_id}}: {{get-expense-report.purpose}}"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us2.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: workday
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: journals
          path: "/financial-management/journal-entries"
          operations:
            - name: create-journal
              method: POST

Retrieves the approval status of an expense report from SAP Concur for finance team tracking.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Status Check"
  description: "Retrieves the approval status of an expense report from SAP Concur for finance team tracking."
  tags:
    - expense-management
    - sap-concur
capability:
  exposes:
    - type: mcp
      namespace: concur
      port: 8080
      tools:
        - name: get-expense-status
          description: "Check the status of an expense report."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "The SAP Concur expense report ID."
          call: "concur.get-report"
          with:
            report_id: "{{report_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.ApprovalStatus"
            - name: total
              type: number
              mapping: "$.Total"
  consumes:
    - type: http
      namespace: concur
      baseUri: "https://us2.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET

When a Docker image vulnerability is found, creates a Jira ticket for the owning team, posts to the security Slack channel, and triggers a Terraform plan to rotate affected infrastructure.

naftiko: "0.5"
info:
  label: "Security Vulnerability Remediation Pipeline"
  description: "When a Docker image vulnerability is found, creates a Jira ticket for the owning team, posts to the security Slack channel, and triggers a Terraform plan to rotate affected infrastructure."
  tags:
    - security
    - docker
    - jira
    - slack
    - terraform
capability:
  exposes:
    - type: mcp
      namespace: vuln-remediation
      port: 8080
      tools:
        - name: remediate-vulnerability
          description: "Track and remediate a container vulnerability across Jira, Slack, and Terraform."
          inputParameters:
            - name: image_name
              in: body
              type: string
              description: "The Docker image name with tag."
            - name: cve_id
              in: body
              type: string
              description: "The CVE identifier."
            - name: severity
              in: body
              type: string
              description: "Severity level (CRITICAL, HIGH, MEDIUM, LOW)."
            - name: owning_team
              in: body
              type: string
              description: "Jira project key for the owning team."
          steps:
            - name: create-ticket
              type: call
              call: "jira.create-issue"
              with:
                project: "{{owning_team}}"
                summary: "{{severity}} vulnerability {{cve_id}} in {{image_name}}"
                description: "CVE: {{cve_id}}. Image: {{image_name}}. Severity: {{severity}}. Remediate immediately."
                issue_type: "Bug"
                priority: "{{severity}}"
            - name: notify-security
              type: call
              call: "slack.post-message"
              with:
                channel: "#security-alerts"
                text: "{{severity}} vulnerability {{cve_id}} found in {{image_name}}. Jira: {{create-ticket.key}}. Assigned to {{owning_team}}."
            - name: trigger-rotation
              type: call
              call: "terraform.create-run"
              with:
                workspace_id: "ws-infra-rotation"
                message: "Rotate infrastructure for {{cve_id}} remediation"
  consumes:
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST

Creates a ServiceNow incident for BlackRock technology operations, assigning severity, category, and support group.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Creation"
  description: "Creates a ServiceNow incident for BlackRock technology operations, assigning severity, category, and support group."
  tags:
    - operations
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: itsm
      port: 8080
      tools:
        - name: create-incident
          description: "Open a new ServiceNow incident with a short description, category, and assigned group."
          inputParameters:
            - name: short_description
              in: body
              type: string
              description: "Brief summary of the incident."
            - name: category
              in: body
              type: string
              description: "Incident category."
            - name: assigned_group
              in: body
              type: string
              description: "Support group to assign."
          call: "servicenow.create-incident"
          with:
            short_description: "{{short_description}}"
            category: "{{category}}"
            assigned_group: "{{assigned_group}}"
  consumes:
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Extracts Net Asset Value data from SimCorp Dimension, compares against Aladdin valuations, flags discrepancies in Snowflake, and alerts operations via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SimCorp Dimension NAV Reconciliation"
  description: "Extracts Net Asset Value data from SimCorp Dimension, compares against Aladdin valuations, flags discrepancies in Snowflake, and alerts operations via Microsoft Teams."
  tags:
    - fund-accounting
    - reconciliation
    - simcorp-dimension
    - aladdin
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: nav-recon
      port: 8080
      tools:
        - name: reconcile-nav
          description: "Compare NAV between SimCorp and Aladdin, flag and alert on discrepancies."
          inputParameters:
            - name: fund_id
              in: body
              type: string
              description: "The fund identifier."
            - name: valuation_date
              in: body
              type: string
              description: "Valuation date in YYYY-MM-DD format."
            - name: ops_channel_id
              in: body
              type: string
              description: "Teams channel for operations alerts."
          steps:
            - name: get-simcorp-nav
              type: call
              call: "simcorp.get-nav"
              with:
                fund_id: "{{fund_id}}"
                date: "{{valuation_date}}"
            - name: get-aladdin-nav
              type: call
              call: "aladdin.get-valuation"
              with:
                portfolio_id: "{{fund_id}}"
                date: "{{valuation_date}}"
            - name: log-discrepancy
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO recon.nav_breaks VALUES ('{{fund_id}}', '{{valuation_date}}', '{{get-simcorp-nav.nav}}', '{{get-aladdin-nav.nav}}', CURRENT_TIMESTAMP())"
            - name: alert-ops
              type: call
              call: "msteams.post-channel-message"
              with:
                channel_id: "{{ops_channel_id}}"
                text: "NAV Recon for {{fund_id}} on {{valuation_date}}: SimCorp={{get-simcorp-nav.nav}}, Aladdin={{get-aladdin-nav.nav}}. Difference logged."
  consumes:
    - type: http
      namespace: simcorp
      baseUri: "https://simcorp.blackrock.com/api/v1"
      authentication:
        type: bearer
        token: "$secrets.simcorp_token"
      resources:
        - name: nav
          path: "/funds/{{fund_id}}/nav?date={{date}}"
          inputParameters:
            - name: fund_id
              in: path
            - name: date
              in: query
          operations:
            - name: get-nav
              method: GET
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: valuations
          path: "/portfolios/{{portfolio_id}}/valuation?date={{date}}"
          inputParameters:
            - name: portfolio_id
              in: path
            - name: date
              in: query
          operations:
            - name: get-valuation
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: msteams
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Posts a message to a Slack channel for investment team communications and automated trading notifications.

naftiko: "0.5"
info:
  label: "Slack Channel Message"
  description: "Posts a message to a Slack channel for investment team communications and automated trading notifications."
  tags:
    - messaging
    - slack
capability:
  exposes:
    - type: mcp
      namespace: slack
      port: 8080
      tools:
        - name: post-message
          description: "Post a message to a Slack channel."
          inputParameters:
            - name: channel
              in: body
              type: string
              description: "The Slack channel ID."
            - name: text
              in: body
              type: string
              description: "Message text."
          call: "slack.post-message"
          with:
            channel: "{{channel}}"
            text: "{{text}}"
          outputParameters:
            - name: ts
              type: string
              mapping: "$.ts"
            - name: ok
              type: boolean
              mapping: "$.ok"
  consumes:
    - type: http
      namespace: slack
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Executes a SQL statement against the Snowflake risk warehouse to retrieve portfolio-level aggregation data such as sector allocation or duration.

naftiko: "0.5"
info:
  label: "Snowflake Portfolio Query"
  description: "Executes a SQL statement against the Snowflake risk warehouse to retrieve portfolio-level aggregation data such as sector allocation or duration."
  tags:
    - data-warehouse
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: snowflake-query
      port: 8080
      tools:
        - name: run-portfolio-query
          description: "Run a read-only SQL query on the Snowflake portfolio analytics warehouse."
          inputParameters:
            - name: sql_statement
              in: body
              type: string
              description: "The SQL SELECT statement to execute."
          call: "snowflake.execute-statement"
          with:
            statement: "{{sql_statement}}"
            warehouse: "PORTFOLIO_WH"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Executes a SQL query against BlackRock's Snowflake data warehouse to retrieve computed risk factor exposures for a given portfolio.

naftiko: "0.5"
info:
  label: "Snowflake Risk Factor Query"
  description: "Executes a SQL query against BlackRock's Snowflake data warehouse to retrieve computed risk factor exposures for a given portfolio."
  tags:
    - risk-analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: risk-warehouse
      port: 8080
      tools:
        - name: query-risk-factors
          description: "Run a risk factor exposure query against Snowflake for a specified portfolio and date."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The internal portfolio identifier."
            - name: as_of_date
              in: body
              type: string
              description: "Risk calculation date in YYYY-MM-DD format."
          call: "snowflake.execute-query"
          with:
            statement: "SELECT factor_name, exposure, contribution FROM risk.factor_exposures WHERE portfolio_id = '{{portfolio_id}}' AND as_of_date = '{{as_of_date}}'"
  consumes:
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Runs a Splunk search query against BlackRock security logs to investigate access events and anomalies.

naftiko: "0.5"
info:
  label: "Splunk Security Log Query"
  description: "Runs a Splunk search query against BlackRock security logs to investigate access events and anomalies."
  tags:
    - security
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: security-logs
      port: 8080
      tools:
        - name: search-security-logs
          description: "Execute a Splunk search query against security event indexes."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "The Splunk SPL search query."
          call: "splunk.create-search"
          with:
            search: "{{search_query}}"
  consumes:
    - type: http
      namespace: splunk
      baseUri: "https://splunk.blackrock.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: search-jobs
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST

Triggers a Tableau Server extract refresh for a specified risk analytics workbook to ensure dashboards reflect the latest data.

naftiko: "0.5"
info:
  label: "Tableau Risk Dashboard Refresh"
  description: "Triggers a Tableau Server extract refresh for a specified risk analytics workbook to ensure dashboards reflect the latest data."
  tags:
    - analytics
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: analytics-refresh
      port: 8080
      tools:
        - name: refresh-risk-dashboard
          description: "Trigger an extract refresh on a Tableau workbook by datasource ID."
          inputParameters:
            - name: datasource_id
              in: body
              type: string
              description: "The Tableau datasource LUID."
          call: "tableau.refresh-datasource"
          with:
            datasource_id: "{{datasource_id}}"
  consumes:
    - type: http
      namespace: tableau
      baseUri: "https://tableau.blackrock.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/default/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-datasource
              method: POST

Triggers a Terraform plan for an Aladdin infrastructure module, posts the plan output to a Confluence review page, and creates a Jira approval ticket.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Plan Review"
  description: "Triggers a Terraform plan for an Aladdin infrastructure module, posts the plan output to a Confluence review page, and creates a Jira approval ticket."
  tags:
    - infrastructure
    - terraform
    - confluence
    - jira
capability:
  exposes:
    - type: mcp
      namespace: infra-review
      port: 8080
      tools:
        - name: plan-and-review
          description: "Run a Terraform plan and create review artifacts in Confluence and Jira."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Terraform Cloud workspace ID."
            - name: confluence_space
              in: body
              type: string
              description: "Confluence space key for infrastructure reviews."
          steps:
            - name: create-run
              type: call
              call: "terraform.create-run"
              with:
                workspace_id: "{{workspace_id}}"
                is_destroy: false
                message: "Automated plan review"
            - name: create-review-page
              type: call
              call: "confluence.create-page"
              with:
                space_key: "{{confluence_space}}"
                title: "Terraform Plan Review - {{create-run.id}}"
                body: "Plan output for workspace {{workspace_id}}: {{create-run.plan_summary}}"
            - name: create-approval
              type: call
              call: "jira.create-issue"
              with:
                project: "INFRA"
                summary: "Approve Terraform plan: {{create-run.id}}"
                description: "Review page: {{create-review-page.url}}. Resources to add: {{create-run.resource_additions}}, to change: {{create-run.resource_changes}}, to destroy: {{create-run.resource_destructions}}."
                issue_type: "Task"
  consumes:
    - type: http
      namespace: terraform
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: runs
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - type: http
      namespace: confluence
      baseUri: "https://blackrock.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: jira
      baseUri: "https://blackrock.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Before submitting a trade through Bloomberg EMSX, validates the order against Aladdin compliance rules. If the order passes, submits to EMSX; if it fails, creates a Jira compliance review ticket and notifies the trader via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Trade Compliance Pre-Check and EMSX Submission"
  description: "Before submitting a trade through Bloomberg EMSX, validates the order against Aladdin compliance rules. If the order passes, submits to EMSX; if it fails, creates a Jira compliance review ticket and notifies the trader via Microsoft Teams."
  tags:
    - trading
    - compliance
    - aladdin
    - bloomberg-emsx
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: compliant-trade
      port: 8080
      tools:
        - name: submit-compliant-trade
          description: "Validate a trade against compliance rules and submit to EMSX if approved, or escalate if rejected."
          inputParameters:
            - name: portfolio_id
              in: body
              type: string
              description: "The Aladdin portfolio identifier."
            - name: ticker
              in: body
              type: string
              description: "Security ticker symbol."
            - name: side
              in: body
              type: string
              description: "BUY or SELL."
            - name: quantity
              in: body
              type: integer
              description: "Number of shares."
            - name: trader_email
              in: body
              type: string
              description: "Email of the trader for notification."
          steps:
            - name: compliance-check
              type: call
              call: "aladdin.check-compliance"
              with:
                portfolio_id: "{{portfolio_id}}"
                ticker: "{{ticker}}"
                side: "{{side}}"
                quantity: "{{quantity}}"
            - name: submit-order
              type: call
              call: "emsx.create-order"
              with:
                ticker: "{{ticker}}"
                side: "{{side}}"
                quantity: "{{quantity}}"
                order_type: "MARKET"
            - name: notify-trader
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{trader_email}}"
                text: "Trade {{side}} {{quantity}} {{ticker}} for portfolio {{portfolio_id}} submitted. EMSX order ref: {{submit-order.order_id}}."
  consumes:
    - type: http
      namespace: aladdin
      baseUri: "https://aladdin.blackrock.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.aladdin_token"
      resources:
        - name: compliance
          path: "/compliance/check"
          operations:
            - name: check-compliance
              method: POST
    - type: http
      namespace: emsx
      baseUri: "https://bsapi.bloomberg.com/emsapi/v1"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_emsx_token"
      resources:
        - name: orders
          path: "/orders"
          operations:
            - name: create-order
              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

Submits a Request for Quote on Tradeweb for a fixed income security, retrieves dealer responses, selects the best quote, and logs the trade to Snowflake.

naftiko: "0.5"
info:
  label: "Tradeweb Fixed Income RFQ"
  description: "Submits a Request for Quote on Tradeweb for a fixed income security, retrieves dealer responses, selects the best quote, and logs the trade to Snowflake."
  tags:
    - trading
    - fixed-income
    - tradeweb
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: tradeweb-rfq
      port: 8080
      tools:
        - name: submit-rfq
          description: "Submit an RFQ on Tradeweb and process dealer quotes."
          inputParameters:
            - name: security_id
              in: body
              type: string
              description: "Bond CUSIP or ISIN."
            - name: side
              in: body
              type: string
              description: "BUY or SELL."
            - name: quantity
              in: body
              type: number
              description: "Face value."
            - name: dealers
              in: body
              type: string
              description: "Comma-separated dealer codes."
          steps:
            - name: create-rfq
              type: call
              call: "tradeweb.create-rfq"
              with:
                security_id: "{{security_id}}"
                side: "{{side}}"
                quantity: "{{quantity}}"
                dealers: "{{dealers}}"
            - name: get-quotes
              type: call
              call: "tradeweb.get-quotes"
              with:
                rfq_id: "{{create-rfq.rfq_id}}"
            - name: log-trade
              type: call
              call: "snowflake.execute-query"
              with:
                statement: "INSERT INTO trading.rfq_log VALUES ('{{create-rfq.rfq_id}}', '{{security_id}}', '{{side}}', {{quantity}}, '{{get-quotes.best_dealer}}', {{get-quotes.best_price}}, CURRENT_TIMESTAMP())"
  consumes:
    - type: http
      namespace: tradeweb
      baseUri: "https://api.tradeweb.com/v1"
      authentication:
        type: bearer
        token: "$secrets.tradeweb_token"
      resources:
        - name: rfqs
          path: "/rfqs"
          operations:
            - name: create-rfq
              method: POST
        - name: quotes
          path: "/rfqs/{{rfq_id}}/quotes"
          inputParameters:
            - name: rfq_id
              in: path
          operations:
            - name: get-quotes
              method: GET
    - type: http
      namespace: snowflake
      baseUri: "https://blackrock.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST

Sends an SMS notification via Twilio for critical portfolio alerts and trade confirmations.

naftiko: "0.5"
info:
  label: "Twilio SMS Notification"
  description: "Sends an SMS notification via Twilio for critical portfolio alerts and trade confirmations."
  tags:
    - notifications
    - twilio
capability:
  exposes:
    - type: mcp
      namespace: twilio-sms
      port: 8080
      tools:
        - name: send-sms
          description: "Send an SMS message to a phone number."
          inputParameters:
            - name: to
              in: body
              type: string
              description: "Recipient phone number in E.164 format."
            - name: message
              in: body
              type: string
              description: "The SMS message body."
          call: "twilio.send-message"
          with:
            to: "{{to}}"
            from: "$secrets.twilio_from_number"
            body: "{{message}}"
          outputParameters:
            - name: message_sid
              type: string
              mapping: "$.sid"
            - name: status
              type: string
              mapping: "$.status"
  consumes:
    - type: http
      namespace: twilio
      baseUri: "https://api.twilio.com/2010-04-01/Accounts/$secrets.twilio_account_sid"
      authentication:
        type: basic
        username: "$secrets.twilio_account_sid"
        password: "$secrets.twilio_auth_token"
      resources:
        - name: messages
          path: "/Messages.json"
          operations:
            - name: send-message
              method: POST

Receives an invoice from Coupa, validates the vendor in SAP, routes for approval in ServiceNow, and posts the journal entry to Oracle Hyperion upon approval.

naftiko: "0.5"
info:
  label: "Vendor Invoice Approval Pipeline"
  description: "Receives an invoice from Coupa, validates the vendor in SAP, routes for approval in ServiceNow, and posts the journal entry to Oracle Hyperion upon approval."
  tags:
    - procurement
    - coupa
    - sap
    - servicenow
    - oracle-hyperion
capability:
  exposes:
    - type: mcp
      namespace: invoice-approval
      port: 8080
      tools:
        - name: process-invoice
          description: "Validate, approve, and post a vendor invoice across Coupa, SAP, ServiceNow, and Hyperion."
          inputParameters:
            - name: invoice_id
              in: body
              type: string
              description: "The Coupa invoice identifier."
          steps:
            - name: get-invoice
              type: call
              call: "coupa.get-invoice"
              with:
                invoice_id: "{{invoice_id}}"
            - name: validate-vendor
              type: call
              call: "sap.get-vendor"
              with:
                vendor_id: "{{get-invoice.vendor_id}}"
            - name: request-approval
              type: call
              call: "servicenow.create-change-request"
              with:
                short_description: "Invoice approval: {{get-invoice.invoice_number}} — ${{get-invoice.total_amount}}"
                description: "Vendor: {{validate-vendor.vendor_name}}. Amount: ${{get-invoice.total_amount}}. Cost center: {{get-invoice.cost_center}}."
                category: "finance"
            - name: post-journal
              type: call
              call: "hyperion.post-entry"
              with:
                account: "{{get-invoice.gl_account}}"
                amount: "{{get-invoice.total_amount}}"
                cost_center: "{{get-invoice.cost_center}}"
                reference: "{{get-invoice.invoice_number}}"
  consumes:
    - type: http
      namespace: coupa
      baseUri: "https://blackrock.coupahost.com/api"
      authentication:
        type: bearer
        token: "$secrets.coupa_api_key"
      resources:
        - name: invoices
          path: "/invoices/{{invoice_id}}"
          inputParameters:
            - name: invoice_id
              in: path
          operations:
            - name: get-invoice
              method: GET
    - type: http
      namespace: sap
      baseUri: "https://blackrock-s4.sap.com/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: vendors
          path: "/API_BUSINESS_PARTNER/A_Supplier('{{vendor_id}}')"
          inputParameters:
            - name: vendor_id
              in: path
          operations:
            - name: get-vendor
              method: GET
    - type: http
      namespace: servicenow
      baseUri: "https://blackrock.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change-request
              method: POST
    - type: http
      namespace: hyperion
      baseUri: "https://hyperion.blackrock.com/HyperionPlanning/rest/v3"
      authentication:
        type: basic
        username: "$secrets.hyperion_user"
        password: "$secrets.hyperion_password"
      resources:
        - name: journal-entries
          path: "/applications/FINPLAN/journals"
          operations:
            - name: post-entry
              method: POST

Fetches compensation details for an employee from Workday HCM, returning base salary, bonus target, and equity grants.

naftiko: "0.5"
info:
  label: "Workday Compensation Lookup"
  description: "Fetches compensation details for an employee from Workday HCM, returning base salary, bonus target, and equity grants."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: workday-comp
      port: 8080
      tools:
        - name: get-compensation
          description: "Retrieve compensation details for a Workday worker by worker ID."
          inputParameters:
            - name: worker_id
              in: body
              type: string
              description: "The Workday worker identifier."
          call: "workday.get-compensation"
          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: compensation
          path: "/workers/{{worker_id}}/compensation"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-compensation
              method: GET

Retrieves an employee profile from Workday by worker ID, returning name, title, department, and manager information.

naftiko: "0.5"
info:
  label: "Workday Employee Profile Lookup"
  description: "Retrieves an employee profile from Workday by worker ID, returning name, title, department, and manager information."
  tags:
    - hr
    - workday
capability:
  exposes:
    - type: mcp
      namespace: hr-directory
      port: 8080
      tools:
        - name: get-employee
          description: "Look up an employee profile in 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

Fetches candidate applications from Workday Recruiting, scores them using an internal ML model on Databricks, and updates candidate status back in Workday.

naftiko: "0.5"
info:
  label: "Workday Recruiting Candidate Pipeline"
  description: "Fetches candidate applications from Workday Recruiting, scores them using an internal ML model on Databricks, and updates candidate status back in Workday."
  tags:
    - hr
    - recruiting
    - workday-recruiting
    - databricks
capability:
  exposes:
    - type: mcp
      namespace: recruiting-pipeline
      port: 8080
      tools:
        - name: score-candidates
          description: "Fetch candidates from Workday Recruiting, score via ML, and update statuses."
          inputParameters:
            - name: job_requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID."
          steps:
            - name: get-candidates
              type: call
              call: "workday-recruiting.get-applications"
              with:
                requisition_id: "{{job_requisition_id}}"
            - name: score-candidates
              type: call
              call: "databricks.run-inference"
              with:
                model_name: "candidate-scoring"
                input_data: "{{get-candidates.applications}}"
            - name: update-status
              type: call
              call: "workday-recruiting.update-application"
              with:
                requisition_id: "{{job_requisition_id}}"
                scores: "{{score-candidates.predictions}}"
  consumes:
    - type: http
      namespace: workday-recruiting
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1/recruiting"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: applications
          path: "/requisitions/{{requisition_id}}/applications"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-applications
              method: GET
        - name: update
          path: "/requisitions/{{requisition_id}}/applications"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: update-application
              method: PATCH
    - type: http
      namespace: databricks
      baseUri: "https://blackrock.cloud.databricks.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: serving
          path: "/serving-endpoints/{{model_name}}/invocations"
          inputParameters:
            - name: model_name
              in: path
          operations:
            - name: run-inference
              method: POST