Blackrock Capabilities
Naftiko 0.5 capability definitions for Blackrock - 100 capabilities showing integration workflows and service orchestrations.
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