Charles Schwab Capabilities
Naftiko 0.5 capability definitions for Charles Schwab - 100 capabilities showing integration workflows and service orchestrations.
Processes ACH transfers by validating bank details, running fraud screening via Splunk, submitting to the payment gateway, logging in Snowflake, and notifying the client via email.
naftiko: "0.5"
info:
label: "ACH Transfer Processing Orchestrator"
description: "Processes ACH transfers by validating bank details, running fraud screening via Splunk, submitting to the payment gateway, logging in Snowflake, and notifying the client via email."
tags:
- payments
- ach
- splunk
- snowflake
capability:
exposes:
- type: mcp
namespace: ach-processing
port: 8080
tools:
- name: process-ach-transfer
description: "Orchestrate ACH transfer processing across validation, fraud check, payment, and logging."
inputParameters:
- name: account_id
in: body
type: string
description: "Schwab account ID."
- name: amount
in: body
type: number
description: "Transfer amount."
- name: direction
in: body
type: string
description: "Transfer direction (deposit, withdrawal)."
- name: external_account
in: body
type: string
description: "External bank account identifier."
steps:
- name: validate-bank
type: call
call: "banking.validate-external-account"
with:
external_account: "{{external_account}}"
- name: fraud-screen
type: call
call: "splunk.search"
with:
query: "index=ach_fraud account={{account_id}} OR bank={{external_account}} earliest=-90d | stats count as alerts"
- name: submit-transfer
type: call
call: "payments.submit-ach"
with:
account_id: "{{account_id}}"
amount: "{{amount}}"
direction: "{{direction}}"
external_account: "{{external_account}}"
- name: log-transfer
type: call
call: "snowflake.insert-ach-log"
with:
statement: "INSERT INTO ACH_TRANSFER_LOG VALUES ('{{account_id}}', {{amount}}, '{{direction}}', '{{submit-transfer.confirmation_id}}', CURRENT_TIMESTAMP)"
warehouse: "SCHWAB_PAYMENTS_WH"
consumes:
- type: http
namespace: banking
baseUri: "https://core-banking.schwab.com/api/v2"
authentication:
type: bearer
token: "$secrets.banking_api_token"
resources:
- name: validation
path: "/external-accounts/validate"
operations:
- name: validate-external-account
method: POST
- type: http
namespace: splunk
baseUri: "https://splunk.schwab.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search
path: "/search/jobs"
operations:
- name: search
method: POST
- type: http
namespace: payments
baseUri: "https://payments-api.schwab.com/v1"
authentication:
type: bearer
token: "$secrets.payments_api_token"
resources:
- name: ach
path: "/ach/transfers"
operations:
- name: submit-ach
method: POST
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-ach-log
method: POST
Retrieves payroll summary data from ADP for financial operations and compensation analysis.
naftiko: "0.5"
info:
label: "ADP Payroll Data Retriever"
description: "Retrieves payroll summary data from ADP for financial operations and compensation analysis."
tags:
- hr
- payroll
- adp
capability:
exposes:
- type: mcp
namespace: payroll
port: 8080
tools:
- name: get-payroll-summary
description: "Fetch payroll summary data from ADP."
inputParameters:
- name: pay_period
in: body
type: string
description: "Pay period identifier."
- name: department
in: body
type: string
description: "Department filter."
call: "adp.get-payroll"
with:
period: "{{pay_period}}"
department: "{{department}}"
outputParameters:
- name: total_gross
type: number
mapping: "$.summary.total_gross"
- name: headcount
type: integer
mapping: "$.summary.headcount"
consumes:
- type: http
namespace: adp
baseUri: "https://api.adp.com/hr/v2"
authentication:
type: bearer
token: "$secrets.adp_token"
resources:
- name: payroll
path: "/payroll-outputs"
operations:
- name: get-payroll
method: GET
Prepares an advisor for a client review by pulling portfolio data from Snowflake, recent interactions from Salesforce, market outlook from Bloomberg, and compiling a briefing in Google Docs.
naftiko: "0.5"
info:
label: "Advisor Client Review Prep Orchestrator"
description: "Prepares an advisor for a client review by pulling portfolio data from Snowflake, recent interactions from Salesforce, market outlook from Bloomberg, and compiling a briefing in Google Docs."
tags:
- advisory
- client-review
- snowflake
- salesforce
- bloomberg
- google-docs
capability:
exposes:
- type: mcp
namespace: review-preparation
port: 8080
tools:
- name: prepare-client-review
description: "Orchestrate client review preparation across multiple data sources."
inputParameters:
- name: account_id
in: body
type: string
description: "Client account ID."
- name: advisor_email
in: body
type: string
description: "Advisor email for document sharing."
steps:
- name: get-portfolio
type: call
call: "snowflake.query-portfolio"
with:
statement: "SELECT * FROM PORTFOLIO_SUMMARY WHERE account_id = '{{account_id}}'"
warehouse: "SCHWAB_ANALYTICS_WH"
- name: get-interactions
type: call
call: "salesforce.get-activities"
with:
account_id: "{{account_id}}"
- name: get-market-outlook
type: call
call: "bloomberg.get-research"
with:
topic: "market-outlook"
format: "summary"
- name: create-briefing
type: call
call: "googledocs.create-document"
with:
title: "Client Review: {{account_id}} - {{get-portfolio.client_name}}"
content: "Portfolio Value: {{get-portfolio.total_value}}\nYTD Return: {{get-portfolio.ytd_return}}\nRecent Activity: {{get-interactions.summary}}\nMarket Outlook: {{get-market-outlook.summary}}"
share_with: "{{advisor_email}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-portfolio
method: POST
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: activities
path: "/sobjects/Account/{{account_id}}/Activities"
inputParameters:
- name: account_id
in: path
operations:
- name: get-activities
method: GET
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap/catalogs/bbg"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: research
path: "/research"
operations:
- name: get-research
method: GET
- type: http
namespace: googledocs
baseUri: "https://docs.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.google_docs_token"
resources:
- name: documents
path: "/documents"
operations:
- name: create-document
method: POST
Calculates advisor compensation by pulling AUM data from Snowflake, trade commissions from the OMS, computing payouts via ADP, and generating statements in Google Sheets.
naftiko: "0.5"
info:
label: "Advisor Compensation Calculation Pipeline"
description: "Calculates advisor compensation by pulling AUM data from Snowflake, trade commissions from the OMS, computing payouts via ADP, and generating statements in Google Sheets."
tags:
- compensation
- payroll
- snowflake
- adp
- google-sheets
capability:
exposes:
- type: mcp
namespace: advisor-compensation
port: 8080
tools:
- name: calculate-compensation
description: "Orchestrate advisor compensation calculation across Snowflake, OMS, ADP, and Google Sheets."
inputParameters:
- name: advisor_id
in: body
type: string
description: "Advisor employee ID."
- name: pay_period
in: body
type: string
description: "Pay period (e.g., 2026-03)."
steps:
- name: get-aum
type: call
call: "snowflake.query-aum"
with:
statement: "SELECT SUM(market_value) as total_aum FROM ADVISOR_BOOK WHERE advisor_id = '{{advisor_id}}'"
warehouse: "SCHWAB_COMPENSATION_WH"
- name: get-commissions
type: call
call: "oms.get-commissions"
with:
advisor_id: "{{advisor_id}}"
period: "{{pay_period}}"
- name: process-payout
type: call
call: "adp.submit-compensation"
with:
employee_id: "{{advisor_id}}"
base_aum_fee: "{{get-aum.total_aum}}"
commissions: "{{get-commissions.total}}"
period: "{{pay_period}}"
- name: generate-statement
type: call
call: "googlesheets.update-sheet"
with:
spreadsheet_id: "advisor-compensation-tracker"
range: "{{pay_period}}!A:F"
values: "{{process-payout.line_items}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-aum
method: POST
- type: http
namespace: oms
baseUri: "https://oms-api.schwab.com/v2"
authentication:
type: bearer
token: "$secrets.oms_api_token"
resources:
- name: commissions
path: "/commissions"
operations:
- name: get-commissions
method: GET
- type: http
namespace: adp
baseUri: "https://api.adp.com/hr/v2"
authentication:
type: bearer
token: "$secrets.adp_token"
resources:
- name: compensation
path: "/workers/{{employee_id}}/compensation"
inputParameters:
- name: employee_id
in: path
operations:
- name: submit-compensation
method: POST
- type: http
namespace: googlesheets
baseUri: "https://sheets.googleapis.com/v4"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/spreadsheets/{{spreadsheet_id}}/values/{{range}}"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: update-sheet
method: PUT
Runs an Alteryx workflow to segment clients by investment behavior, risk tolerance, and asset allocation for targeted advisory services.
naftiko: "0.5"
info:
label: "Alteryx Client Segmentation Workflow"
description: "Runs an Alteryx workflow to segment clients by investment behavior, risk tolerance, and asset allocation for targeted advisory services."
tags:
- analytics
- client-segmentation
- alteryx
- snowflake
capability:
exposes:
- type: mcp
namespace: client-segmentation
port: 8080
tools:
- name: run-segmentation
description: "Execute the Alteryx client segmentation workflow and load results to Snowflake."
inputParameters:
- name: segment_type
in: body
type: string
description: "Segmentation type (risk_profile, asset_allocation, lifecycle, behavioral)."
steps:
- name: trigger-workflow
type: call
call: "alteryx.run-workflow"
with:
workflow_id: "client_segmentation_v3"
parameters: "{\"type\": \"{{segment_type}}\"}"
- name: load-results
type: call
call: "snowflake.run-query"
with:
query: "CALL load_segmentation_results('{{segment_type}}')"
consumes:
- type: http
namespace: alteryx
baseUri: "https://alteryx.schwab.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://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Archives historical trade execution data from the operational database to S3 for regulatory retention.
naftiko: "0.5"
info:
label: "Amazon S3 Trade Data Archiver"
description: "Archives historical trade execution data from the operational database to S3 for regulatory retention."
tags:
- data-engineering
- archival
- amazon-s3
capability:
exposes:
- type: mcp
namespace: trade-archival
port: 8080
tools:
- name: archive-trade-data
description: "Archive trade data to S3 for long-term regulatory retention."
inputParameters:
- name: date
in: body
type: string
description: "Date to archive."
- name: asset_class
in: body
type: string
description: "Asset class (equities, fixed_income, options, mutual_funds)."
call: "s3.put-object"
with:
bucket: "schwab-trade-archive"
key: "trades/{{asset_class}}/{{date}}/data.parquet"
outputParameters:
- name: etag
type: string
mapping: "$.ETag"
consumes:
- type: http
namespace: s3
baseUri: "https://schwab-trade-archive.s3.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: objects
path: "/{{key}}"
inputParameters:
- name: key
in: path
operations:
- name: put-object
method: PUT
When an AML alert fires, enriches it with transaction data from Snowflake, creates a ServiceNow compliance case, and notifies the BSA team via Teams.
naftiko: "0.5"
info:
label: "Anti-Money Laundering Alert Processor"
description: "When an AML alert fires, enriches it with transaction data from Snowflake, creates a ServiceNow compliance case, and notifies the BSA team via Teams."
tags:
- compliance
- aml
- snowflake
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: aml-compliance
port: 8080
tools:
- name: process-aml-alert
description: "Enrich an AML alert with transaction data and create a compliance case."
inputParameters:
- name: alert_id
in: body
type: string
description: "AML alert identifier."
- name: account_number
in: body
type: string
description: "Account under review."
- name: alert_type
in: body
type: string
description: "Alert type (structuring, rapid_movement, high_risk_geo, unusual_pattern)."
steps:
- name: get-transactions
type: call
call: "snowflake.run-query"
with:
query: "SELECT transaction_id, amount, transaction_type, counterparty, country, transaction_date FROM transactions WHERE account_number='{{account_number}}' AND transaction_date >= DATEADD(day, -90, CURRENT_DATE()) ORDER BY transaction_date DESC LIMIT 100"
- name: create-case
type: call
call: "servicenow.create-incident"
with:
short_description: "AML Alert: {{alert_type}} - Account {{account_number}}"
category: "aml_compliance"
urgency: "high"
description: "AML alert {{alert_id}} for account {{account_number}}. Type: {{alert_type}}. Recent transaction count: {{get-transactions.row_count}}."
- name: notify-bsa-team
type: call
call: "msteams.send-message"
with:
channel_id: "bsa_compliance"
text: "AML ALERT [{{alert_type}}]: Account {{account_number}}. Alert: {{alert_id}}. Case: {{create-case.number}}. Review required within 24 hours."
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://schwab.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Identifies deprecated API endpoints from the service catalog, finds consuming teams via Backstage, creates Jira migration tickets, and sends deprecation notices via email.
naftiko: "0.5"
info:
label: "API Deprecation Notification Pipeline"
description: "Identifies deprecated API endpoints from the service catalog, finds consuming teams via Backstage, creates Jira migration tickets, and sends deprecation notices via email."
tags:
- platform-engineering
- api-management
- jira
- backstage
capability:
exposes:
- type: mcp
namespace: api-deprecation
port: 8080
tools:
- name: process-deprecation
description: "Orchestrate API deprecation notification across Backstage and Jira."
inputParameters:
- name: api_name
in: body
type: string
description: "Deprecated API name."
- name: sunset_date
in: body
type: string
description: "API sunset date in YYYY-MM-DD."
steps:
- name: get-consumers
type: call
call: "backstage.get-api-consumers"
with:
api_name: "{{api_name}}"
- name: create-tickets
type: call
call: "jira.create-bulk-issues"
with:
project: "PLATFORM"
summary_template: "Migrate off deprecated API: {{api_name}} by {{sunset_date}}"
teams: "{{get-consumers.teams}}"
issuetype: "Task"
- name: send-notices
type: call
call: "ses.send-bulk-email"
with:
recipients: "{{get-consumers.team_leads}}"
subject: "API Deprecation Notice: {{api_name}} sunsetting {{sunset_date}}"
body: "The {{api_name}} API will be deprecated on {{sunset_date}}. Jira tickets have been created for your team."
consumes:
- type: http
namespace: backstage
baseUri: "https://backstage.schwab.com/api"
authentication:
type: bearer
token: "$secrets.backstage_token"
resources:
- name: apis
path: "/catalog/entities/by-name/api/{{api_name}}/consumers"
inputParameters:
- name: api_name
in: path
operations:
- name: get-api-consumers
method: GET
- type: http
namespace: jira
baseUri: "https://schwab.atlassian.net/rest/api/3"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: issues
path: "/issue/bulk"
operations:
- name: create-bulk-issues
method: POST
- type: http
namespace: ses
baseUri: "https://email.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: bulk-email
path: "/v2/email/outbound-bulk-emails"
operations:
- name: send-bulk-email
method: POST
Retrieves active CloudWatch alarms for Schwab trading infrastructure including API gateways, Lambda functions, and ECS services.
naftiko: "0.5"
info:
label: "AWS CloudWatch Trading Alarms"
description: "Retrieves active CloudWatch alarms for Schwab trading infrastructure including API gateways, Lambda functions, and ECS services."
tags:
- monitoring
- alarms
- cloudwatch
- aws
capability:
exposes:
- type: mcp
namespace: cloud-alarms
port: 8080
tools:
- name: get-active-alarms
description: "Fetch active CloudWatch alarms for trading infrastructure."
inputParameters:
- name: alarm_prefix
in: body
type: string
description: "Alarm name prefix filter (e.g., trading-, gateway-)."
call: "cloudwatch.describe-alarms"
with:
alarm_name_prefix: "{{alarm_prefix}}"
state_value: "ALARM"
outputParameters:
- name: alarms
type: array
mapping: "$.MetricAlarms"
- name: count
type: integer
mapping: "$.MetricAlarms.length"
consumes:
- type: http
namespace: cloudwatch
baseUri: "https://monitoring.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: alarms
path: "/"
operations:
- name: describe-alarms
method: POST
Monitors AWS Lambda function health for Schwab's trade settlement processing, returning invocation count, error rate, and duration metrics.
naftiko: "0.5"
info:
label: "AWS Lambda Trade Settlement Monitor"
description: "Monitors AWS Lambda function health for Schwab's trade settlement processing, returning invocation count, error rate, and duration metrics."
tags:
- serverless
- trade-settlement
- aws-lambda
capability:
exposes:
- type: mcp
namespace: settlement-monitor
port: 8080
tools:
- name: get-settlement-function-health
description: "Check Lambda function health for trade settlement processing."
inputParameters:
- name: function_name
in: body
type: string
description: "Lambda function name."
call: "lambda.get-function"
with:
FunctionName: "{{function_name}}"
outputParameters:
- name: state
type: string
mapping: "$.Configuration.State"
- name: last_modified
type: string
mapping: "$.Configuration.LastModified"
- name: runtime
type: string
mapping: "$.Configuration.Runtime"
consumes:
- type: http
namespace: lambda
baseUri: "https://lambda.us-east-1.amazonaws.com/2015-03-31"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: functions
path: "/functions/{{FunctionName}}"
inputParameters:
- name: FunctionName
in: path
operations:
- name: get-function
method: GET
Monitors Azure Data Factory pipelines that ingest market data feeds into the analytics warehouse.
naftiko: "0.5"
info:
label: "Azure Data Factory Market Data ETL"
description: "Monitors Azure Data Factory pipelines that ingest market data feeds into the analytics warehouse."
tags:
- data-engineering
- etl
- azure-data-factory
capability:
exposes:
- type: mcp
namespace: market-data-etl
port: 8080
tools:
- name: get-pipeline-status
description: "Check the latest ADF market data pipeline status."
inputParameters:
- name: pipeline_name
in: body
type: string
description: "ADF pipeline name."
call: "adf.get-pipeline-runs"
with:
pipeline_name: "{{pipeline_name}}"
outputParameters:
- name: run_id
type: string
mapping: "$.value[0].runId"
- name: status
type: string
mapping: "$.value[0].status"
consumes:
- type: http
namespace: adf
baseUri: "https://management.azure.com/subscriptions/{{subscription_id}}/resourceGroups/schwab-data-rg/providers/Microsoft.DataFactory/factories/schwab-adf"
authentication:
type: bearer
token: "$secrets.azure_mgmt_token"
resources:
- name: pipeline-runs
path: "/queryPipelineRuns"
operations:
- name: get-pipeline-runs
method: POST
Checks Azure DevOps pipeline status for Schwab's digital platform deployments.
naftiko: "0.5"
info:
label: "Azure DevOps CI/CD Pipeline Status"
description: "Checks Azure DevOps pipeline status for Schwab's digital platform deployments."
tags:
- devops
- ci-cd
- azure-devops
capability:
exposes:
- type: mcp
namespace: cicd-status
port: 8080
tools:
- name: get-pipeline-status
description: "Get the latest Azure DevOps pipeline run status."
inputParameters:
- name: project
in: body
type: string
description: "Project name."
- name: pipeline_id
in: body
type: string
description: "Pipeline ID."
call: "azuredevops.get-pipeline-runs"
with:
project: "{{project}}"
pipeline_id: "{{pipeline_id}}"
outputParameters:
- name: status
type: string
mapping: "$.value[0].state"
- name: result
type: string
mapping: "$.value[0].result"
consumes:
- type: http
namespace: azuredevops
baseUri: "https://dev.azure.com/schwab"
authentication:
type: basic
username: ""
password: "$secrets.azuredevops_pat"
resources:
- name: pipeline-runs
path: "/{{project}}/_apis/pipelines/{{pipeline_id}}/runs"
inputParameters:
- name: project
in: path
- name: pipeline_id
in: path
operations:
- name: get-pipeline-runs
method: GET
Processes beneficiary change requests by validating in Salesforce, sending DocuSign forms, updating the account system, and archiving documents in Box.
naftiko: "0.5"
info:
label: "Beneficiary Update Processing Pipeline"
description: "Processes beneficiary change requests by validating in Salesforce, sending DocuSign forms, updating the account system, and archiving documents in Box."
tags:
- account-services
- beneficiary
- salesforce
- docusign
- box
capability:
exposes:
- type: mcp
namespace: beneficiary-updates
port: 8080
tools:
- name: process-beneficiary-update
description: "Orchestrate beneficiary update across Salesforce, DocuSign, and Box."
inputParameters:
- name: account_id
in: body
type: string
description: "Client account ID."
- name: beneficiary_name
in: body
type: string
description: "New beneficiary full name."
- name: relationship
in: body
type: string
description: "Relationship to account holder."
steps:
- name: get-account
type: call
call: "salesforce.get-account"
with:
account_id: "{{account_id}}"
- name: send-form
type: call
call: "docusign.create-envelope"
with:
templateId: "beneficiary-change-form"
signerEmail: "{{get-account.email}}"
signerName: "{{get-account.name}}"
- name: archive-request
type: call
call: "box.upload-file"
with:
folder_id: "beneficiary_changes"
filename: "{{account_id}}_beneficiary_{{beneficiary_name}}.pdf"
content: "Beneficiary change: {{beneficiary_name}} ({{relationship}}) for account {{account_id}}"
consumes:
- type: http
namespace: salesforce
baseUri: "https://schwab.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: docusign
baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/$secrets.docusign_account_id"
authentication:
type: bearer
token: "$secrets.docusign_access_token"
resources:
- name: envelopes
path: "/envelopes"
operations:
- name: create-envelope
method: POST
- type: http
namespace: box
baseUri: "https://upload.box.com/api/2.0"
authentication:
type: bearer
token: "$secrets.box_access_token"
resources:
- name: files
path: "/files/content"
operations:
- name: upload-file
method: POST
Retrieves real-time market data from Bloomberg Enterprise Data for equity, fixed income, and options pricing.
naftiko: "0.5"
info:
label: "Bloomberg Market Data Feed"
description: "Retrieves real-time market data from Bloomberg Enterprise Data for equity, fixed income, and options pricing."
tags:
- market-data
- trading
- bloomberg
capability:
exposes:
- type: mcp
namespace: market-data
port: 8080
tools:
- name: get-market-data
description: "Fetch real-time market data from Bloomberg for a security."
inputParameters:
- name: security_id
in: body
type: string
description: "Bloomberg security identifier (e.g., AAPL US Equity)."
- name: fields
in: body
type: string
description: "Comma-separated Bloomberg fields (e.g., PX_LAST,PX_BID,PX_ASK,VOLUME)."
call: "bloomberg.get-data"
with:
securities: "{{security_id}}"
fields: "{{fields}}"
outputParameters:
- name: last_price
type: number
mapping: "$.data[0].PX_LAST"
- name: bid
type: number
mapping: "$.data[0].PX_BID"
- name: ask
type: number
mapping: "$.data[0].PX_ASK"
- name: volume
type: integer
mapping: "$.data[0].VOLUME"
consumes:
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: data
path: "/snapshots"
operations:
- name: get-data
method: POST
Retrieves historical price data from Bloomberg for backtesting investment strategies.
naftiko: "0.5"
info:
label: "Bloomberg Terminal Analytics Feed"
description: "Retrieves historical price data from Bloomberg for backtesting investment strategies."
tags:
- market-data
- backtesting
- bloomberg
capability:
exposes:
- type: mcp
namespace: historical-data
port: 8080
tools:
- name: get-historical-prices
description: "Fetch historical price data from Bloomberg for backtesting."
inputParameters:
- name: security_id
in: body
type: string
description: "Bloomberg security ID."
- name: start_date
in: body
type: string
description: "Start date."
- name: end_date
in: body
type: string
description: "End date."
- name: frequency
in: body
type: string
description: "Data frequency (DAILY, WEEKLY, MONTHLY)."
call: "bloomberg.get-history"
with:
securities: "{{security_id}}"
start_date: "{{start_date}}"
end_date: "{{end_date}}"
frequency: "{{frequency}}"
fields: "PX_LAST,PX_VOLUME"
outputParameters:
- name: data
type: array
mapping: "$.data"
- name: count
type: integer
mapping: "$.count"
consumes:
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: history
path: "/histories"
operations:
- name: get-history
method: POST
Uploads compliance and regulatory documents to Box with appropriate retention policies for SEC and FINRA requirements.
naftiko: "0.5"
info:
label: "Box Compliance Document Manager"
description: "Uploads compliance and regulatory documents to Box with appropriate retention policies for SEC and FINRA requirements."
tags:
- compliance
- document-management
- box
capability:
exposes:
- type: mcp
namespace: compliance-docs
port: 8080
tools:
- name: upload-compliance-doc
description: "Upload a compliance document to Box with retention settings."
inputParameters:
- name: file_name
in: body
type: string
description: "Document name."
- name: folder_id
in: body
type: string
description: "Box folder ID."
- name: retention_years
in: body
type: integer
description: "Retention period in years."
call: "box.upload-file"
with:
folder_id: "{{folder_id}}"
file_name: "{{file_name}}"
retention_policy: "{{retention_years}}_year"
outputParameters:
- name: file_id
type: string
mapping: "$.entries[0].id"
- name: shared_link
type: string
mapping: "$.entries[0].shared_link.url"
consumes:
- type: http
namespace: box
baseUri: "https://upload.box.com/api/2.0"
authentication:
type: bearer
token: "$secrets.box_token"
resources:
- name: files
path: "/files/content"
operations:
- name: upload-file
method: POST
Coordinates new branch opening by verifying network setup in SolarWinds, confirming staffing in Workday, provisioning equipment via ServiceNow, and posting the opening on Google Maps.
naftiko: "0.5"
info:
label: "Branch Opening Readiness Orchestrator"
description: "Coordinates new branch opening by verifying network setup in SolarWinds, confirming staffing in Workday, provisioning equipment via ServiceNow, and posting the opening on Google Maps."
tags:
- branch-operations
- opening
- solarwinds
- workday
- servicenow
- google-maps
capability:
exposes:
- type: mcp
namespace: branch-opening
port: 8080
tools:
- name: check-branch-readiness
description: "Orchestrate branch opening readiness checks across SolarWinds, Workday, ServiceNow, and Google Maps."
inputParameters:
- name: branch_id
in: body
type: string
description: "New branch identifier."
- name: opening_date
in: body
type: string
description: "Planned opening date."
steps:
- name: verify-network
type: call
call: "solarwinds.check-site"
with:
site_id: "{{branch_id}}"
- name: verify-staffing
type: call
call: "workday.get-site-workers"
with:
site_id: "{{branch_id}}"
- name: check-equipment
type: call
call: "servicenow.get-assets"
with:
location: "{{branch_id}}"
status: "deployed"
- name: update-listing
type: call
call: "googlemaps.update-business"
with:
branch_id: "{{branch_id}}"
status: "open"
opening_date: "{{opening_date}}"
consumes:
- type: http
namespace: solarwinds
baseUri: "https://solarwinds.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.solarwinds_token"
resources:
- name: sites
path: "/sites/{{site_id}}/health"
inputParameters:
- name: site_id
in: path
operations:
- name: check-site
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers"
operations:
- name: get-site-workers
method: GET
- type: http
namespace: servicenow
baseUri: "https://schwab.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: assets
path: "/table/alm_hardware"
operations:
- name: get-assets
method: GET
- type: http
namespace: googlemaps
baseUri: "https://mybusinessbusinessinformation.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.google_business_token"
resources:
- name: locations
path: "/locations/{{branch_id}}"
inputParameters:
- name: branch_id
in: path
operations:
- name: update-business
method: PATCH
Retrieves trade lifecycle events from the Calypso trading platform for fixed income and derivatives position management.
naftiko: "0.5"
info:
label: "Calypso Trade Lifecycle Manager"
description: "Retrieves trade lifecycle events from the Calypso trading platform for fixed income and derivatives position management."
tags:
- trading
- lifecycle
- calypso
capability:
exposes:
- type: mcp
namespace: trade-lifecycle
port: 8080
tools:
- name: get-trade-events
description: "Fetch trade lifecycle events from Calypso."
inputParameters:
- name: trade_id
in: body
type: string
description: "Calypso trade ID."
call: "calypso.get-trade"
with:
trade_id: "{{trade_id}}"
outputParameters:
- name: status
type: string
mapping: "$.trade.status"
- name: product_type
type: string
mapping: "$.trade.product_type"
consumes:
- type: http
namespace: calypso
baseUri: "https://calypso.schwab.com/calypsoserver/api/v1"
authentication:
type: bearer
token: "$secrets.calypso_token"
resources:
- name: trades
path: "/trades/{{trade_id}}"
inputParameters:
- name: trade_id
in: path
operations:
- name: get-trade
method: GET
On new client account creation in Salesforce, opens a ServiceNow provisioning ticket, creates a SharePoint document folder, and notifies the relationship manager via Microsoft Teams.
naftiko: "0.5"
info:
label: "Client Account Onboarding Orchestrator"
description: "On new client account creation in Salesforce, opens a ServiceNow provisioning ticket, creates a SharePoint document folder, and notifies the relationship manager via Microsoft Teams."
tags:
- client-services
- onboarding
- salesforce
- servicenow
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: client-onboarding
port: 8080
tools:
- name: trigger-account-onboarding
description: "Orchestrate new client account onboarding across Salesforce, ServiceNow, SharePoint, and Teams."
inputParameters:
- name: account_id
in: body
type: string
description: "Salesforce account ID."
- name: client_name
in: body
type: string
description: "Client full name."
- name: account_type
in: body
type: string
description: "Account type (individual, joint, ira, trust, corporate)."
- name: advisor_email
in: body
type: string
description: "Financial advisor email."
steps:
- name: get-account
type: call
call: "salesforce.get-account"
with:
account_id: "{{account_id}}"
- name: create-provisioning-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "New account setup: {{client_name}} ({{account_type}})"
category: "account_provisioning"
assigned_group: "Client_Operations"
description: "Provision new {{account_type}} account for {{client_name}}. SF Account: {{account_id}}."
- name: provision-folder
type: call
call: "sharepoint.create-folder"
with:
site_id: "client_documents"
folder_path: "Accounts/{{client_name}}_{{account_id}}"
- name: notify-advisor
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{advisor_email}}"
text: "New account opened: {{client_name}} ({{account_type}}). Provisioning ticket: {{create-provisioning-ticket.number}}. Documents: {{provision-folder.url}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://schwab.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: servicenow
baseUri: "https://schwab.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: 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
Processes client address change requests by updating Salesforce CRM, verifying identity via Okta MFA, updating the mailing system, and logging the change in the compliance audit trail.
naftiko: "0.5"
info:
label: "Client Address Change Orchestrator"
description: "Processes client address change requests by updating Salesforce CRM, verifying identity via Okta MFA, updating the mailing system, and logging the change in the compliance audit trail."
tags:
- account-services
- address-change
- salesforce
- okta
- compliance
capability:
exposes:
- type: mcp
namespace: address-changes
port: 8080
tools:
- name: process-address-change
description: "Orchestrate address change across Salesforce, Okta, mailing, and compliance systems."
inputParameters:
- name: account_id
in: body
type: string
description: "Client account ID."
- name: new_address
in: body
type: string
description: "New mailing address."
- name: client_email
in: body
type: string
description: "Client email for verification."
steps:
- name: verify-identity
type: call
call: "okta.trigger-mfa"
with:
login: "{{client_email}}"
factor_type: "push"
- name: update-crm
type: call
call: "salesforce.update-account"
with:
account_id: "{{account_id}}"
field: "BillingAddress"
value: "{{new_address}}"
- name: update-mailing
type: call
call: "mailing.update-address"
with:
account_id: "{{account_id}}"
address: "{{new_address}}"
- name: log-audit
type: call
call: "compliance.log-change"
with:
account_id: "{{account_id}}"
change_type: "address_update"
details: "Address changed to: {{new_address}}. MFA verified: {{verify-identity.status}}."
consumes:
- type: http
namespace: okta
baseUri: "https://schwab.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: factors
path: "/users/{{login}}/factors"
inputParameters:
- name: login
in: path
operations:
- name: trigger-mfa
method: POST
- type: http
namespace: salesforce
baseUri: "https://schwab.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: update-account
method: PATCH
- type: http
namespace: mailing
baseUri: "https://mailing-api.schwab.com/v1"
authentication:
type: bearer
token: "$secrets.mailing_api_token"
resources:
- name: addresses
path: "/addresses"
operations:
- name: update-address
method: PUT
- type: http
namespace: compliance
baseUri: "https://compliance-api.schwab.com/v1"
authentication:
type: bearer
token: "$secrets.compliance_api_token"
resources:
- name: audit
path: "/audit-trail"
operations:
- name: log-change
method: POST
Digitizes paper client documents by processing scans via Azure AI Document Intelligence, extracting data, storing in Amazon S3, indexing in Elasticsearch, and updating the CRM.
naftiko: "0.5"
info:
label: "Client Document Digitization Pipeline"
description: "Digitizes paper client documents by processing scans via Azure AI Document Intelligence, extracting data, storing in Amazon S3, indexing in Elasticsearch, and updating the CRM."
tags:
- document-management
- ocr
- azure-machine-learning
- amazon-s3
- elasticsearch
capability:
exposes:
- type: mcp
namespace: document-digitization
port: 8080
tools:
- name: digitize-document
description: "Orchestrate document digitization across Azure AI, S3, Elasticsearch, and Salesforce."
inputParameters:
- name: document_url
in: body
type: string
description: "URL of scanned document."
- name: document_type
in: body
type: string
description: "Document type (account-app, w9, transfer-form)."
- name: account_id
in: body
type: string
description: "Associated account ID."
steps:
- name: extract-data
type: call
call: "azure-ai.analyze-document"
with:
modelId: "{{document_type}}"
urlSource: "{{document_url}}"
- name: store-document
type: call
call: "s3.put-object"
with:
bucket: "schwab-digitized-docs"
key: "{{account_id}}/{{document_type}}/{{extract-data.document_id}}.json"
body: "{{extract-data.result}}"
- name: index-document
type: call
call: "elasticsearch.index"
with:
index: "client-documents"
body: "{\"account_id\":\"{{account_id}}\",\"type\":\"{{document_type}}\",\"extracted_data\":{{extract-data.fields}},\"s3_key\":\"{{store-document.key}}\"}"
- name: update-crm
type: call
call: "salesforce.create-content-note"
with:
account_id: "{{account_id}}"
title: "Digitized: {{document_type}}"
content: "Document processed. Fields extracted: {{extract-data.field_count}}."
consumes:
- type: http
namespace: azure-ai
baseUri: "https://schwab-docai.cognitiveservices.azure.com"
authentication:
type: bearer
token: "$secrets.azure_ai_key"
resources:
- name: documents
path: "/formrecognizer/documentModels/{{modelId}}:analyze"
inputParameters:
- name: modelId
in: path
operations:
- name: analyze-document
method: POST
- type: http
namespace: s3
baseUri: "https://s3.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: objects
path: "/{{bucket}}/{{key}}"
inputParameters:
- name: bucket
in: path
- name: key
in: path
operations:
- name: put-object
method: PUT
- type: http
namespace: elasticsearch
baseUri: "https://es-cluster.schwab.com"
authentication:
type: bearer
token: "$secrets.elasticsearch_token"
resources:
- name: docs
path: "/{{index}}/_doc"
inputParameters:
- name: index
in: path
operations:
- name: index
method: POST
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: content
path: "/sobjects/ContentNote"
operations:
- name: create-content-note
method: POST
Handles client account closure by processing final distributions, generating tax documents, archiving records in Amazon S3, closing CRM records in Salesforce, and sending confirmation email.
naftiko: "0.5"
info:
label: "Client Offboarding Orchestrator"
description: "Handles client account closure by processing final distributions, generating tax documents, archiving records in Amazon S3, closing CRM records in Salesforce, and sending confirmation email."
tags:
- account-closure
- offboarding
- salesforce
- amazon-s3
capability:
exposes:
- type: mcp
namespace: client-offboarding
port: 8080
tools:
- name: process-offboarding
description: "Orchestrate client account closure across distributions, archival, and CRM."
inputParameters:
- name: account_id
in: body
type: string
description: "Account ID to close."
- name: closure_reason
in: body
type: string
description: "Reason for account closure."
steps:
- name: process-distributions
type: call
call: "accounts.process-final-distribution"
with:
account_id: "{{account_id}}"
- name: generate-final-docs
type: call
call: "reporting.generate-final-statement"
with:
account_id: "{{account_id}}"
- name: archive-records
type: call
call: "s3.put-object"
with:
bucket: "schwab-archived-accounts"
key: "{{account_id}}/final-records.zip"
body: "{{generate-final-docs.archive}}"
- name: close-crm
type: call
call: "salesforce.update-account"
with:
account_id: "{{account_id}}"
status: "Closed"
closure_reason: "{{closure_reason}}"
consumes:
- type: http
namespace: accounts
baseUri: "https://accounts-api.schwab.com/v2"
authentication:
type: bearer
token: "$secrets.accounts_api_token"
resources:
- name: distributions
path: "/distributions/final"
operations:
- name: process-final-distribution
method: POST
- type: http
namespace: reporting
baseUri: "https://reporting-api.schwab.com/v1"
authentication:
type: bearer
token: "$secrets.reporting_api_token"
resources:
- name: statements
path: "/statements/final"
operations:
- name: generate-final-statement
method: POST
- type: http
namespace: s3
baseUri: "https://s3.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: objects
path: "/{{bucket}}/{{key}}"
inputParameters:
- name: bucket
in: path
- name: key
in: path
operations:
- name: put-object
method: PUT
- type: http
namespace: salesforce
baseUri: "https://schwab.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: update-account
method: PATCH
On advisor rebalance request, retrieves portfolio holdings from Snowflake, runs compliance checks via the internal API, generates trade orders in the OMS, and notifies the advisor via Microsoft Teams.
naftiko: "0.5"
info:
label: "Client Portfolio Rebalance Orchestrator"
description: "On advisor rebalance request, retrieves portfolio holdings from Snowflake, runs compliance checks via the internal API, generates trade orders in the OMS, and notifies the advisor via Microsoft Teams."
tags:
- portfolio-management
- rebalancing
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: portfolio-rebalance
port: 8080
tools:
- name: trigger-rebalance
description: "Orchestrate a portfolio rebalance across holdings analysis, compliance, and order generation."
inputParameters:
- name: account_id
in: body
type: string
description: "Client account ID."
- name: target_model
in: body
type: string
description: "Target allocation model name."
- name: advisor_email
in: body
type: string
description: "Advisor email for notification."
steps:
- name: get-holdings
type: call
call: "snowflake.query-holdings"
with:
statement: "SELECT * FROM PORTFOLIO_HOLDINGS WHERE account_id = '{{account_id}}'"
warehouse: "SCHWAB_ANALYTICS_WH"
- name: run-compliance
type: call
call: "compliance.check-rebalance"
with:
account_id: "{{account_id}}"
target_model: "{{target_model}}"
holdings: "{{get-holdings.data}}"
- name: generate-orders
type: call
call: "oms.create-orders"
with:
account_id: "{{account_id}}"
trades: "{{run-compliance.approved_trades}}"
- name: notify-advisor
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{advisor_email}}"
text: "Rebalance initiated for account {{account_id}}. Orders: {{generate-orders.order_count}}. Compliance status: {{run-compliance.status}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-holdings
method: POST
- type: http
namespace: compliance
baseUri: "https://compliance-api.schwab.com/v1"
authentication:
type: bearer
token: "$secrets.compliance_api_token"
resources:
- name: checks
path: "/rebalance-check"
operations:
- name: check-rebalance
method: POST
- type: http
namespace: oms
baseUri: "https://oms-api.schwab.com/v2"
authentication:
type: bearer
token: "$secrets.oms_api_token"
resources:
- name: orders
path: "/orders/batch"
operations:
- name: create-orders
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
Updates client risk profiles by collecting questionnaire results from Salesforce, running risk scoring in Databricks, updating the account system, and notifying the advisor via Microsoft Teams.
naftiko: "0.5"
info:
label: "Client Risk Profile Update Orchestrator"
description: "Updates client risk profiles by collecting questionnaire results from Salesforce, running risk scoring in Databricks, updating the account system, and notifying the advisor via Microsoft Teams."
tags:
- risk-profiling
- suitability
- salesforce
- databricks
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: risk-profiling
port: 8080
tools:
- name: update-risk-profile
description: "Orchestrate risk profile update across Salesforce, Databricks, and Teams."
inputParameters:
- name: account_id
in: body
type: string
description: "Client account ID."
- name: questionnaire_id
in: body
type: string
description: "Completed questionnaire ID."
steps:
- name: get-responses
type: call
call: "salesforce.get-questionnaire"
with:
questionnaire_id: "{{questionnaire_id}}"
- name: calculate-score
type: call
call: "databricks.run-risk-model"
with:
responses: "{{get-responses.data}}"
model: "client-risk-scoring-v3"
- name: update-account
type: call
call: "accounts.update-risk-profile"
with:
account_id: "{{account_id}}"
risk_score: "{{calculate-score.score}}"
risk_category: "{{calculate-score.category}}"
- name: notify-advisor
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{get-responses.advisor_email}}"
text: "Risk profile updated: Account {{account_id}}. New score: {{calculate-score.score}} ({{calculate-score.category}}). Review recommended."
consumes:
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: questionnaires
path: "/sobjects/Risk_Questionnaire__c/{{questionnaire_id}}"
inputParameters:
- name: questionnaire_id
in: path
operations:
- name: get-questionnaire
method: GET
- type: http
namespace: databricks
baseUri: "https://schwab.cloud.databricks.com/api/2.0"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: serving
path: "/serving-endpoints/client-risk-scoring-v3/invocations"
operations:
- name: run-risk-model
method: POST
- type: http
namespace: accounts
baseUri: "https://accounts-api.schwab.com/v2"
authentication:
type: bearer
token: "$secrets.accounts_api_token"
resources:
- name: risk-profiles
path: "/accounts/{{account_id}}/risk-profile"
inputParameters:
- name: account_id
in: path
operations:
- name: update-risk-profile
method: PUT
- 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
Analyzes client sentiment by extracting survey responses from Salesforce, running NLP analysis via Azure ML, updating client satisfaction scores in Snowflake, and alerting account managers via Microsoft Teams.
naftiko: "0.5"
info:
label: "Client Sentiment Analysis Pipeline"
description: "Analyzes client sentiment by extracting survey responses from Salesforce, running NLP analysis via Azure ML, updating client satisfaction scores in Snowflake, and alerting account managers via Microsoft Teams."
tags:
- analytics
- sentiment
- salesforce
- azure-machine-learning
- snowflake
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: sentiment-analysis
port: 8080
tools:
- name: analyze-sentiment
description: "Orchestrate client sentiment analysis across Salesforce, Azure ML, Snowflake, and Teams."
inputParameters:
- name: survey_batch_id
in: body
type: string
description: "Survey batch identifier."
steps:
- name: get-responses
type: call
call: "salesforce.get-survey-responses"
with:
batch_id: "{{survey_batch_id}}"
- name: run-analysis
type: call
call: "azure-ml.score-sentiment"
with:
texts: "{{get-responses.comments}}"
model: "client-sentiment-v2"
- name: update-scores
type: call
call: "snowflake.update-satisfaction"
with:
statement: "CALL UPDATE_CLIENT_SATISFACTION('{{survey_batch_id}}', '{{run-analysis.scores}}')"
warehouse: "SCHWAB_ANALYTICS_WH"
- name: alert-managers
type: call
call: "msteams.send-channel-message"
with:
team_id: "client-experience"
channel: "sentiment-alerts"
text: "Sentiment analysis complete: Batch {{survey_batch_id}}. Avg score: {{run-analysis.avg_score}}. Negative: {{run-analysis.negative_count}}. Positive: {{run-analysis.positive_count}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: surveys
path: "/sobjects/Survey_Response__c"
operations:
- name: get-survey-responses
method: GET
- type: http
namespace: azure-ml
baseUri: "https://schwab-ml.centralus.inference.ml.azure.com"
authentication:
type: bearer
token: "$secrets.azure_ml_token"
resources:
- name: scoring
path: "/score"
operations:
- name: score-sentiment
method: POST
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: update-satisfaction
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
Generates annual tax documents by querying Teradata for transaction history, computing gains via Intuit tax engine, storing in Amazon S3, and notifying the client via email.
naftiko: "0.5"
info:
label: "Client Tax Document Generation Pipeline"
description: "Generates annual tax documents by querying Teradata for transaction history, computing gains via Intuit tax engine, storing in Amazon S3, and notifying the client via email."
tags:
- tax
- document-generation
- teradata
- intuit
- amazon-s3
capability:
exposes:
- type: mcp
namespace: tax-documents
port: 8080
tools:
- name: generate-tax-docs
description: "Orchestrate tax document generation across Teradata, Intuit, S3, and email."
inputParameters:
- name: account_id
in: body
type: string
description: "Client account ID."
- name: tax_year
in: body
type: integer
description: "Tax year."
steps:
- name: get-transactions
type: call
call: "teradata.query-tax-data"
with:
query: "SELECT * FROM TAX_LOTS WHERE account_id = '{{account_id}}' AND tax_year = {{tax_year}}"
- name: compute-gains
type: call
call: "intuit.calculate-gains"
with:
account_id: "{{account_id}}"
transactions: "{{get-transactions.data}}"
tax_year: "{{tax_year}}"
- name: store-document
type: call
call: "s3.put-object"
with:
bucket: "schwab-tax-documents"
key: "{{tax_year}}/{{account_id}}/1099-B.pdf"
body: "{{compute-gains.document}}"
- name: notify-client
type: call
call: "ses.send-email"
with:
to: "{{compute-gains.client_email}}"
subject: "Your {{tax_year}} Schwab Tax Documents Are Ready"
body: "Your 1099-B tax document is now available in your Schwab account document center."
consumes:
- type: http
namespace: teradata
baseUri: "https://teradata.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.teradata_token"
resources:
- name: queries
path: "/queries"
operations:
- name: query-tax-data
method: POST
- type: http
namespace: intuit
baseUri: "https://tax-engine.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.intuit_api_token"
resources:
- name: calculations
path: "/gains-calculation"
operations:
- name: calculate-gains
method: POST
- type: http
namespace: s3
baseUri: "https://s3.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: objects
path: "/{{bucket}}/{{key}}"
inputParameters:
- name: bucket
in: path
- name: key
in: path
operations:
- name: put-object
method: PUT
- type: http
namespace: ses
baseUri: "https://email.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: emails
path: "/v2/email/outbound-emails"
operations:
- name: send-email
method: POST
Monitors Cloudflare DDoS protection status and traffic analytics for Schwab's public-facing web properties.
naftiko: "0.5"
info:
label: "Cloudflare DDoS Protection Monitor"
description: "Monitors Cloudflare DDoS protection status and traffic analytics for Schwab's public-facing web properties."
tags:
- security
- ddos
- cloudflare
capability:
exposes:
- type: mcp
namespace: ddos-monitoring
port: 8080
tools:
- name: get-traffic-analytics
description: "Retrieve Cloudflare traffic analytics and DDoS event data."
inputParameters:
- name: zone_id
in: body
type: string
description: "Cloudflare zone ID."
- name: time_range
in: body
type: string
description: "Time range in minutes."
call: "cloudflare.get-analytics"
with:
zone_id: "{{zone_id}}"
since: "-{{time_range}}min"
outputParameters:
- name: requests_total
type: integer
mapping: "$.result.totals.requests.all"
- name: threats_total
type: integer
mapping: "$.result.totals.threats.all"
consumes:
- type: http
namespace: cloudflare
baseUri: "https://api.cloudflare.com/client/v4"
authentication:
type: bearer
token: "$secrets.cloudflare_token"
resources:
- name: analytics
path: "/zones/{{zone_id}}/analytics/dashboard"
inputParameters:
- name: zone_id
in: path
operations:
- name: get-analytics
method: GET
Checks overdue compliance training in Pluralsight, retrieves employee data from Workday, sends reminder emails via Microsoft Outlook, and logs escalations in ServiceNow.
naftiko: "0.5"
info:
label: "Compliance Training Deadline Enforcer"
description: "Checks overdue compliance training in Pluralsight, retrieves employee data from Workday, sends reminder emails via Microsoft Outlook, and logs escalations in ServiceNow."
tags:
- compliance
- training
- pluralsight
- workday
- microsoft-outlook
- servicenow
capability:
exposes:
- type: mcp
namespace: compliance-training
port: 8080
tools:
- name: enforce-training-deadline
description: "Orchestrate compliance training deadline enforcement across Pluralsight, Workday, Outlook, and ServiceNow."
inputParameters:
- name: training_id
in: body
type: string
description: "Compliance training course ID."
- name: deadline_date
in: body
type: string
description: "Deadline date in YYYY-MM-DD."
steps:
- name: get-overdue
type: call
call: "pluralsight.get-overdue-users"
with:
course_id: "{{training_id}}"
deadline: "{{deadline_date}}"
- name: get-managers
type: call
call: "workday.get-managers"
with:
employee_ids: "{{get-overdue.user_ids}}"
- name: send-reminders
type: call
call: "outlook.send-bulk-email"
with:
recipients: "{{get-overdue.emails}}"
subject: "URGENT: Compliance Training Past Due - {{training_id}}"
body: "Your required compliance training is past the {{deadline_date}} deadline. Please complete immediately."
- name: create-escalation
type: call
call: "servicenow.create-incident"
with:
short_description: "Compliance training overdue: {{training_id}} - {{get-overdue.count}} employees"
category: "compliance"
assigned_group: "Compliance_Operations"
description: "{{get-overdue.count}} employees overdue. Managers notified: {{get-managers.manager_names}}."
consumes:
- type: http
namespace: pluralsight
baseUri: "https://api.pluralsight.com/api/v1"
authentication:
type: bearer
token: "$secrets.pluralsight_token"
resources:
- name: reports
path: "/reports/course-completion"
operations:
- name: get-overdue-users
method: GET
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/managers"
operations:
- name: get-managers
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: mail
path: "/users/compliance@schwab.com/sendMail"
operations:
- name: send-bulk-email
method: POST
- type: http
namespace: servicenow
baseUri: "https://schwab.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
Publishes investment research notes to Confluence and notifies the research distribution team via Teams.
naftiko: "0.5"
info:
label: "Confluence Investment Research Publisher"
description: "Publishes investment research notes to Confluence and notifies the research distribution team via Teams."
tags:
- research
- knowledge-management
- confluence
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: research-publishing
port: 8080
tools:
- name: publish-research-note
description: "Create a research note in Confluence and notify the distribution team."
inputParameters:
- name: space_key
in: body
type: string
description: "Confluence space key."
- name: title
in: body
type: string
description: "Research note title."
- name: content
in: body
type: string
description: "Research content."
- name: sector
in: body
type: string
description: "Market sector."
steps:
- name: create-page
type: call
call: "confluence.create-page"
with:
space_key: "{{space_key}}"
title: "{{title}}"
body: "{{content}}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "research_distribution"
text: "New research published: {{title}} ({{sector}}). View: {{create-page.url}}"
consumes:
- type: http
namespace: confluence
baseUri: "https://schwab.atlassian.net/wiki/rest/api"
authentication:
type: basic
username: "$secrets.confluence_user"
password: "$secrets.confluence_api_token"
resources:
- name: content
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: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Processes corporate actions by retrieving event data from Bloomberg, identifying affected accounts in Snowflake, applying adjustments via the OMS, and notifying advisors via email.
naftiko: "0.5"
info:
label: "Corporate Action Processing Orchestrator"
description: "Processes corporate actions by retrieving event data from Bloomberg, identifying affected accounts in Snowflake, applying adjustments via the OMS, and notifying advisors via email."
tags:
- corporate-actions
- bloomberg
- snowflake
- trading
capability:
exposes:
- type: mcp
namespace: corporate-actions
port: 8080
tools:
- name: process-corporate-action
description: "Orchestrate corporate action processing across Bloomberg, Snowflake, and OMS."
inputParameters:
- name: action_id
in: body
type: string
description: "Corporate action event ID."
- name: action_type
in: body
type: string
description: "Action type (dividend, split, merger, spinoff)."
steps:
- name: get-action-details
type: call
call: "bloomberg.get-corporate-action"
with:
action_id: "{{action_id}}"
- name: get-affected-accounts
type: call
call: "snowflake.query-affected"
with:
statement: "SELECT * FROM HOLDINGS WHERE security_id = '{{get-action-details.security_id}}'"
warehouse: "SCHWAB_OPERATIONS_WH"
- name: apply-adjustments
type: call
call: "oms.apply-corporate-action"
with:
action_type: "{{action_type}}"
details: "{{get-action-details}}"
affected_accounts: "{{get-affected-accounts.data}}"
- name: notify-advisors
type: call
call: "ses.send-bulk-email"
with:
recipients: "{{get-affected-accounts.advisor_emails}}"
subject: "Corporate Action: {{get-action-details.security_name}} - {{action_type}}"
body: "A {{action_type}} has been processed for {{get-action-details.security_name}}. {{get-affected-accounts.count}} accounts affected."
consumes:
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: corporate-actions
path: "/corporate-actions/{{action_id}}"
inputParameters:
- name: action_id
in: path
operations:
- name: get-corporate-action
method: GET
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-affected
method: POST
- type: http
namespace: oms
baseUri: "https://oms-api.schwab.com/v2"
authentication:
type: bearer
token: "$secrets.oms_api_token"
resources:
- name: corporate-actions
path: "/corporate-actions/apply"
operations:
- name: apply-corporate-action
method: POST
- type: http
namespace: ses
baseUri: "https://email.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: bulk-email
path: "/v2/email/outbound-bulk-emails"
operations:
- name: send-bulk-email
method: POST
Reconciles cost basis records by comparing Teradata positions with Calypso trade records, flagging discrepancies in Snowflake, and creating ServiceNow tickets for resolution.
naftiko: "0.5"
info:
label: "Cost Basis Reconciliation Orchestrator"
description: "Reconciles cost basis records by comparing Teradata positions with Calypso trade records, flagging discrepancies in Snowflake, and creating ServiceNow tickets for resolution."
tags:
- operations
- reconciliation
- teradata
- calypso
- snowflake
- servicenow
capability:
exposes:
- type: mcp
namespace: cost-basis-recon
port: 8080
tools:
- name: reconcile-cost-basis
description: "Orchestrate cost basis reconciliation across Teradata, Calypso, Snowflake, and ServiceNow."
inputParameters:
- name: account_id
in: body
type: string
description: "Account ID to reconcile."
- name: as_of_date
in: body
type: string
description: "Reconciliation date in YYYY-MM-DD."
steps:
- name: get-positions
type: call
call: "teradata.query-positions"
with:
query: "SELECT * FROM COST_BASIS WHERE account_id = '{{account_id}}' AND as_of_date = '{{as_of_date}}'"
- name: get-trades
type: call
call: "calypso.get-trade-history"
with:
account_id: "{{account_id}}"
date: "{{as_of_date}}"
- name: log-discrepancies
type: call
call: "snowflake.insert-discrepancies"
with:
statement: "INSERT INTO RECON_DISCREPANCIES SELECT * FROM TABLE(COMPARE_COST_BASIS('{{account_id}}', '{{as_of_date}}'))"
warehouse: "SCHWAB_OPERATIONS_WH"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "Cost basis discrepancy: {{account_id}} as of {{as_of_date}}"
category: "reconciliation"
assigned_group: "Operations_Reconciliation"
description: "Cost basis reconciliation found discrepancies for account {{account_id}}."
consumes:
- type: http
namespace: teradata
baseUri: "https://teradata.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.teradata_token"
resources:
- name: queries
path: "/queries"
operations:
- name: query-positions
method: POST
- type: http
namespace: calypso
baseUri: "https://calypso.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.calypso_token"
resources:
- name: trades
path: "/trades/history"
operations:
- name: get-trade-history
method: GET
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-discrepancies
method: POST
- type: http
namespace: servicenow
baseUri: "https://schwab.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
Generates client account statements using Crystal Reports with Snowflake data for quarterly mailings.
naftiko: "0.5"
info:
label: "Crystal Reports Client Statement Generator"
description: "Generates client account statements using Crystal Reports with Snowflake data for quarterly mailings."
tags:
- reporting
- crystal-reports
- snowflake
capability:
exposes:
- type: mcp
namespace: client-statements
port: 8080
tools:
- name: generate-statement
description: "Generate a client statement using Crystal Reports."
inputParameters:
- name: account_number
in: body
type: string
description: "Account number."
- name: period
in: body
type: string
description: "Statement period."
steps:
- name: fetch-data
type: call
call: "snowflake.run-query"
with:
query: "SELECT * FROM client_statement_data WHERE account_number='{{account_number}}' AND period='{{period}}'"
- name: generate-report
type: call
call: "crystal-reports.generate"
with:
template: "client_statement"
data: "{{fetch-data.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: crystal-reports
baseUri: "https://reports.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.crystal_reports_token"
resources:
- name: reports
path: "/reports/generate"
operations:
- name: generate
method: POST
Runs a portfolio risk analytics model in Databricks calculating VaR, stress tests, and correlation analysis, then stores results in Snowflake.
naftiko: "0.5"
info:
label: "Databricks Risk Analytics Model"
description: "Runs a portfolio risk analytics model in Databricks calculating VaR, stress tests, and correlation analysis, then stores results in Snowflake."
tags:
- risk-management
- analytics
- databricks
- snowflake
capability:
exposes:
- type: mcp
namespace: risk-analytics
port: 8080
tools:
- name: run-risk-model
description: "Execute the Databricks risk model and store results in Snowflake."
inputParameters:
- name: portfolio_id
in: body
type: string
description: "Portfolio identifier."
- name: model_type
in: body
type: string
description: "Risk model type (var_historical, var_parametric, monte_carlo, stress_test)."
- name: confidence_level
in: body
type: number
description: "Confidence level (e.g., 0.95, 0.99)."
steps:
- name: run-notebook
type: call
call: "databricks.run-notebook"
with:
notebook_path: "/Shared/risk_models/{{model_type}}"
parameters: "{\"portfolio_id\": \"{{portfolio_id}}\", \"confidence\": {{confidence_level}}}"
- name: load-results
type: call
call: "snowflake.run-query"
with:
query: "CALL load_risk_results('{{portfolio_id}}', '{{model_type}}')"
consumes:
- type: http
namespace: databricks
baseUri: "https://schwab.cloud.databricks.com/api/2.1"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: jobs
path: "/jobs/runs/submit"
operations:
- name: run-notebook
method: POST
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Deploys risk models from Databricks to production by validating model metrics, registering in MLflow, deploying to the serving endpoint, and notifying the risk team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Databricks Risk Model Deployment Pipeline"
description: "Deploys risk models from Databricks to production by validating model metrics, registering in MLflow, deploying to the serving endpoint, and notifying the risk team via Microsoft Teams."
tags:
- machine-learning
- risk-modeling
- databricks
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ml-deployment
port: 8080
tools:
- name: deploy-risk-model
description: "Orchestrate risk model deployment across Databricks, MLflow, and Teams."
inputParameters:
- name: model_name
in: body
type: string
description: "Model name in the registry."
- name: model_version
in: body
type: string
description: "Model version to deploy."
steps:
- name: validate-metrics
type: call
call: "databricks.get-model-metrics"
with:
name: "{{model_name}}"
version: "{{model_version}}"
- name: register-model
type: call
call: "databricks.transition-model-stage"
with:
name: "{{model_name}}"
version: "{{model_version}}"
stage: "Production"
- name: deploy-endpoint
type: call
call: "databricks.create-serving-endpoint"
with:
name: "{{model_name}}-serving"
model_name: "{{model_name}}"
model_version: "{{model_version}}"
- name: notify-team
type: call
call: "msteams.send-channel-message"
with:
team_id: "risk-analytics"
channel: "model-deployments"
text: "Risk model deployed: {{model_name}} v{{model_version}}. Metrics: AUC={{validate-metrics.auc}}, F1={{validate-metrics.f1}}. Endpoint: {{deploy-endpoint.url}}."
consumes:
- type: http
namespace: databricks
baseUri: "https://schwab.cloud.databricks.com/api/2.0"
authentication:
type: bearer
token: "$secrets.databricks_token"
resources:
- name: models
path: "/mlflow/model-versions/get"
operations:
- name: get-model-metrics
method: GET
- name: transitions
path: "/mlflow/model-versions/transition-stage"
operations:
- name: transition-model-stage
method: POST
- name: endpoints
path: "/serving-endpoints"
operations:
- name: create-serving-endpoint
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
Queries Datadog for real-time health metrics of the trading platform including order latency and throughput.
naftiko: "0.5"
info:
label: "Datadog Trading Platform Monitor"
description: "Queries Datadog for real-time health metrics of the trading platform including order latency and throughput."
tags:
- devops
- monitoring
- trading
- datadog
capability:
exposes:
- type: mcp
namespace: trading-monitoring
port: 8080
tools:
- name: check-trading-health
description: "Fetch trading platform health metrics from Datadog."
inputParameters:
- name: service_name
in: body
type: string
description: "Trading service name in Datadog."
call: "datadog.query-metrics"
with:
query: "avg:trading.order_latency_ms{service:{{service_name}}}.rollup(avg, 60)"
outputParameters:
- name: avg_latency
type: number
mapping: "$.series[0].pointlist[-1][1]"
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: apiKey
key: "$secrets.datadog_api_key"
resources:
- name: metrics
path: "/query"
operations:
- name: query-metrics
method: GET
Processes dividend reinvestment by fetching dividend data from Bloomberg, checking DRIP enrollment in the account system, executing reinvestment trades via OMS, and logging in Snowflake.
naftiko: "0.5"
info:
label: "Dividend Reinvestment Processing Pipeline"
description: "Processes dividend reinvestment by fetching dividend data from Bloomberg, checking DRIP enrollment in the account system, executing reinvestment trades via OMS, and logging in Snowflake."
tags:
- dividends
- reinvestment
- bloomberg
- trading
- snowflake
capability:
exposes:
- type: mcp
namespace: drip-processing
port: 8080
tools:
- name: process-drip
description: "Orchestrate dividend reinvestment across Bloomberg, account system, OMS, and Snowflake."
inputParameters:
- name: security_id
in: body
type: string
description: "Security identifier."
- name: ex_date
in: body
type: string
description: "Ex-dividend date."
steps:
- name: get-dividend
type: call
call: "bloomberg.get-dividend"
with:
security_id: "{{security_id}}"
ex_date: "{{ex_date}}"
- name: get-drip-accounts
type: call
call: "accounts.get-drip-enrolled"
with:
security_id: "{{security_id}}"
- name: execute-reinvestment
type: call
call: "oms.create-drip-orders"
with:
security_id: "{{security_id}}"
dividend_per_share: "{{get-dividend.amount}}"
accounts: "{{get-drip-accounts.data}}"
- name: log-processing
type: call
call: "snowflake.insert-drip-log"
with:
statement: "INSERT INTO DRIP_PROCESSING_LOG VALUES ('{{security_id}}', '{{ex_date}}', {{get-drip-accounts.count}}, {{execute-reinvestment.total_shares}}, CURRENT_TIMESTAMP)"
warehouse: "SCHWAB_OPERATIONS_WH"
consumes:
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: dividends
path: "/dividends"
operations:
- name: get-dividend
method: GET
- type: http
namespace: accounts
baseUri: "https://accounts-api.schwab.com/v2"
authentication:
type: bearer
token: "$secrets.accounts_api_token"
resources:
- name: drip
path: "/drip-enrollment"
operations:
- name: get-drip-enrolled
method: GET
- type: http
namespace: oms
baseUri: "https://oms-api.schwab.com/v2"
authentication:
type: bearer
token: "$secrets.oms_api_token"
resources:
- name: drip-orders
path: "/orders/drip"
operations:
- name: create-drip-orders
method: POST
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: insert-drip-log
method: POST
Sends account opening agreements and disclosure documents to clients for electronic signature via DocuSign.
naftiko: "0.5"
info:
label: "DocuSign Account Agreement Sender"
description: "Sends account opening agreements and disclosure documents to clients for electronic signature via DocuSign."
tags:
- documents
- e-signature
- docusign
capability:
exposes:
- type: mcp
namespace: document-signing
port: 8080
tools:
- name: send-agreement
description: "Send an account agreement envelope for electronic signature via DocuSign."
inputParameters:
- name: client_email
in: body
type: string
description: "Client email address."
- name: client_name
in: body
type: string
description: "Client full name."
- name: template_id
in: body
type: string
description: "DocuSign template ID for the agreement type."
call: "docusign.create-envelope"
with:
templateId: "{{template_id}}"
signerEmail: "{{client_email}}"
signerName: "{{client_name}}"
outputParameters:
- name: envelope_id
type: string
mapping: "$.envelopeId"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: docusign
baseUri: "https://na4.docusign.net/restapi/v2.1/accounts/$secrets.docusign_account_id"
authentication:
type: bearer
token: "$secrets.docusign_access_token"
resources:
- name: envelopes
path: "/envelopes"
operations:
- name: create-envelope
method: POST
Queries Dynatrace for performance problems affecting the order execution path to detect latency spikes.
naftiko: "0.5"
info:
label: "Dynatrace Trading Latency Detector"
description: "Queries Dynatrace for performance problems affecting the order execution path to detect latency spikes."
tags:
- monitoring
- trading
- dynatrace
capability:
exposes:
- type: mcp
namespace: trading-performance
port: 8080
tools:
- name: get-latency-problems
description: "Retrieve latency-related problems from Dynatrace for trading systems."
inputParameters:
- name: time_range
in: body
type: string
description: "Time range."
call: "dynatrace.get-problems"
with:
relativeTime: "{{time_range}}"
status: "OPEN"
impactLevel: "SERVICE"
outputParameters:
- name: problems
type: array
mapping: "$.result"
- name: total_count
type: integer
mapping: "$.totalCount"
consumes:
- type: http
namespace: dynatrace
baseUri: "https://schwab.live.dynatrace.com/api/v2"
authentication:
type: bearer
token: "$secrets.dynatrace_token"
resources:
- name: problems
path: "/problems"
operations:
- name: get-problems
method: GET
Searches Elasticsearch indices for trade execution logs by account, symbol, or time range for compliance audit trails.
naftiko: "0.5"
info:
label: "Elasticsearch Trade Log Search"
description: "Searches Elasticsearch indices for trade execution logs by account, symbol, or time range for compliance audit trails."
tags:
- compliance
- logging
- elasticsearch
capability:
exposes:
- type: mcp
namespace: trade-logs
port: 8080
tools:
- name: search-trade-logs
description: "Search trade execution logs in Elasticsearch."
inputParameters:
- name: account_id
in: body
type: string
description: "Client account identifier."
- name: symbol
in: body
type: string
description: "Security symbol to filter by."
- name: date_from
in: body
type: string
description: "Start date in YYYY-MM-DD format."
call: "elasticsearch.search"
with:
index: "trade-executions-*"
query: "{\"bool\":{\"must\":[{\"term\":{\"account_id\":\"{{account_id}}\"}},{\"term\":{\"symbol\":\"{{symbol}}\"}},{\"range\":{\"timestamp\":{\"gte\":\"{{date_from}}\"}}}]}}"
outputParameters:
- name: trades
type: array
mapping: "$.hits.hits"
- name: total
type: integer
mapping: "$.hits.total.value"
consumes:
- type: http
namespace: elasticsearch
baseUri: "https://es-cluster.schwab.com"
authentication:
type: bearer
token: "$secrets.elasticsearch_token"
resources:
- name: search
path: "/{{index}}/_search"
inputParameters:
- name: index
in: path
operations:
- name: search
method: POST
On SEC filing detection, retrieves prospectus data from FactSet, updates the fund database in Snowflake, publishes to the client portal via SharePoint, and notifies compliance via Microsoft Teams.
naftiko: "0.5"
info:
label: "ETF Prospectus Update Orchestrator"
description: "On SEC filing detection, retrieves prospectus data from FactSet, updates the fund database in Snowflake, publishes to the client portal via SharePoint, and notifies compliance via Microsoft Teams."
tags:
- fund-management
- prospectus
- factset
- snowflake
- sharepoint
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: prospectus-management
port: 8080
tools:
- name: process-prospectus-update
description: "Orchestrate ETF prospectus update across FactSet, Snowflake, SharePoint, and Teams."
inputParameters:
- name: fund_ticker
in: body
type: string
description: "ETF ticker symbol."
- name: filing_id
in: body
type: string
description: "SEC filing identifier."
steps:
- name: get-prospectus
type: call
call: "factset.get-fund-filing"
with:
ticker: "{{fund_ticker}}"
filing_id: "{{filing_id}}"
- name: update-database
type: call
call: "snowflake.execute-update"
with:
statement: "UPDATE FUND_PROSPECTUS SET content = '{{get-prospectus.content}}', effective_date = '{{get-prospectus.effective_date}}' WHERE ticker = '{{fund_ticker}}'"
warehouse: "SCHWAB_FUND_WH"
- name: publish-portal
type: call
call: "sharepoint.upload-file"
with:
site_id: "fund_documents"
path: "Prospectus/{{fund_ticker}}/{{filing_id}}.pdf"
content: "{{get-prospectus.document}}"
- name: notify-compliance
type: call
call: "msteams.send-channel-message"
with:
team_id: "fund-compliance"
channel: "prospectus-updates"
text: "Prospectus updated: {{fund_ticker}}. Filing: {{filing_id}}. Effective: {{get-prospectus.effective_date}}."
consumes:
- type: http
namespace: factset
baseUri: "https://api.factset.com/content/factset-funds/v1"
authentication:
type: basic
username: "$secrets.factset_user"
password: "$secrets.factset_password"
resources:
- name: filings
path: "/fund-filings"
operations:
- name: get-fund-filing
method: POST
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-update
method: POST
- 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:/{{path}}:/content"
inputParameters:
- name: site_id
in: path
- name: path
in: path
operations:
- name: upload-file
method: PUT
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
Checks F5 load balancer pools for the trading gateway infrastructure.
naftiko: "0.5"
info:
label: "F5 Networks Trading Gateway Health"
description: "Checks F5 load balancer pools for the trading gateway infrastructure."
tags:
- infrastructure
- trading
- f5-networks
capability:
exposes:
- type: mcp
namespace: trading-infra
port: 8080
tools:
- name: check-gateway-health
description: "Check F5 pool health for trading gateways."
inputParameters:
- name: pool_name
in: body
type: string
description: "F5 pool name."
call: "f5.get-pool-members"
with:
pool_name: "{{pool_name}}"
outputParameters:
- name: available_count
type: integer
mapping: "$.available_count"
- name: total_count
type: integer
mapping: "$.total_count"
consumes:
- type: http
namespace: f5
baseUri: "https://f5.schwab.com/mgmt/tm/ltm"
authentication:
type: basic
username: "$secrets.f5_user"
password: "$secrets.f5_password"
resources:
- name: pool-members
path: "/pool/{{pool_name}}/members"
inputParameters:
- name: pool_name
in: path
operations:
- name: get-pool-members
method: GET
Retrieves upcoming earnings dates and estimates from FactSet for securities in Schwab client portfolios.
naftiko: "0.5"
info:
label: "FactSet Earnings Calendar Retriever"
description: "Retrieves upcoming earnings dates and estimates from FactSet for securities in Schwab client portfolios."
tags:
- research
- earnings
- factset
capability:
exposes:
- type: mcp
namespace: earnings-research
port: 8080
tools:
- name: get-earnings-calendar
description: "Fetch upcoming earnings dates and consensus estimates from FactSet."
inputParameters:
- name: ticker
in: body
type: string
description: "Stock ticker symbol."
call: "factset.get-earnings"
with:
ids: "{{ticker}}"
outputParameters:
- name: earnings_date
type: string
mapping: "$.data[0].earnings_date"
- name: eps_estimate
type: number
mapping: "$.data[0].eps_consensus"
- name: revenue_estimate
type: number
mapping: "$.data[0].revenue_consensus"
consumes:
- type: http
namespace: factset
baseUri: "https://api.factset.com/content/factset-estimates/v2"
authentication:
type: basic
username: "$secrets.factset_user"
password: "$secrets.factset_password"
resources:
- name: earnings
path: "/consensus-estimates"
operations:
- name: get-earnings
method: POST
Retrieves fundamental financial data from FactSet for equity research and investment analysis.
naftiko: "0.5"
info:
label: "FactSet Research Data Retriever"
description: "Retrieves fundamental financial data from FactSet for equity research and investment analysis."
tags:
- research
- fundamentals
- factset
capability:
exposes:
- type: mcp
namespace: equity-research
port: 8080
tools:
- name: get-fundamentals
description: "Fetch fundamental financial data from FactSet for a given company."
inputParameters:
- name: ticker
in: body
type: string
description: "Stock ticker symbol."
- name: metrics
in: body
type: string
description: "Comma-separated metrics (e.g., PE_RATIO,EPS,REVENUE,MARKET_CAP)."
call: "factset.get-fundamentals"
with:
ids: "{{ticker}}"
metrics: "{{metrics}}"
outputParameters:
- name: data
type: object
mapping: "$.data[0]"
- name: company_name
type: string
mapping: "$.data[0].companyName"
consumes:
- type: http
namespace: factset
baseUri: "https://api.factset.com/content"
authentication:
type: basic
username: "$secrets.factset_user"
password: "$secrets.factset_api_key"
resources:
- name: fundamentals
path: "/factset-fundamentals/v2/fundamentals"
operations:
- name: get-fundamentals
method: POST
Matches fixed income trades by comparing Calypso entries with counterparty confirmations via Tradeweb, reconciling in Snowflake, and escalating breaks via Jira.
naftiko: "0.5"
info:
label: "Fixed Income Trade Matching Orchestrator"
description: "Matches fixed income trades by comparing Calypso entries with counterparty confirmations via Tradeweb, reconciling in Snowflake, and escalating breaks via Jira."
tags:
- fixed-income
- trade-matching
- calypso
- tradeweb
- snowflake
- jira
capability:
exposes:
- type: mcp
namespace: fi-matching
port: 8080
tools:
- name: match-fi-trades
description: "Orchestrate fixed income trade matching across Calypso, Tradeweb, Snowflake, and Jira."
inputParameters:
- name: trade_date
in: body
type: string
description: "Trade date in YYYY-MM-DD."
- name: asset_class
in: body
type: string
description: "Asset class (corporate, treasury, muni, agency)."
steps:
- name: get-calypso-trades
type: call
call: "calypso.get-fi-trades"
with:
trade_date: "{{trade_date}}"
asset_class: "{{asset_class}}"
- name: get-counterparty-confirms
type: call
call: "tradeweb.get-confirmations"
with:
date: "{{trade_date}}"
product: "{{asset_class}}"
- name: run-matching
type: call
call: "snowflake.execute-matching"
with:
statement: "CALL FI_TRADE_MATCH('{{trade_date}}', '{{asset_class}}')"
warehouse: "SCHWAB_OPERATIONS_WH"
- name: escalate-breaks
type: call
call: "jira.create-issue"
with:
project: "TRADEOPS"
summary: "FI trade breaks: {{trade_date}} {{asset_class}} - {{run-matching.break_count}} unmatched"
description: "Trade date: {{trade_date}}\nAsset class: {{asset_class}}\nMatched: {{run-matching.matched_count}}\nBreaks: {{run-matching.break_count}}\nTotal notional: {{run-matching.total_notional}}"
issuetype: "Task"
consumes:
- type: http
namespace: calypso
baseUri: "https://calypso.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.calypso_token"
resources:
- name: fi-trades
path: "/trades/fixed-income"
operations:
- name: get-fi-trades
method: GET
- type: http
namespace: tradeweb
baseUri: "https://api.tradeweb.com/v1"
authentication:
type: bearer
token: "$secrets.tradeweb_token"
resources:
- name: confirmations
path: "/confirmations"
operations:
- name: get-confirmations
method: GET
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: execute-matching
method: POST
- type: http
namespace: jira
baseUri: "https://schwab.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
Triggers GitHub Actions deployment workflow for Schwab's digital platform and notifies the release team.
naftiko: "0.5"
info:
label: "GitHub Actions Platform Deployment"
description: "Triggers GitHub Actions deployment workflow for Schwab's digital platform and notifies the release team."
tags:
- devops
- deployment
- github-actions
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: platform-deployment
port: 8080
tools:
- name: trigger-deployment
description: "Trigger a GitHub Actions deployment workflow and notify the release team."
inputParameters:
- name: repo
in: body
type: string
description: "Repository (org/repo)."
- name: workflow_id
in: body
type: string
description: "Workflow ID."
- name: environment
in: body
type: string
description: "Target environment."
steps:
- name: dispatch-workflow
type: call
call: "github.dispatch-workflow"
with:
owner_repo: "{{repo}}"
workflow_id: "{{workflow_id}}"
ref: "main"
inputs: "{\"environment\": \"{{environment}}\"}"
- name: notify-team
type: call
call: "msteams.send-message"
with:
channel_id: "release_management"
text: "Deployment triggered: {{repo}} to {{environment}}."
consumes:
- type: http
namespace: github
baseUri: "https://api.github.com"
authentication:
type: bearer
token: "$secrets.github_token"
resources:
- name: workflow-dispatches
path: "/repos/{{owner_repo}}/actions/workflows/{{workflow_id}}/dispatches"
inputParameters:
- name: owner_repo
in: path
- name: workflow_id
in: path
operations:
- name: dispatch-workflow
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: send-message
method: POST
Organizes client financial planning documents in Google Drive by account and type.
naftiko: "0.5"
info:
label: "Google Drive Client Document Organizer"
description: "Organizes client financial planning documents in Google Drive by account and type."
tags:
- document-management
- google-drive
capability:
exposes:
- type: mcp
namespace: client-documents
port: 8080
tools:
- name: organize-client-doc
description: "Move a client document to the correct Drive folder."
inputParameters:
- name: file_id
in: body
type: string
description: "File ID."
- name: account_number
in: body
type: string
description: "Account number."
call: "google-drive.move-file"
with:
file_id: "{{file_id}}"
target_folder: "clients_{{account_number}}"
outputParameters:
- name: name
type: string
mapping: "$.name"
consumes:
- type: http
namespace: google-drive
baseUri: "https://www.googleapis.com/drive/v3"
authentication:
type: bearer
token: "$secrets.google_drive_token"
resources:
- name: files
path: "/files/{{file_id}}"
inputParameters:
- name: file_id
in: path
operations:
- name: move-file
method: PATCH
Exports financial planning model outputs from Snowflake to Google Sheets for advisor use in client meetings.
naftiko: "0.5"
info:
label: "Google Sheets Financial Planning Exporter"
description: "Exports financial planning model outputs from Snowflake to Google Sheets for advisor use in client meetings."
tags:
- financial-planning
- reporting
- snowflake
- google-sheets
capability:
exposes:
- type: mcp
namespace: financial-planning
port: 8080
tools:
- name: export-planning-model
description: "Run a financial planning projection and export to Google Sheets."
inputParameters:
- name: account_number
in: body
type: string
description: "Client account number."
- name: projection_years
in: body
type: integer
description: "Years to project."
- name: spreadsheet_id
in: body
type: string
description: "Google Sheets ID."
steps:
- name: run-projection
type: call
call: "snowflake.run-query"
with:
query: "CALL run_financial_projection('{{account_number}}', {{projection_years}})"
- name: write-sheet
type: call
call: "google-sheets.update-values"
with:
spreadsheet_id: "{{spreadsheet_id}}"
range: "Projection!A1"
values: "{{run-projection.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: google-sheets
baseUri: "https://sheets.googleapis.com/v4/spreadsheets"
authentication:
type: bearer
token: "$secrets.google_sheets_token"
resources:
- name: values
path: "/{{spreadsheet_id}}/values/{{range}}"
inputParameters:
- name: spreadsheet_id
in: path
- name: range
in: path
operations:
- name: update-values
method: PUT
Retrieves a snapshot of infrastructure health metrics from Grafana dashboards for Schwab's trading platform systems.
naftiko: "0.5"
info:
label: "Grafana Infrastructure Dashboard Snapshot"
description: "Retrieves a snapshot of infrastructure health metrics from Grafana dashboards for Schwab's trading platform systems."
tags:
- infrastructure
- monitoring
- grafana
capability:
exposes:
- type: mcp
namespace: infra-monitoring
port: 8080
tools:
- name: get-dashboard-snapshot
description: "Fetch a Grafana dashboard snapshot by dashboard UID."
inputParameters:
- name: dashboard_uid
in: body
type: string
description: "Grafana dashboard UID."
call: "grafana.get-dashboard"
with:
uid: "{{dashboard_uid}}"
outputParameters:
- name: title
type: string
mapping: "$.dashboard.title"
- name: panels
type: array
mapping: "$.dashboard.panels"
consumes:
- type: http
namespace: grafana
baseUri: "https://grafana.schwab.com/api"
authentication:
type: bearer
token: "$secrets.grafana_api_key"
resources:
- name: dashboards
path: "/dashboards/uid/{{uid}}"
inputParameters:
- name: uid
in: path
operations:
- name: get-dashboard
method: GET
Checks secret rotation status and lease expiration in HashiCorp Vault for Schwab trading platform credentials.
naftiko: "0.5"
info:
label: "HashiCorp Vault Secret Rotation Status"
description: "Checks secret rotation status and lease expiration in HashiCorp Vault for Schwab trading platform credentials."
tags:
- security
- secrets-management
- hashicorp-vault
capability:
exposes:
- type: mcp
namespace: secrets-management
port: 8080
tools:
- name: check-secret-status
description: "Check a secret's lease and rotation status in Vault."
inputParameters:
- name: secret_path
in: body
type: string
description: "Vault secret path (e.g., secret/data/trading/db-creds)."
call: "vault.read-secret-metadata"
with:
path: "{{secret_path}}"
outputParameters:
- name: version
type: integer
mapping: "$.data.current_version"
- name: created_time
type: string
mapping: "$.data.versions.*.created_time"
- name: deletion_time
type: string
mapping: "$.data.versions.*.deletion_time"
consumes:
- type: http
namespace: vault
baseUri: "https://vault.schwab.com/v1"
authentication:
type: bearer
token: "$secrets.vault_token"
resources:
- name: metadata
path: "/{{path}}/metadata"
inputParameters:
- name: path
in: path
operations:
- name: read-secret-metadata
method: GET
Triggers an Informatica data quality job to validate and cleanse client master data records.
naftiko: "0.5"
info:
label: "Informatica Client Data Quality Pipeline"
description: "Triggers an Informatica data quality job to validate and cleanse client master data records."
tags:
- data-quality
- master-data
- informatica
capability:
exposes:
- type: mcp
namespace: data-quality
port: 8080
tools:
- name: run-data-quality-job
description: "Trigger an Informatica data quality validation job for client records."
inputParameters:
- name: job_name
in: body
type: string
description: "Informatica job name."
- name: scope
in: body
type: string
description: "Data scope (all_clients, new_accounts, address_updates)."
call: "informatica.run-job"
with:
job_name: "{{job_name}}"
parameters: "{\"scope\": \"{{scope}}\"}"
outputParameters:
- name: run_id
type: string
mapping: "$.runId"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: informatica
baseUri: "https://na1.dm-us.informaticacloud.com/saas/api/v2"
authentication:
type: bearer
token: "$secrets.informatica_token"
resources:
- name: jobs
path: "/job"
operations:
- name: run-job
method: POST
Generates tax documents (1099-DIV, 1099-INT, 1099-B) for client accounts using tax data from Snowflake.
naftiko: "0.5"
info:
label: "Intuit Tax Document Generator"
description: "Generates tax documents (1099-DIV, 1099-INT, 1099-B) for client accounts using tax data from Snowflake."
tags:
- tax
- reporting
- snowflake
capability:
exposes:
- type: mcp
namespace: tax-reporting
port: 8080
tools:
- name: generate-tax-docs
description: "Generate tax reporting documents from Snowflake data."
inputParameters:
- name: account_number
in: body
type: string
description: "Client account number."
- name: tax_year
in: body
type: string
description: "Tax year."
- name: form_type
in: body
type: string
description: "Form type (1099-DIV, 1099-INT, 1099-B)."
call: "snowflake.run-query"
with:
query: "CALL generate_tax_form('{{account_number}}', '{{tax_year}}', '{{form_type}}')"
outputParameters:
- name: form_data
type: object
mapping: "$.data[0]"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Orchestrates IRA rollover requests by validating eligibility via the account system, sending DocuSign agreements, creating a ServiceNow tracking ticket, and notifying the advisor via Microsoft Teams.
naftiko: "0.5"
info:
label: "IRA Rollover Processing Orchestrator"
description: "Orchestrates IRA rollover requests by validating eligibility via the account system, sending DocuSign agreements, creating a ServiceNow tracking ticket, and notifying the advisor via Microsoft Teams."
tags:
- retirement
- ira-rollover
- docusign
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: ira-rollover
port: 8080
tools:
- name: process-rollover
description: "Orchestrate IRA rollover processing across eligibility, DocuSign, ServiceNow, and Teams."
inputParameters:
- name: account_id
in: body
type: string
description: "Source account ID."
- name: rollover_amount
in: body
type: number
description: "Rollover amount."
- name: rollover_type
in: body
type: string
description: "Rollover type (traditional, roth, sep)."
- name: advisor_email
in: body
type: string
description: "Advisor email for notification."
steps:
- name: validate-eligibility
type: call
call: "accounts.check-rollover-eligibility"
with:
account_id: "{{account_id}}"
amount: "{{rollover_amount}}"
type: "{{rollover_type}}"
- name: send-agreement
type: call
call: "docusign.create-envelope"
with:
templateId: "ira-rollover-{{rollover_type}}"
signerEmail: "{{validate-eligibility.client_email}}"
signerName: "{{validate-eligibility.client_name}}"
- name: create-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "IRA Rollover: {{account_id}} - ${{rollover_amount}}"
category: "retirement_operations"
assigned_group: "Retirement_Services"
description: "{{rollover_type}} rollover for ${{rollover_amount}}. DocuSign: {{send-agreement.envelope_id}}."
- name: notify-advisor
type: call
call: "msteams.send-message"
with:
recipient_upn: "{{advisor_email}}"
text: "IRA rollover initiated: {{account_id}}, ${{rollover_amount}} ({{rollover_type}}). Ticket: {{create-ticket.number}}. DocuSign sent to client."
consumes:
- type: http
namespace: accounts
baseUri: "https://accounts-api.schwab.com/v2"
authentication:
type: bearer
token: "$secrets.accounts_api_token"
resources:
- name: rollover
path: "/rollover/eligibility"
operations:
- name: check-rollover-eligibility
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_access_token"
resources:
- name: envelopes
path: "/envelopes"
operations:
- name: create-envelope
method: POST
- type: http
namespace: servicenow
baseUri: "https://schwab.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
Retrieves sprint progress from Jira for the Schwab digital platform engineering team.
naftiko: "0.5"
info:
label: "Jira Development Sprint Tracker"
description: "Retrieves sprint progress from Jira for the Schwab digital platform engineering team."
tags:
- development
- project-management
- jira
capability:
exposes:
- type: mcp
namespace: dev-tracking
port: 8080
tools:
- name: get-sprint-progress
description: "Fetch current sprint progress from Jira."
inputParameters:
- name: board_id
in: body
type: string
description: "Jira board ID."
call: "jira.get-active-sprint"
with:
board_id: "{{board_id}}"
outputParameters:
- name: sprint_name
type: string
mapping: "$.values[0].name"
- name: start_date
type: string
mapping: "$.values[0].startDate"
- name: end_date
type: string
mapping: "$.values[0].endDate"
consumes:
- type: http
namespace: jira
baseUri: "https://schwab.atlassian.net/rest/agile/1.0"
authentication:
type: basic
username: "$secrets.jira_user"
password: "$secrets.jira_api_token"
resources:
- name: sprints
path: "/board/{{board_id}}/sprint"
inputParameters:
- name: board_id
in: path
operations:
- name: get-active-sprint
method: GET
Monitors Apache Kafka topic health and consumer lag for Schwab's real-time trade event streaming pipeline.
naftiko: "0.5"
info:
label: "Kafka Trade Event Stream Monitor"
description: "Monitors Apache Kafka topic health and consumer lag for Schwab's real-time trade event streaming pipeline."
tags:
- streaming
- kafka
- trading
capability:
exposes:
- type: mcp
namespace: trade-streaming
port: 8080
tools:
- name: get-topic-health
description: "Check Kafka topic health and consumer lag for trade event streams."
inputParameters:
- name: topic_name
in: body
type: string
description: "Kafka topic name."
- name: consumer_group
in: body
type: string
description: "Consumer group ID."
call: "kafka.get-consumer-lag"
with:
topic: "{{topic_name}}"
group: "{{consumer_group}}"
outputParameters:
- name: total_lag
type: integer
mapping: "$.total_lag"
- name: partitions
type: array
mapping: "$.partitions"
consumes:
- type: http
namespace: kafka
baseUri: "https://kafka-rest.schwab.com/v3"
authentication:
type: bearer
token: "$secrets.kafka_rest_token"
resources:
- name: consumer-groups
path: "/clusters/schwab-prod/consumer-groups/{{group}}/lags"
inputParameters:
- name: group
in: path
operations:
- name: get-consumer-lag
method: GET
Publishes investor relations content on the Schwab LinkedIn company page for earnings and corporate updates.
naftiko: "0.5"
info:
label: "LinkedIn Investor Relations Publisher"
description: "Publishes investor relations content on the Schwab LinkedIn company page for earnings and corporate updates."
tags:
- investor-relations
- communications
- linkedin
capability:
exposes:
- type: mcp
namespace: investor-comms
port: 8080
tools:
- name: publish-ir-post
description: "Post investor relations content to the Schwab LinkedIn page."
inputParameters:
- name: text
in: body
type: string
description: "Post content."
- name: link_url
in: body
type: string
description: "Link URL."
call: "linkedin.create-post"
with:
author: "urn:li:organization:{{schwab_org_id}}"
text: "{{text}}"
link: "{{link_url}}"
outputParameters:
- name: post_id
type: string
mapping: "$.id"
consumes:
- type: http
namespace: linkedin
baseUri: "https://api.linkedin.com/v2"
authentication:
type: bearer
token: "$secrets.linkedin_token"
resources:
- name: ugcPosts
path: "/ugcPosts"
operations:
- name: create-post
method: POST
Creates and sends market insight newsletters to Schwab clients segmented by investment interests.
naftiko: "0.5"
info:
label: "MailChimp Client Newsletter Sender"
description: "Creates and sends market insight newsletters to Schwab clients segmented by investment interests."
tags:
- marketing
- client-engagement
- mailchimp
capability:
exposes:
- type: mcp
namespace: client-newsletters
port: 8080
tools:
- name: send-newsletter
description: "Create and send a market insights newsletter via MailChimp."
inputParameters:
- name: list_id
in: body
type: string
description: "MailChimp list ID."
- name: subject
in: body
type: string
description: "Email subject."
- name: template_id
in: body
type: string
description: "MailChimp template ID."
call: "mailchimp.create-campaign"
with:
type: "regular"
recipients_list_id: "{{list_id}}"
subject_line: "{{subject}}"
template_id: "{{template_id}}"
from_name: "Charles Schwab"
outputParameters:
- name: campaign_id
type: string
mapping: "$.id"
consumes:
- type: http
namespace: mailchimp
baseUri: "https://us1.api.mailchimp.com/3.0"
authentication:
type: basic
username: "anystring"
password: "$secrets.mailchimp_api_key"
resources:
- name: campaigns
path: "/campaigns"
operations:
- name: create-campaign
method: POST
On margin threshold breach detection, retrieves account details from Salesforce, generates a margin call notice, sends SMS via Twilio, and creates a ServiceNow case.
naftiko: "0.5"
info:
label: "Margin Call Alert Pipeline"
description: "On margin threshold breach detection, retrieves account details from Salesforce, generates a margin call notice, sends SMS via Twilio, and creates a ServiceNow case."
tags:
- risk-management
- margin
- salesforce
- twilio
- servicenow
capability:
exposes:
- type: mcp
namespace: margin-alerts
port: 8080
tools:
- name: process-margin-call
description: "Orchestrate margin call notification across Salesforce, Twilio, and ServiceNow."
inputParameters:
- name: account_id
in: body
type: string
description: "Client account ID."
- name: margin_deficit
in: body
type: number
description: "Margin deficit amount."
steps:
- name: get-account
type: call
call: "salesforce.get-account"
with:
account_id: "{{account_id}}"
- name: send-sms
type: call
call: "twilio.send-message"
with:
To: "{{get-account.phone}}"
Body: "Schwab Margin Notice: Account {{account_id}} has a margin deficit of ${{margin_deficit}}. Please deposit funds or reduce positions by market close."
From: "+18005407000"
- name: create-case
type: call
call: "servicenow.create-incident"
with:
short_description: "Margin call: {{account_id}} - deficit ${{margin_deficit}}"
category: "margin_operations"
assigned_group: "Margin_Operations"
description: "Margin call for account {{account_id}}. Deficit: ${{margin_deficit}}. Client: {{get-account.name}}. SMS sent: {{send-sms.message_sid}}."
consumes:
- type: http
namespace: salesforce
baseUri: "https://schwab.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: 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
- type: http
namespace: servicenow
baseUri: "https://schwab.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
On Bloomberg feed disruption, switches to FactSet backup, validates data quality in Snowflake, alerts trading desks via Microsoft Teams, and creates a ServiceNow incident.
naftiko: "0.5"
info:
label: "Market Data Feed Failover Orchestrator"
description: "On Bloomberg feed disruption, switches to FactSet backup, validates data quality in Snowflake, alerts trading desks via Microsoft Teams, and creates a ServiceNow incident."
tags:
- market-data
- failover
- bloomberg
- factset
- microsoft-teams
- servicenow
capability:
exposes:
- type: mcp
namespace: feed-failover
port: 8080
tools:
- name: execute-failover
description: "Orchestrate market data feed failover from Bloomberg to FactSet."
inputParameters:
- name: feed_id
in: body
type: string
description: "Bloomberg feed identifier."
- name: failure_type
in: body
type: string
description: "Type of failure (latency, stale, disconnected)."
steps:
- name: activate-backup
type: call
call: "factset.activate-feed"
with:
feed_type: "{{feed_id}}"
mode: "primary"
- name: validate-quality
type: call
call: "snowflake.query-quality"
with:
statement: "SELECT COUNT(*) as stale_count FROM MARKET_DATA WHERE updated_at < DATEADD(minute, -5, CURRENT_TIMESTAMP)"
warehouse: "SCHWAB_TRADING_WH"
- name: alert-trading
type: call
call: "msteams.send-channel-message"
with:
team_id: "trading-desks"
channel: "market-data-alerts"
text: "ALERT: Bloomberg feed {{feed_id}} failed ({{failure_type}}). Switched to FactSet backup. Data quality check: {{validate-quality.stale_count}} stale records."
- name: create-incident
type: call
call: "servicenow.create-incident"
with:
short_description: "Bloomberg feed failover: {{feed_id}} - {{failure_type}}"
category: "market_data"
assigned_group: "Market_Data_Ops"
description: "Bloomberg feed {{feed_id}} failed: {{failure_type}}. FactSet backup activated. Stale records: {{validate-quality.stale_count}}."
consumes:
- type: http
namespace: factset
baseUri: "https://api.factset.com/content"
authentication:
type: basic
username: "$secrets.factset_user"
password: "$secrets.factset_password"
resources:
- name: feeds
path: "/feeds/activate"
operations:
- name: activate-feed
method: POST
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-quality
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
- type: http
namespace: servicenow
baseUri: "https://schwab.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
Logs client-advisor email communications through Microsoft Graph for compliance recordkeeping.
naftiko: "0.5"
info:
label: "Microsoft Graph Client Communication Logger"
description: "Logs client-advisor email communications through Microsoft Graph for compliance recordkeeping."
tags:
- compliance
- communications
- microsoft-graph
capability:
exposes:
- type: mcp
namespace: comms-logging
port: 8080
tools:
- name: log-client-email
description: "Retrieve and log a client-advisor email communication for compliance."
inputParameters:
- name: user_upn
in: body
type: string
description: "Advisor user principal name."
- name: message_id
in: body
type: string
description: "Email message ID."
call: "msgraph.get-message"
with:
user_upn: "{{user_upn}}"
message_id: "{{message_id}}"
outputParameters:
- name: subject
type: string
mapping: "$.subject"
- name: from
type: string
mapping: "$.from.emailAddress.address"
- name: received_date
type: string
mapping: "$.receivedDateTime"
consumes:
- type: http
namespace: msgraph
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: messages
path: "/users/{{user_upn}}/messages/{{message_id}}"
inputParameters:
- name: user_upn
in: path
- name: message_id
in: path
operations:
- name: get-message
method: GET
Checks Microsoft Intune device compliance status for Schwab employee devices accessing trading and client data systems.
naftiko: "0.5"
info:
label: "Microsoft Intune Device Compliance Checker"
description: "Checks Microsoft Intune device compliance status for Schwab employee devices accessing trading and client data systems."
tags:
- security
- endpoint
- microsoft-intune
capability:
exposes:
- type: mcp
namespace: device-compliance
port: 8080
tools:
- name: check-device-compliance
description: "Query Microsoft Intune for device compliance status."
inputParameters:
- name: device_id
in: body
type: string
description: "Intune device ID."
call: "intune.get-device-compliance"
with:
device_id: "{{device_id}}"
outputParameters:
- name: compliance_state
type: string
mapping: "$.complianceState"
- name: os_version
type: string
mapping: "$.osVersion"
- name: last_sync
type: string
mapping: "$.lastSyncDateTime"
consumes:
- type: http
namespace: intune
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: devices
path: "/deviceManagement/managedDevices/{{device_id}}"
inputParameters:
- name: device_id
in: path
operations:
- name: get-device-compliance
method: GET
Queries MongoDB for client communication preferences, notification settings, and personalization configuration.
naftiko: "0.5"
info:
label: "MongoDB Client Preferences Lookup"
description: "Queries MongoDB for client communication preferences, notification settings, and personalization configuration."
tags:
- client-data
- preferences
- mongodb
capability:
exposes:
- type: mcp
namespace: client-preferences
port: 8080
tools:
- name: get-client-preferences
description: "Look up client preferences and notification settings from MongoDB."
inputParameters:
- name: client_id
in: body
type: string
description: "Schwab client identifier."
call: "mongodb.find-one"
with:
collection: "client_preferences"
filter: "{\"client_id\": \"{{client_id}}\"}"
outputParameters:
- name: notification_channels
type: array
mapping: "$.notification_channels"
- name: language
type: string
mapping: "$.language_preference"
- name: paperless
type: boolean
mapping: "$.paperless_enrolled"
consumes:
- type: http
namespace: mongodb
baseUri: "https://data.mongodb-api.schwab.com/app/data-schwab/endpoint/data/v1"
authentication:
type: bearer
token: "$secrets.mongodb_api_key"
resources:
- name: find
path: "/action/findOne"
operations:
- name: find-one
method: POST
On new mutual fund purchase, retrieves the prospectus from the fund company API, stores in Box, sends to the client via email, and logs compliance delivery in Salesforce.
naftiko: "0.5"
info:
label: "Mutual Fund Prospectus Delivery Pipeline"
description: "On new mutual fund purchase, retrieves the prospectus from the fund company API, stores in Box, sends to the client via email, and logs compliance delivery in Salesforce."
tags:
- mutual-funds
- prospectus
- box
- salesforce
capability:
exposes:
- type: mcp
namespace: prospectus-delivery
port: 8080
tools:
- name: deliver-prospectus
description: "Orchestrate mutual fund prospectus delivery across fund API, Box, email, and Salesforce."
inputParameters:
- name: fund_ticker
in: body
type: string
description: "Mutual fund ticker."
- name: account_id
in: body
type: string
description: "Client account ID."
- name: client_email
in: body
type: string
description: "Client email address."
steps:
- name: get-prospectus
type: call
call: "funds.get-prospectus"
with:
ticker: "{{fund_ticker}}"
- name: store-copy
type: call
call: "box.upload-file"
with:
folder_id: "prospectus_delivery"
filename: "{{fund_ticker}}_{{account_id}}_prospectus.pdf"
content: "{{get-prospectus.document}}"
- name: email-client
type: call
call: "ses.send-email"
with:
to: "{{client_email}}"
subject: "Prospectus for {{get-prospectus.fund_name}}"
body: "Please find attached the prospectus for your recent purchase of {{get-prospectus.fund_name}} ({{fund_ticker}})."
attachment: "{{store-copy.url}}"
- name: log-delivery
type: call
call: "salesforce.create-task"
with:
account_id: "{{account_id}}"
subject: "Prospectus delivered: {{fund_ticker}}"
description: "Prospectus for {{get-prospectus.fund_name}} delivered via email. Box link: {{store-copy.url}}."
consumes:
- type: http
namespace: funds
baseUri: "https://fund-data.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.fund_data_token"
resources:
- name: prospectus
path: "/funds/{{ticker}}/prospectus"
inputParameters:
- name: ticker
in: path
operations:
- name: get-prospectus
method: GET
- type: http
namespace: box
baseUri: "https://upload.box.com/api/2.0"
authentication:
type: bearer
token: "$secrets.box_access_token"
resources:
- name: files
path: "/files/content"
operations:
- name: upload-file
method: POST
- type: http
namespace: ses
baseUri: "https://email.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: emails
path: "/v2/email/outbound-emails"
operations:
- name: send-email
method: POST
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: tasks
path: "/sobjects/Task"
operations:
- name: create-task
method: POST
On new financial advisor hire, creates Workday profile, provisions Okta account with MFA, sets up Salesforce user, and assigns Pluralsight training paths.
naftiko: "0.5"
info:
label: "New Advisor Provisioning Orchestrator"
description: "On new financial advisor hire, creates Workday profile, provisions Okta account with MFA, sets up Salesforce user, and assigns Pluralsight training paths."
tags:
- hr
- provisioning
- workday
- okta
- salesforce
- pluralsight
capability:
exposes:
- type: mcp
namespace: advisor-provisioning
port: 8080
tools:
- name: provision-advisor
description: "Orchestrate new advisor provisioning across Workday, Okta, Salesforce, and Pluralsight."
inputParameters:
- name: employee_id
in: body
type: string
description: "Workday employee ID."
- name: department
in: body
type: string
description: "Department name."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{employee_id}}"
- name: create-okta-user
type: call
call: "okta.create-user"
with:
email: "{{get-employee.email}}"
firstName: "{{get-employee.first_name}}"
lastName: "{{get-employee.last_name}}"
group: "Financial_Advisors"
- name: create-sf-user
type: call
call: "salesforce.create-user"
with:
email: "{{get-employee.email}}"
name: "{{get-employee.full_name}}"
profile: "Financial_Advisor"
- name: assign-training
type: call
call: "pluralsight.assign-channel"
with:
email: "{{get-employee.email}}"
channel_id: "advisor-onboarding-path"
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: okta
baseUri: "https://schwab.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users"
operations:
- name: create-user
method: POST
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: users
path: "/sobjects/User"
operations:
- name: create-user
method: POST
- type: http
namespace: pluralsight
baseUri: "https://api.pluralsight.com/api/v1"
authentication:
type: bearer
token: "$secrets.pluralsight_token"
resources:
- name: assignments
path: "/channel-assignments"
operations:
- name: assign-channel
method: POST
Retrieves application health metrics from New Relic for Schwab's client-facing web and mobile applications.
naftiko: "0.5"
info:
label: "New Relic Application Performance Monitor"
description: "Retrieves application health metrics from New Relic for Schwab's client-facing web and mobile applications."
tags:
- monitoring
- devops
- new-relic
capability:
exposes:
- type: mcp
namespace: app-health
port: 8080
tools:
- name: get-app-health
description: "Fetch application performance metrics from New Relic."
inputParameters:
- name: app_name
in: body
type: string
description: "New Relic application name."
call: "newrelic.get-app-metrics"
with:
app_name: "{{app_name}}"
outputParameters:
- name: error_rate
type: number
mapping: "$.application.application_summary.error_rate"
- name: response_time
type: number
mapping: "$.application.application_summary.response_time"
- name: throughput
type: number
mapping: "$.application.application_summary.throughput"
consumes:
- type: http
namespace: newrelic
baseUri: "https://api.newrelic.com/v2"
authentication:
type: apiKey
key: "$secrets.newrelic_api_key"
resources:
- name: applications
path: "/applications.json"
operations:
- name: get-app-metrics
method: GET
Checks user authentication status and MFA enrollment in Okta for Schwab employee and advisor access management.
naftiko: "0.5"
info:
label: "Okta User Authentication Status"
description: "Checks user authentication status and MFA enrollment in Okta for Schwab employee and advisor access management."
tags:
- identity
- authentication
- okta
capability:
exposes:
- type: mcp
namespace: identity-management
port: 8080
tools:
- name: get-user-auth-status
description: "Check a user's authentication status and MFA enrollment in Okta."
inputParameters:
- name: user_email
in: body
type: string
description: "User email address."
call: "okta.get-user"
with:
login: "{{user_email}}"
outputParameters:
- name: status
type: string
mapping: "$.status"
- name: mfa_enrolled
type: boolean
mapping: "$.credentials.provider.type"
- name: last_login
type: string
mapping: "$.lastLogin"
consumes:
- type: http
namespace: okta
baseUri: "https://schwab.okta.com/api/v1"
authentication:
type: bearer
token: "$secrets.okta_api_token"
resources:
- name: users
path: "/users/{{login}}"
inputParameters:
- name: login
in: path
operations:
- name: get-user
method: GET
Identifies expiring options positions from Snowflake, evaluates in-the-money status from Bloomberg, sends client notifications via Twilio SMS, and logs actions in Salesforce.
naftiko: "0.5"
info:
label: "Options Expiration Notification Pipeline"
description: "Identifies expiring options positions from Snowflake, evaluates in-the-money status from Bloomberg, sends client notifications via Twilio SMS, and logs actions in Salesforce."
tags:
- options
- expiration
- snowflake
- bloomberg
- twilio
- salesforce
capability:
exposes:
- type: mcp
namespace: options-expiration
port: 8080
tools:
- name: process-expirations
description: "Orchestrate options expiration notifications across Snowflake, Bloomberg, Twilio, and Salesforce."
inputParameters:
- name: expiration_date
in: body
type: string
description: "Options expiration date in YYYY-MM-DD."
steps:
- name: get-expiring-positions
type: call
call: "snowflake.query-options"
with:
statement: "SELECT * FROM OPTIONS_POSITIONS WHERE expiration_date = '{{expiration_date}}' AND quantity > 0"
warehouse: "SCHWAB_TRADING_WH"
- name: check-itm-status
type: call
call: "bloomberg.check-options-status"
with:
positions: "{{get-expiring-positions.data}}"
- name: send-notifications
type: call
call: "twilio.send-bulk-sms"
with:
messages: "{{check-itm-status.notifications}}"
from: "+18005407000"
- name: log-notifications
type: call
call: "salesforce.create-activities"
with:
activities: "{{send-notifications.delivery_log}}"
type: "options_expiration_notice"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-options
method: POST
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: options
path: "/options/itm-check"
operations:
- name: check-options-status
method: POST
- 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-bulk-sms
method: POST
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: activities
path: "/sobjects/Activity__c"
operations:
- name: create-activities
method: POST
Retrieves the current on-call schedule from PagerDuty for Schwab trading platform engineering teams.
naftiko: "0.5"
info:
label: "PagerDuty On-Call Schedule Lookup"
description: "Retrieves the current on-call schedule from PagerDuty for Schwab trading platform engineering teams."
tags:
- incident-management
- on-call
- pagerduty
capability:
exposes:
- type: mcp
namespace: oncall-management
port: 8080
tools:
- name: get-oncall
description: "Fetch current on-call engineers from PagerDuty."
inputParameters:
- name: schedule_id
in: body
type: string
description: "PagerDuty schedule ID."
call: "pagerduty.get-oncall"
with:
schedule_ids: "{{schedule_id}}"
outputParameters:
- name: oncall_user
type: string
mapping: "$.oncalls[0].user.summary"
- name: escalation_level
type: integer
mapping: "$.oncalls[0].escalation_level"
- name: start
type: string
mapping: "$.oncalls[0].start"
- name: end
type: string
mapping: "$.oncalls[0].end"
consumes:
- type: http
namespace: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: oncalls
path: "/oncalls"
operations:
- name: get-oncall
method: GET
Retrieves firewall rules from Palo Alto Panorama for compliance auditing of Schwab's network perimeter protecting client data.
naftiko: "0.5"
info:
label: "Palo Alto Networks Firewall Auditor"
description: "Retrieves firewall rules from Palo Alto Panorama for compliance auditing of Schwab's network perimeter protecting client data."
tags:
- security
- compliance
- palo-alto-networks
capability:
exposes:
- type: mcp
namespace: network-security
port: 8080
tools:
- name: audit-firewall-rules
description: "Fetch firewall security policies from Palo Alto Panorama."
inputParameters:
- name: device_group
in: body
type: string
description: "Device group."
call: "paloalto.get-security-rules"
with:
device_group: "{{device_group}}"
outputParameters:
- name: rules
type: array
mapping: "$.result.entry"
- name: total_rules
type: integer
mapping: "$.result.@count"
consumes:
- type: http
namespace: paloalto
baseUri: "https://panorama.schwab.com/restapi/v10.2"
authentication:
type: apiKey
key: "$secrets.paloalto_api_key"
resources:
- name: security-rules
path: "/Policies/SecurityRules"
operations:
- name: get-security-rules
method: GET
On critical trading platform incident, queries Datadog for service health, creates a Jira incident, pages on-call via PagerDuty, and posts a status update to Microsoft Teams.
naftiko: "0.5"
info:
label: "Platform Incident Response Orchestrator"
description: "On critical trading platform incident, queries Datadog for service health, creates a Jira incident, pages on-call via PagerDuty, and posts a status update to Microsoft Teams."
tags:
- incident-response
- datadog
- jira
- pagerduty
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: incident-response
port: 8080
tools:
- name: trigger-incident-response
description: "Orchestrate incident response across Datadog, Jira, PagerDuty, and Teams."
inputParameters:
- name: service_name
in: body
type: string
description: "Affected service name."
- name: severity
in: body
type: string
description: "Incident severity (P1, P2, P3)."
- name: description
in: body
type: string
description: "Incident description."
steps:
- name: get-service-health
type: call
call: "datadog.get-service-status"
with:
service: "{{service_name}}"
- name: create-incident-ticket
type: call
call: "jira.create-issue"
with:
project: "INCIDENT"
summary: "{{severity}} - {{service_name}}: {{description}}"
description: "Service: {{service_name}}\nSeverity: {{severity}}\nDatadog Status: {{get-service-health.status}}\nDescription: {{description}}"
issuetype: "Incident"
priority: "{{severity}}"
- name: page-oncall
type: call
call: "pagerduty.create-incident"
with:
service_id: "{{service_name}}"
title: "{{severity}} - {{service_name}}: {{description}}"
body: "Jira: {{create-incident-ticket.key}}"
- name: post-status
type: call
call: "msteams.send-channel-message"
with:
team_id: "trading-platform-team"
channel: "incidents"
text: "{{severity}} INCIDENT: {{service_name}} - {{description}}. Jira: {{create-incident-ticket.key}}. On-call paged."
consumes:
- type: http
namespace: datadog
baseUri: "https://api.datadoghq.com/api/v1"
authentication:
type: bearer
token: "$secrets.datadog_api_key"
resources:
- name: services
path: "/check_run"
operations:
- name: get-service-status
method: GET
- type: http
namespace: jira
baseUri: "https://schwab.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: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
Assigns Series 7, Series 66, and CFP study courses in Pluralsight to financial advisors.
naftiko: "0.5"
info:
label: "Pluralsight Financial Advisor Training"
description: "Assigns Series 7, Series 66, and CFP study courses in Pluralsight to financial advisors."
tags:
- training
- licensing
- pluralsight
capability:
exposes:
- type: mcp
namespace: advisor-training
port: 8080
tools:
- name: assign-licensing-course
description: "Assign a licensing preparation course in Pluralsight."
inputParameters:
- name: user_email
in: body
type: string
description: "Advisor email."
- name: path_id
in: body
type: string
description: "Learning path ID."
- name: due_date
in: body
type: string
description: "Due date."
call: "pluralsight.assign-path"
with:
email: "{{user_email}}"
path_id: "{{path_id}}"
due_date: "{{due_date}}"
outputParameters:
- name: assignment_id
type: string
mapping: "$.id"
consumes:
- type: http
namespace: pluralsight
baseUri: "https://api.pluralsight.com/api/v1"
authentication:
type: bearer
token: "$secrets.pluralsight_token"
resources:
- name: assignments
path: "/learning-paths/{{path_id}}/assignments"
inputParameters:
- name: path_id
in: path
operations:
- name: assign-path
method: POST
Retrieves client portfolio holdings from Snowflake, calculates asset allocation percentages, and returns a summary with sector exposure.
naftiko: "0.5"
info:
label: "Portfolio Holdings Analyzer"
description: "Retrieves client portfolio holdings from Snowflake, calculates asset allocation percentages, and returns a summary with sector exposure."
tags:
- portfolio
- analytics
- snowflake
capability:
exposes:
- type: mcp
namespace: portfolio-analytics
port: 8080
tools:
- name: analyze-portfolio
description: "Fetch client portfolio holdings from Snowflake and return asset allocation and sector exposure summary."
inputParameters:
- name: account_number
in: body
type: string
description: "Schwab account number."
- name: as_of_date
in: body
type: string
description: "Date for the snapshot in YYYY-MM-DD."
call: "snowflake.run-query"
with:
query: "SELECT h.symbol, h.quantity, h.market_value, s.sector, s.asset_class, ROUND(h.market_value / SUM(h.market_value) OVER() * 100, 2) as allocation_pct FROM portfolio_holdings h JOIN security_master s ON h.symbol = s.symbol WHERE h.account_number='{{account_number}}' AND h.as_of_date='{{as_of_date}}' ORDER BY h.market_value DESC"
outputParameters:
- name: holdings
type: array
mapping: "$.data"
- name: total_positions
type: integer
mapping: "$.resultSetMetaData.numRows"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Runs Postman test collections for Schwab's trading and account management APIs.
naftiko: "0.5"
info:
label: "Postman Trading API Test Suite"
description: "Runs Postman test collections for Schwab's trading and account management APIs."
tags:
- qa
- api-testing
- postman
capability:
exposes:
- type: mcp
namespace: api-testing
port: 8080
tools:
- name: run-api-tests
description: "Execute a Postman API test collection."
inputParameters:
- name: collection_id
in: body
type: string
description: "Collection UID."
- name: environment_id
in: body
type: string
description: "Environment UID."
call: "postman.run-collection"
with:
collection: "{{collection_id}}"
environment: "{{environment_id}}"
outputParameters:
- name: total_tests
type: integer
mapping: "$.run.stats.tests.total"
- name: failed_tests
type: integer
mapping: "$.run.stats.tests.failed"
consumes:
- type: http
namespace: postman
baseUri: "https://api.getpostman.com"
authentication:
type: apiKey
key: "$secrets.postman_api_key"
resources:
- name: collection-runs
path: "/monitors/{{collection_id}}/run"
inputParameters:
- name: collection_id
in: path
operations:
- name: run-collection
method: POST
Triggers a refresh of the Power BI client portfolio analytics dashboard used by financial advisors.
naftiko: "0.5"
info:
label: "Power BI Client Portfolio Dashboard"
description: "Triggers a refresh of the Power BI client portfolio analytics dashboard used by financial advisors."
tags:
- analytics
- portfolio
- power-bi
capability:
exposes:
- type: mcp
namespace: portfolio-reporting
port: 8080
tools:
- name: refresh-portfolio-dashboard
description: "Trigger a Power BI dataset refresh for the portfolio analytics dashboard."
inputParameters:
- name: dataset_id
in: body
type: string
description: "Power BI dataset ID."
call: "powerbi.trigger-refresh"
with:
dataset_id: "{{dataset_id}}"
outputParameters:
- name: request_id
type: string
mapping: "$.requestId"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: powerbi
baseUri: "https://api.powerbi.com/v1.0/myorg"
authentication:
type: bearer
token: "$secrets.powerbi_token"
resources:
- name: refreshes
path: "/datasets/{{dataset_id}}/refreshes"
inputParameters:
- name: dataset_id
in: path
operations:
- name: trigger-refresh
method: POST
Queries Prometheus for trading platform latency metrics including order execution time, API response times, and queue depth.
naftiko: "0.5"
info:
label: "Prometheus Trading Latency Metrics"
description: "Queries Prometheus for trading platform latency metrics including order execution time, API response times, and queue depth."
tags:
- monitoring
- performance
- prometheus
capability:
exposes:
- type: mcp
namespace: latency-metrics
port: 8080
tools:
- name: query-latency
description: "Query Prometheus for trading latency metrics."
inputParameters:
- name: promql
in: body
type: string
description: "PromQL query expression."
- name: time_range
in: body
type: string
description: "Time range (e.g., 1h, 6h, 24h)."
call: "prometheus.query-range"
with:
query: "{{promql}}"
duration: "{{time_range}}"
outputParameters:
- name: result
type: array
mapping: "$.data.result"
consumes:
- type: http
namespace: prometheus
baseUri: "https://prometheus.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.prometheus_token"
resources:
- name: query
path: "/query_range"
operations:
- name: query-range
method: POST
Triggers a reload of the Qlik Sense revenue analytics app tracking advisory fees, commission revenue, and net new assets.
naftiko: "0.5"
info:
label: "Qlik Sense Revenue Analytics Dashboard"
description: "Triggers a reload of the Qlik Sense revenue analytics app tracking advisory fees, commission revenue, and net new assets."
tags:
- analytics
- revenue
- qlik-sense
capability:
exposes:
- type: mcp
namespace: revenue-analytics
port: 8080
tools:
- name: reload-revenue-dashboard
description: "Trigger a Qlik Sense app reload for revenue analytics."
inputParameters:
- name: app_id
in: body
type: string
description: "Qlik Sense app ID."
call: "qlik.reload-app"
with:
app_id: "{{app_id}}"
outputParameters:
- name: reload_id
type: string
mapping: "$.id"
- name: status
type: string
mapping: "$.status"
consumes:
- type: http
namespace: qlik
baseUri: "https://schwab.us.qlikcloud.com/api/v1"
authentication:
type: bearer
token: "$secrets.qlik_api_key"
resources:
- name: reloads
path: "/reloads"
operations:
- name: reload-app
method: POST
Generates quarterly client statements by querying Snowflake for account data, rendering PDF via Crystal Reports, uploading to Amazon S3, and logging delivery in Salesforce.
naftiko: "0.5"
info:
label: "Quarterly Client Statement Pipeline"
description: "Generates quarterly client statements by querying Snowflake for account data, rendering PDF via Crystal Reports, uploading to Amazon S3, and logging delivery in Salesforce."
tags:
- statements
- reporting
- snowflake
- crystal-reports
- amazon-s3
- salesforce
capability:
exposes:
- type: mcp
namespace: client-statements
port: 8080
tools:
- name: generate-statement
description: "Orchestrate quarterly statement generation across Snowflake, Crystal Reports, S3, and Salesforce."
inputParameters:
- name: account_id
in: body
type: string
description: "Client account ID."
- name: quarter
in: body
type: string
description: "Quarter identifier (e.g., 2026-Q1)."
steps:
- name: get-account-data
type: call
call: "snowflake.query-statement-data"
with:
statement: "SELECT * FROM STATEMENT_DATA WHERE account_id = '{{account_id}}' AND quarter = '{{quarter}}'"
warehouse: "SCHWAB_REPORTING_WH"
- name: render-pdf
type: call
call: "crystalreports.generate-report"
with:
template: "quarterly-statement"
data: "{{get-account-data.data}}"
- name: upload-statement
type: call
call: "s3.put-object"
with:
bucket: "schwab-client-statements"
key: "{{quarter}}/{{account_id}}/statement.pdf"
body: "{{render-pdf.document}}"
- name: log-delivery
type: call
call: "salesforce.create-task"
with:
account_id: "{{account_id}}"
subject: "Q{{quarter}} statement generated"
description: "Statement uploaded to S3: {{upload-statement.url}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-statement-data
method: POST
- type: http
namespace: crystalreports
baseUri: "https://crystal-api.schwab.com/v1"
authentication:
type: bearer
token: "$secrets.crystal_reports_token"
resources:
- name: reports
path: "/render"
operations:
- name: generate-report
method: POST
- type: http
namespace: s3
baseUri: "https://s3.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: objects
path: "/{{bucket}}/{{key}}"
inputParameters:
- name: bucket
in: path
- name: key
in: path
operations:
- name: put-object
method: PUT
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: tasks
path: "/sobjects/Task"
operations:
- name: create-task
method: POST
Compiles quarterly earnings data from Snowflake, generates visualizations in Tableau, creates the investor relations deck in Google Slides, and publishes to the investor portal via SharePoint.
naftiko: "0.5"
info:
label: "Quarterly Earnings Report Orchestrator"
description: "Compiles quarterly earnings data from Snowflake, generates visualizations in Tableau, creates the investor relations deck in Google Slides, and publishes to the investor portal via SharePoint."
tags:
- investor-relations
- earnings
- snowflake
- tableau
- sharepoint
capability:
exposes:
- type: mcp
namespace: earnings-reporting
port: 8080
tools:
- name: compile-earnings-report
description: "Orchestrate quarterly earnings report across Snowflake, Tableau, and SharePoint."
inputParameters:
- name: quarter
in: body
type: string
description: "Quarter identifier (e.g., 2026-Q1)."
steps:
- name: get-financials
type: call
call: "snowflake.query-financials"
with:
statement: "SELECT * FROM QUARTERLY_FINANCIALS WHERE quarter = '{{quarter}}'"
warehouse: "SCHWAB_FINANCE_WH"
- name: refresh-dashboards
type: call
call: "tableau.refresh-workbook"
with:
workbook_id: "quarterly-earnings"
datasource: "{{get-financials.datasource_id}}"
- name: generate-deck
type: call
call: "googleslides.create-presentation"
with:
template_id: "earnings-deck-template"
data: "{{get-financials.data}}"
title: "Schwab Q{{quarter}} Earnings"
- name: publish-portal
type: call
call: "sharepoint.upload-file"
with:
site_id: "investor-relations"
path: "Earnings/{{quarter}}/earnings-deck.pptx"
content: "{{generate-deck.file}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-financials
method: POST
- type: http
namespace: tableau
baseUri: "https://tableau.schwab.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: googleslides
baseUri: "https://slides.googleapis.com/v1"
authentication:
type: bearer
token: "$secrets.google_slides_token"
resources:
- name: presentations
path: "/presentations"
operations:
- name: create-presentation
method: POST
- 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:/{{path}}:/content"
inputParameters:
- name: site_id
in: path
- name: path
in: path
operations:
- name: upload-file
method: PUT
Queries the Redis session cache to retrieve active client session data for the Schwab trading platform.
naftiko: "0.5"
info:
label: "Redis Session Cache Lookup"
description: "Queries the Redis session cache to retrieve active client session data for the Schwab trading platform."
tags:
- caching
- session-management
- redis
capability:
exposes:
- type: mcp
namespace: session-cache
port: 8080
tools:
- name: get-session
description: "Look up an active client session from Redis."
inputParameters:
- name: session_id
in: body
type: string
description: "Client session identifier."
call: "redis.get-key"
with:
key: "session:{{session_id}}"
outputParameters:
- name: client_id
type: string
mapping: "$.client_id"
- name: last_activity
type: string
mapping: "$.last_activity"
- name: session_ttl
type: integer
mapping: "$.ttl"
consumes:
- type: http
namespace: redis
baseUri: "https://schwab-redis.internal.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.redis_api_token"
resources:
- name: keys
path: "/get/{{key}}"
inputParameters:
- name: key
in: path
operations:
- name: get-key
method: GET
Prepares for SEC/FINRA examinations by gathering compliance data from Snowflake, pulling audit logs from Splunk, compiling documents in Box, and creating a preparation checklist in Jira.
naftiko: "0.5"
info:
label: "Regulatory Exam Preparation Orchestrator"
description: "Prepares for SEC/FINRA examinations by gathering compliance data from Snowflake, pulling audit logs from Splunk, compiling documents in Box, and creating a preparation checklist in Jira."
tags:
- regulatory
- examination
- snowflake
- splunk
- box
- jira
capability:
exposes:
- type: mcp
namespace: exam-preparation
port: 8080
tools:
- name: prepare-exam-materials
description: "Orchestrate regulatory exam preparation across Snowflake, Splunk, Box, and Jira."
inputParameters:
- name: exam_type
in: body
type: string
description: "Examination type (sec-audit, finra-cycle, state-exam)."
- name: exam_date
in: body
type: string
description: "Scheduled examination date."
steps:
- name: gather-compliance-data
type: call
call: "snowflake.query-compliance"
with:
statement: "SELECT * FROM COMPLIANCE_METRICS WHERE report_date >= DATEADD(year, -2, CURRENT_DATE)"
warehouse: "SCHWAB_COMPLIANCE_WH"
- name: pull-audit-logs
type: call
call: "splunk.search"
with:
query: "index=audit_trail earliest=-2y | stats count by action_type, department"
- name: compile-documents
type: call
call: "box.create-folder"
with:
parent_folder_id: "exam_materials"
name: "{{exam_type}}_{{exam_date}}"
- name: create-checklist
type: call
call: "jira.create-issue"
with:
project: "COMPLIANCE"
summary: "Exam prep: {{exam_type}} - {{exam_date}}"
description: "Compliance data: {{gather-compliance-data.record_count}} records. Audit logs: {{pull-audit-logs.event_count}} events. Documents: {{compile-documents.url}}."
issuetype: "Task"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-compliance
method: POST
- type: http
namespace: splunk
baseUri: "https://splunk.schwab.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search
path: "/search/jobs"
operations:
- name: search
method: POST
- type: http
namespace: box
baseUri: "https://api.box.com/2.0"
authentication:
type: bearer
token: "$secrets.box_access_token"
resources:
- name: folders
path: "/folders"
operations:
- name: create-folder
method: POST
- type: http
namespace: jira
baseUri: "https://schwab.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
Identifies clients approaching Required Minimum Distribution deadlines from Snowflake, calculates RMD amounts, sends reminders via email and SMS, and logs outreach in Salesforce.
naftiko: "0.5"
info:
label: "RMD Distribution Reminder Pipeline"
description: "Identifies clients approaching Required Minimum Distribution deadlines from Snowflake, calculates RMD amounts, sends reminders via email and SMS, and logs outreach in Salesforce."
tags:
- retirement
- rmd
- snowflake
- twilio
- salesforce
capability:
exposes:
- type: mcp
namespace: rmd-reminders
port: 8080
tools:
- name: process-rmd-reminders
description: "Orchestrate RMD distribution reminders across Snowflake, Twilio, and Salesforce."
inputParameters:
- name: reminder_days
in: body
type: integer
description: "Days before deadline to send reminder."
steps:
- name: get-rmd-clients
type: call
call: "snowflake.query-rmd"
with:
statement: "SELECT * FROM RMD_SCHEDULE WHERE deadline_date <= DATEADD(day, {{reminder_days}}, CURRENT_DATE) AND distributed = FALSE"
warehouse: "SCHWAB_RETIREMENT_WH"
- name: send-sms-reminders
type: call
call: "twilio.send-bulk-sms"
with:
messages: "{{get-rmd-clients.sms_list}}"
from: "+18005407000"
- name: send-email-reminders
type: call
call: "ses.send-bulk-email"
with:
recipients: "{{get-rmd-clients.email_list}}"
template: "rmd-reminder"
- name: log-outreach
type: call
call: "salesforce.create-bulk-activities"
with:
activities: "{{get-rmd-clients.activity_log}}"
type: "rmd_reminder_sent"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: query-rmd
method: POST
- 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-bulk-sms
method: POST
- type: http
namespace: ses
baseUri: "https://email.us-east-1.amazonaws.com"
authentication:
type: aws-sig-v4
access_key: "$secrets.aws_access_key"
secret_key: "$secrets.aws_secret_key"
resources:
- name: bulk-email
path: "/v2/email/outbound-bulk-emails"
operations:
- name: send-bulk-email
method: POST
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: activities
path: "/composite/sobjects/Activity__c"
operations:
- name: create-bulk-activities
method: POST
Queries Salesforce for a financial advisor's client book of business with account balances and recent activity.
naftiko: "0.5"
info:
label: "Salesforce Client Relationship Dashboard"
description: "Queries Salesforce for a financial advisor's client book of business with account balances and recent activity."
tags:
- crm
- client-management
- salesforce
capability:
exposes:
- type: mcp
namespace: client-crm
port: 8080
tools:
- name: get-advisor-book
description: "Retrieve a financial advisor's client portfolio from Salesforce."
inputParameters:
- name: advisor_id
in: body
type: string
description: "Advisor Salesforce user ID."
call: "salesforce.query"
with:
q: "SELECT Name, Account_Number__c, Total_Assets__c, Last_Contact_Date__c, Account_Type__c FROM Account WHERE OwnerId = '{{advisor_id}}' AND RecordType.Name = 'Client' ORDER BY Total_Assets__c DESC"
outputParameters:
- name: clients
type: array
mapping: "$.records"
- name: total_clients
type: integer
mapping: "$.totalSize"
consumes:
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: query
path: "/query"
operations:
- name: query
method: GET
Retrieves pending expense reports from SAP Concur for financial advisor travel and client event expenses.
naftiko: "0.5"
info:
label: "SAP Concur Expense Report Processor"
description: "Retrieves pending expense reports from SAP Concur for financial advisor travel and client event expenses."
tags:
- finance
- expenses
- sap-concur
capability:
exposes:
- type: mcp
namespace: expense-management
port: 8080
tools:
- name: get-pending-expenses
description: "Fetch pending expense reports from SAP Concur."
inputParameters:
- name: approver_id
in: body
type: string
description: "Approver user ID."
call: "concur.get-reports"
with:
approverLoginId: "{{approver_id}}"
status: "SUBMITTED"
outputParameters:
- name: reports
type: array
mapping: "$.Items"
- name: total_amount
type: number
mapping: "$.TotalAmount"
consumes:
- type: http
namespace: concur
baseUri: "https://us.api.concursolutions.com/api/v3.0"
authentication:
type: bearer
token: "$secrets.concur_token"
resources:
- name: reports
path: "/expense/reports"
operations:
- name: get-reports
method: GET
Retrieves crash reports from New Relic for the Schwab mobile trading application, returning crash rate, affected users, and stack traces.
naftiko: "0.5"
info:
label: "Schwab Mobile App Crash Reporter"
description: "Retrieves crash reports from New Relic for the Schwab mobile trading application, returning crash rate, affected users, and stack traces."
tags:
- mobile
- monitoring
- new-relic
capability:
exposes:
- type: mcp
namespace: mobile-monitoring
port: 8080
tools:
- name: get-crash-reports
description: "Fetch mobile app crash reports from New Relic."
inputParameters:
- name: app_id
in: body
type: string
description: "New Relic mobile application ID."
- name: time_range
in: body
type: string
description: "Time range in hours (e.g., 24, 48, 168)."
call: "newrelic.get-crashes"
with:
application_id: "{{app_id}}"
time_range: "{{time_range}}"
outputParameters:
- name: crash_rate
type: number
mapping: "$.crash_summary.crash_rate"
- name: affected_users
type: integer
mapping: "$.crash_summary.unique_users"
- name: top_crashes
type: array
mapping: "$.crash_summary.top_crashes"
consumes:
- type: http
namespace: newrelic
baseUri: "https://api.newrelic.com/v2"
authentication:
type: bearer
token: "$secrets.newrelic_api_key"
resources:
- name: mobile-crashes
path: "/mobile_applications/{{application_id}}/crashes.json"
inputParameters:
- name: application_id
in: path
operations:
- name: get-crashes
method: GET
Generates SEC regulatory filing data from Snowflake and uploads to SharePoint for legal review before submission.
naftiko: "0.5"
info:
label: "SEC Regulatory Filing Generator"
description: "Generates SEC regulatory filing data from Snowflake and uploads to SharePoint for legal review before submission."
tags:
- compliance
- regulatory
- sec
- snowflake
- sharepoint
capability:
exposes:
- type: mcp
namespace: regulatory-filings
port: 8080
tools:
- name: generate-sec-filing
description: "Generate SEC filing data from Snowflake and upload to SharePoint for review."
inputParameters:
- name: filing_type
in: body
type: string
description: "Filing type (10-K, 10-Q, 8-K, ADV)."
- name: reporting_period
in: body
type: string
description: "Reporting period."
steps:
- name: generate-data
type: call
call: "snowflake.run-query"
with:
query: "CALL generate_sec_filing('{{filing_type}}', '{{reporting_period}}')"
- name: upload-draft
type: call
call: "sharepoint.upload-file"
with:
site_id: "regulatory_filings"
folder_path: "SEC/{{filing_type}}/{{reporting_period}}"
file_name: "{{filing_type}}_draft_{{reporting_period}}.xlsx"
content: "{{generate-data.results}}"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-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:/{{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
On vulnerability scan detection, retrieves findings from Palo Alto Networks, creates a Jira remediation ticket, assigns to the service owner via Backstage, and escalates critical items via PagerDuty.
naftiko: "0.5"
info:
label: "Security Vulnerability Remediation Pipeline"
description: "On vulnerability scan detection, retrieves findings from Palo Alto Networks, creates a Jira remediation ticket, assigns to the service owner via Backstage, and escalates critical items via PagerDuty."
tags:
- security
- vulnerability
- palo-alto-networks
- jira
- pagerduty
capability:
exposes:
- type: mcp
namespace: vuln-remediation
port: 8080
tools:
- name: remediate-vulnerability
description: "Orchestrate vulnerability remediation across Palo Alto, Jira, and PagerDuty."
inputParameters:
- name: scan_id
in: body
type: string
description: "Vulnerability scan ID."
- name: severity
in: body
type: string
description: "Vulnerability severity (critical, high, medium, low)."
steps:
- name: get-findings
type: call
call: "paloalto.get-scan-results"
with:
scan_id: "{{scan_id}}"
- name: create-ticket
type: call
call: "jira.create-issue"
with:
project: "SECOPS"
summary: "Vulnerability: {{get-findings.cve_id}} - {{severity}}"
description: "CVE: {{get-findings.cve_id}}\nSeverity: {{severity}}\nAffected: {{get-findings.affected_hosts}}\nRemediation: {{get-findings.remediation}}"
issuetype: "Bug"
priority: "{{severity}}"
- name: escalate-critical
type: call
call: "pagerduty.create-incident"
with:
service_id: "SECURITY_OPS"
title: "Critical vulnerability: {{get-findings.cve_id}}"
body: "Jira: {{create-ticket.key}}. Affected hosts: {{get-findings.affected_count}}."
consumes:
- type: http
namespace: paloalto
baseUri: "https://prisma.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.prisma_token"
resources:
- name: scans
path: "/scans/{{scan_id}}/results"
inputParameters:
- name: scan_id
in: path
operations:
- name: get-scan-results
method: GET
- type: http
namespace: jira
baseUri: "https://schwab.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: 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 an IT incident from ServiceNow by number and returns current state, assignee, and resolution details.
naftiko: "0.5"
info:
label: "ServiceNow IT Incident Lookup"
description: "Retrieves an IT incident from ServiceNow by number and returns current state, assignee, and resolution details."
tags:
- it-support
- incident-management
- servicenow
capability:
exposes:
- type: mcp
namespace: it-support
port: 8080
tools:
- name: get-incident
description: "Look up a ServiceNow incident by number."
inputParameters:
- name: incident_number
in: body
type: string
description: "Incident number."
call: "servicenow.get-incident"
with:
number: "{{incident_number}}"
outputParameters:
- name: state
type: string
mapping: "$.result[0].state"
- name: assigned_to
type: string
mapping: "$.result[0].assigned_to.display_value"
- name: short_description
type: string
mapping: "$.result[0].short_description"
consumes:
- type: http
namespace: servicenow
baseUri: "https://schwab.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: get-incident
method: GET
Generates client trading activity reports from Snowflake for quarterly account reviews.
naftiko: "0.5"
info:
label: "Snowflake Client Activity Report"
description: "Generates client trading activity reports from Snowflake for quarterly account reviews."
tags:
- reporting
- client-services
- snowflake
capability:
exposes:
- type: mcp
namespace: client-reporting
port: 8080
tools:
- name: get-client-activity
description: "Query Snowflake for client trading activity summary."
inputParameters:
- name: account_number
in: body
type: string
description: "Account number."
- name: quarter
in: body
type: string
description: "Fiscal quarter."
call: "snowflake.run-query"
with:
query: "SELECT trade_date, symbol, side, quantity, price, total_value FROM trade_history WHERE account_number='{{account_number}}' AND fiscal_quarter='{{quarter}}' ORDER BY trade_date DESC"
outputParameters:
- name: trades
type: array
mapping: "$.data"
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
Monitors Schwab's data center infrastructure health via SolarWinds.
naftiko: "0.5"
info:
label: "SolarWinds Data Center Monitoring"
description: "Monitors Schwab's data center infrastructure health via SolarWinds."
tags:
- infrastructure
- solarwinds
capability:
exposes:
- type: mcp
namespace: dc-monitoring
port: 8080
tools:
- name: get-dc-health
description: "Retrieve data center health from SolarWinds."
inputParameters:
- name: dc_name
in: body
type: string
description: "Data center name."
call: "solarwinds.get-dc-stats"
with:
datacenter: "{{dc_name}}"
outputParameters:
- name: overall_health
type: string
mapping: "$.status"
- name: nodes_up
type: integer
mapping: "$.nodes_available"
consumes:
- type: http
namespace: solarwinds
baseUri: "https://solarwinds.schwab.com/SolarWinds/InformationService/v3/Json"
authentication:
type: basic
username: "$secrets.solarwinds_user"
password: "$secrets.solarwinds_password"
resources:
- name: query
path: "/Query"
operations:
- name: get-dc-stats
method: POST
Searches Splunk for security events related to unauthorized access attempts and suspicious login patterns.
naftiko: "0.5"
info:
label: "Splunk Security Event Analyzer"
description: "Searches Splunk for security events related to unauthorized access attempts and suspicious login patterns."
tags:
- security
- siem
- splunk
capability:
exposes:
- type: mcp
namespace: security-analysis
port: 8080
tools:
- name: search-security-events
description: "Run a Splunk search for security events."
inputParameters:
- name: search_query
in: body
type: string
description: "Splunk search query (SPL)."
- name: time_range
in: body
type: string
description: "Time range (e.g., -24h, -7d)."
call: "splunk.create-search"
with:
search: "{{search_query}}"
earliest_time: "{{time_range}}"
outputParameters:
- name: search_id
type: string
mapping: "$.sid"
consumes:
- type: http
namespace: splunk
baseUri: "https://splunk.schwab.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search-jobs
path: "/search/jobs"
operations:
- name: create-search
method: POST
On AML alert trigger, retrieves transaction history from Teradata, pulls client KYC data from Salesforce, generates a SAR filing, and logs the case in ServiceNow.
naftiko: "0.5"
info:
label: "Suspicious Activity Report Pipeline"
description: "On AML alert trigger, retrieves transaction history from Teradata, pulls client KYC data from Salesforce, generates a SAR filing, and logs the case in ServiceNow."
tags:
- compliance
- aml
- teradata
- salesforce
- servicenow
capability:
exposes:
- type: mcp
namespace: aml-compliance
port: 8080
tools:
- name: process-sar
description: "Orchestrate suspicious activity report generation across Teradata, Salesforce, and ServiceNow."
inputParameters:
- name: alert_id
in: body
type: string
description: "AML alert identifier."
- name: account_id
in: body
type: string
description: "Client account ID."
steps:
- name: get-transactions
type: call
call: "teradata.query-transactions"
with:
query: "SELECT * FROM TRANSACTION_HISTORY WHERE account_id = '{{account_id}}' AND txn_date >= CURRENT_DATE - 90"
- name: get-kyc
type: call
call: "salesforce.get-kyc"
with:
account_id: "{{account_id}}"
- name: generate-sar
type: call
call: "compliance.create-sar"
with:
alert_id: "{{alert_id}}"
account_id: "{{account_id}}"
transaction_summary: "{{get-transactions.summary}}"
kyc_data: "{{get-kyc.data}}"
- name: log-case
type: call
call: "servicenow.create-incident"
with:
short_description: "SAR filed: Alert {{alert_id}} - Account {{account_id}}"
category: "aml_compliance"
assigned_group: "BSA_Compliance"
description: "SAR reference: {{generate-sar.sar_id}}. Alert: {{alert_id}}. Account: {{account_id}}."
consumes:
- type: http
namespace: teradata
baseUri: "https://teradata.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.teradata_token"
resources:
- name: queries
path: "/queries"
operations:
- name: query-transactions
method: POST
- type: http
namespace: salesforce
baseUri: "https://schwab.my.salesforce.com/services/data/v59.0"
authentication:
type: bearer
token: "$secrets.salesforce_token"
resources:
- name: kyc
path: "/sobjects/KYC_Profile__c/{{account_id}}"
inputParameters:
- name: account_id
in: path
operations:
- name: get-kyc
method: GET
- type: http
namespace: compliance
baseUri: "https://compliance-api.schwab.com/v1"
authentication:
type: bearer
token: "$secrets.compliance_api_token"
resources:
- name: sar
path: "/sar"
operations:
- name: create-sar
method: POST
- type: http
namespace: servicenow
baseUri: "https://schwab.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
Generates a trusted ticket for embedding Tableau investment analytics dashboards in the advisor portal.
naftiko: "0.5"
info:
label: "Tableau Investment Analytics Embed"
description: "Generates a trusted ticket for embedding Tableau investment analytics dashboards in the advisor portal."
tags:
- analytics
- visualization
- tableau
capability:
exposes:
- type: mcp
namespace: investment-analytics
port: 8080
tools:
- name: get-analytics-dashboard
description: "Generate a Tableau trusted ticket for investment analytics."
inputParameters:
- name: username
in: body
type: string
description: "Tableau username."
call: "tableau.get-trusted-ticket"
with:
username: "{{username}}"
outputParameters:
- name: ticket
type: string
mapping: "$"
consumes:
- type: http
namespace: tableau
baseUri: "https://tableau.schwab.com"
authentication:
type: basic
username: "$secrets.tableau_admin_user"
password: "$secrets.tableau_admin_password"
resources:
- name: trusted
path: "/trusted"
operations:
- name: get-trusted-ticket
method: POST
Runs performance analytics queries against the Teradata warehouse for fund historical returns.
naftiko: "0.5"
info:
label: "Teradata Historical Performance Query"
description: "Runs performance analytics queries against the Teradata warehouse for fund historical returns."
tags:
- analytics
- performance
- teradata
capability:
exposes:
- type: mcp
namespace: performance-analytics
port: 8080
tools:
- name: query-fund-performance
description: "Query Teradata for fund historical performance."
inputParameters:
- name: fund_ticker
in: body
type: string
description: "Fund ticker."
- name: period
in: body
type: string
description: "Period."
call: "teradata.run-query"
with:
query: "SELECT ticker, period_return_pct, benchmark_return_pct, alpha, sharpe_ratio FROM fund_performance WHERE ticker='{{fund_ticker}}' AND period='{{period}}'"
outputParameters:
- name: results
type: object
mapping: "$.results[0]"
consumes:
- type: http
namespace: teradata
baseUri: "https://teradata.schwab.com/api/query/v1"
authentication:
type: basic
username: "$secrets.teradata_user"
password: "$secrets.teradata_password"
resources:
- name: queries
path: "/tdrest/systems/schwab_edw/queries"
operations:
- name: run-query
method: POST
Validates a trade order against compliance rules in Snowflake, checking for restricted securities, concentration limits, and suitability requirements before execution.
naftiko: "0.5"
info:
label: "Trade Execution Compliance Checker"
description: "Validates a trade order against compliance rules in Snowflake, checking for restricted securities, concentration limits, and suitability requirements before execution."
tags:
- compliance
- trading
- snowflake
- servicenow
capability:
exposes:
- type: mcp
namespace: trade-compliance
port: 8080
tools:
- name: check-trade-compliance
description: "Validate a trade against compliance rules and create a ServiceNow exception if violations are found."
inputParameters:
- name: account_number
in: body
type: string
description: "Client account number."
- name: symbol
in: body
type: string
description: "Security symbol."
- name: side
in: body
type: string
description: "Trade side (BUY, SELL)."
- name: quantity
in: body
type: integer
description: "Order quantity."
- name: order_type
in: body
type: string
description: "Order type (MARKET, LIMIT)."
steps:
- name: check-rules
type: call
call: "snowflake.run-query"
with:
query: "CALL check_trade_compliance('{{account_number}}', '{{symbol}}', '{{side}}', {{quantity}}, '{{order_type}}')"
- name: create-exception
type: call
call: "servicenow.create-incident"
with:
short_description: "Trade compliance exception: {{symbol}} {{side}} {{quantity}} for account {{account_number}}"
category: "compliance"
urgency: "high"
description: "Trade compliance check results: {{check-rules.results}}. Account: {{account_number}}, Symbol: {{symbol}}, Side: {{side}}, Qty: {{quantity}}."
consumes:
- type: http
namespace: snowflake
baseUri: "https://schwab.snowflakecomputing.com/api/v2"
authentication:
type: bearer
token: "$secrets.snowflake_token"
resources:
- name: statements
path: "/statements"
operations:
- name: run-query
method: POST
- type: http
namespace: servicenow
baseUri: "https://schwab.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
On trade settlement failure, retrieves trade details from Calypso, checks counterparty status in Bloomberg, creates a Jira ticket for operations, and escalates via PagerDuty.
naftiko: "0.5"
info:
label: "Trade Failure Resolution Pipeline"
description: "On trade settlement failure, retrieves trade details from Calypso, checks counterparty status in Bloomberg, creates a Jira ticket for operations, and escalates via PagerDuty."
tags:
- trade-operations
- settlement
- calypso
- bloomberg
- jira
- pagerduty
capability:
exposes:
- type: mcp
namespace: trade-failure
port: 8080
tools:
- name: resolve-trade-failure
description: "Orchestrate trade failure resolution across Calypso, Bloomberg, Jira, and PagerDuty."
inputParameters:
- name: trade_id
in: body
type: string
description: "Failed trade identifier."
- name: failure_reason
in: body
type: string
description: "Settlement failure reason code."
steps:
- name: get-trade
type: call
call: "calypso.get-trade"
with:
trade_id: "{{trade_id}}"
- name: check-counterparty
type: call
call: "bloomberg.get-counterparty"
with:
counterparty_id: "{{get-trade.counterparty_id}}"
- name: create-jira
type: call
call: "jira.create-issue"
with:
project: "TRADEOPS"
summary: "Settlement failure: {{trade_id}} - {{failure_reason}}"
description: "Trade: {{trade_id}}\nCounterparty: {{check-counterparty.name}}\nAmount: {{get-trade.settlement_amount}}\nFailure: {{failure_reason}}"
issuetype: "Incident"
- name: escalate
type: call
call: "pagerduty.create-incident"
with:
service_id: "TRADE_SETTLEMENT"
title: "Trade settlement failure: {{trade_id}}"
body: "Jira: {{create-jira.key}}. Counterparty: {{check-counterparty.name}}."
consumes:
- type: http
namespace: calypso
baseUri: "https://calypso.schwab.com/api/v1"
authentication:
type: bearer
token: "$secrets.calypso_token"
resources:
- name: trades
path: "/trades/{{trade_id}}"
inputParameters:
- name: trade_id
in: path
operations:
- name: get-trade
method: GET
- type: http
namespace: bloomberg
baseUri: "https://api.bloomberg.com/eap"
authentication:
type: bearer
token: "$secrets.bloomberg_token"
resources:
- name: counterparties
path: "/counterparties/{{counterparty_id}}"
inputParameters:
- name: counterparty_id
in: path
operations:
- name: get-counterparty
method: GET
- type: http
namespace: jira
baseUri: "https://schwab.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: pagerduty
baseUri: "https://api.pagerduty.com"
authentication:
type: bearer
token: "$secrets.pagerduty_token"
resources:
- name: incidents
path: "/incidents"
operations:
- name: create-incident
method: POST
Sends SMS notifications to Schwab clients via Twilio for trade confirmations, account alerts, and security notifications.
naftiko: "0.5"
info:
label: "Twilio Client SMS Notification Sender"
description: "Sends SMS notifications to Schwab clients via Twilio for trade confirmations, account alerts, and security notifications."
tags:
- notifications
- sms
- twilio
capability:
exposes:
- type: mcp
namespace: client-notifications
port: 8080
tools:
- name: send-sms
description: "Send an SMS notification to a client via Twilio."
inputParameters:
- name: phone_number
in: body
type: string
description: "Client phone number in E.164 format."
- name: message
in: body
type: string
description: "SMS message body."
call: "twilio.send-message"
with:
To: "{{phone_number}}"
Body: "{{message}}"
From: "+18005407000"
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
Monitors WebSphere servers running legacy account management systems.
naftiko: "0.5"
info:
label: "WebSphere Legacy Account System Monitor"
description: "Monitors WebSphere servers running legacy account management systems."
tags:
- infrastructure
- websphere
capability:
exposes:
- type: mcp
namespace: legacy-health
port: 8080
tools:
- name: check-legacy-server
description: "Query WebSphere for legacy server health."
inputParameters:
- name: server_name
in: body
type: string
description: "Server name."
call: "websphere.get-server-status"
with:
server: "{{server_name}}"
outputParameters:
- name: status
type: string
mapping: "$.state"
- name: heap_usage_pct
type: number
mapping: "$.jvm.heap_usage_pct"
consumes:
- type: http
namespace: websphere
baseUri: "https://websphere-admin.schwab.com/IBMJMXConnectorREST"
authentication:
type: basic
username: "$secrets.websphere_admin_user"
password: "$secrets.websphere_admin_password"
resources:
- name: servers
path: "/mbeans/WebSphere:type=Server,name={{server}}"
inputParameters:
- name: server
in: path
operations:
- name: get-server-status
method: GET
Processes wire transfer requests by validating the account in the core banking system, running fraud checks via Splunk, creating an approval task in ServiceNow, and notifying the operations team via Microsoft Teams.
naftiko: "0.5"
info:
label: "Wire Transfer Approval Orchestrator"
description: "Processes wire transfer requests by validating the account in the core banking system, running fraud checks via Splunk, creating an approval task in ServiceNow, and notifying the operations team via Microsoft Teams."
tags:
- wire-transfer
- fraud-detection
- splunk
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: wire-transfers
port: 8080
tools:
- name: process-wire-transfer
description: "Orchestrate wire transfer approval across banking system, Splunk, ServiceNow, and Teams."
inputParameters:
- name: account_id
in: body
type: string
description: "Source account ID."
- name: amount
in: body
type: number
description: "Wire transfer amount."
- name: beneficiary_bank
in: body
type: string
description: "Beneficiary bank routing number."
steps:
- name: validate-account
type: call
call: "banking.validate-wire"
with:
account_id: "{{account_id}}"
amount: "{{amount}}"
- name: fraud-check
type: call
call: "splunk.search"
with:
query: "index=fraud_alerts account_id={{account_id}} earliest=-30d | stats count as fraud_count"
- name: create-approval
type: call
call: "servicenow.create-change"
with:
short_description: "Wire transfer: {{account_id}} - ${{amount}}"
category: "wire_transfer"
assigned_group: "Wire_Operations"
description: "Amount: ${{amount}}\nBeneficiary bank: {{beneficiary_bank}}\nFraud alerts (30d): {{fraud-check.fraud_count}}\nAccount status: {{validate-account.status}}"
- name: notify-ops
type: call
call: "msteams.send-channel-message"
with:
team_id: "operations"
channel: "wire-transfers"
text: "Wire transfer pending: {{account_id}}, ${{amount}}. Approval: {{create-approval.number}}. Fraud alerts: {{fraud-check.fraud_count}}."
consumes:
- type: http
namespace: banking
baseUri: "https://core-banking.schwab.com/api/v2"
authentication:
type: bearer
token: "$secrets.banking_api_token"
resources:
- name: wires
path: "/wire-validation"
operations:
- name: validate-wire
method: POST
- type: http
namespace: splunk
baseUri: "https://splunk.schwab.com:8089/services"
authentication:
type: bearer
token: "$secrets.splunk_token"
resources:
- name: search
path: "/search/jobs"
operations:
- name: search
method: POST
- type: http
namespace: servicenow
baseUri: "https://schwab.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: changes
path: "/table/change_request"
operations:
- name: create-change
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{team_id}}/channels/{{channel}}/messages"
inputParameters:
- name: team_id
in: path
- name: channel
in: path
operations:
- name: send-channel-message
method: POST
Searches the Workday employee directory for financial advisors and support staff.
naftiko: "0.5"
info:
label: "Workday Employee Directory"
description: "Searches the Workday employee directory for financial advisors and support staff."
tags:
- hr
- directory
- workday
capability:
exposes:
- type: mcp
namespace: hr-directory
port: 8080
tools:
- name: search-employees
description: "Search for employees in Workday."
inputParameters:
- name: search_term
in: body
type: string
description: "Search term."
call: "workday.search-workers"
with:
search: "{{search_term}}"
outputParameters:
- name: employees
type: array
mapping: "$.workers"
- name: total_count
type: integer
mapping: "$.total"
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"
operations:
- name: search-workers
method: GET
On new hire in Workday, provisions IT access via ServiceNow, creates a SharePoint folder, and sends a Teams welcome.
naftiko: "0.5"
info:
label: "Workday Employee Onboarding Pipeline"
description: "On new hire in Workday, provisions IT access via ServiceNow, creates a SharePoint folder, and sends a Teams welcome."
tags:
- hr
- onboarding
- workday
- servicenow
- microsoft-teams
capability:
exposes:
- type: mcp
namespace: hr-onboarding
port: 8080
tools:
- name: trigger-onboarding
description: "Orchestrate employee onboarding across Workday, ServiceNow, and Teams."
inputParameters:
- name: workday_employee_id
in: body
type: string
description: "Workday worker ID."
- name: start_date
in: body
type: string
description: "Start date."
- name: department
in: body
type: string
description: "Department."
steps:
- name: get-employee
type: call
call: "workday.get-worker"
with:
worker_id: "{{workday_employee_id}}"
- name: create-it-ticket
type: call
call: "servicenow.create-incident"
with:
short_description: "IT onboarding: {{get-employee.full_name}}"
category: "onboarding"
assigned_group: "IT_Provisioning"
description: "Provision workstation, trading system access, and compliance training for {{get-employee.full_name}} starting {{start_date}} in {{department}}."
- name: send-welcome
type: call
call: "msteams.send-message"
with:
channel_id: "{{department}}_team"
text: "Welcome to Schwab, {{get-employee.first_name}}! IT ticket: {{create-it-ticket.number}}."
consumes:
- type: http
namespace: workday
baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
authentication:
type: bearer
token: "$secrets.workday_token"
resources:
- name: workers
path: "/workers/{{worker_id}}"
inputParameters:
- name: worker_id
in: path
operations:
- name: get-worker
method: GET
- type: http
namespace: servicenow
baseUri: "https://schwab.service-now.com/api/now"
authentication:
type: basic
username: "$secrets.servicenow_user"
password: "$secrets.servicenow_password"
resources:
- name: incidents
path: "/table/incident"
operations:
- name: create-incident
method: POST
- type: http
namespace: msteams
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: channel-messages
path: "/teams/{{channel_id}}/channels/general/messages"
inputParameters:
- name: channel_id
in: path
operations:
- name: send-message
method: POST
Creates a Zoom meeting for a client-advisor consultation and sends calendar invites.
naftiko: "0.5"
info:
label: "Zoom Client Consultation Scheduler"
description: "Creates a Zoom meeting for a client-advisor consultation and sends calendar invites."
tags:
- client-services
- meetings
- zoom
- microsoft-outlook
capability:
exposes:
- type: mcp
namespace: client-meetings
port: 8080
tools:
- name: schedule-consultation
description: "Create a Zoom meeting for a client consultation and send Outlook invites."
inputParameters:
- name: client_name
in: body
type: string
description: "Client name."
- name: advisor_email
in: body
type: string
description: "Advisor email."
- name: client_email
in: body
type: string
description: "Client email."
- name: date_time
in: body
type: string
description: "Meeting date/time in ISO 8601."
- name: topic
in: body
type: string
description: "Meeting topic."
steps:
- name: create-meeting
type: call
call: "zoom.create-meeting"
with:
topic: "{{topic}} - {{client_name}}"
start_time: "{{date_time}}"
duration: 60
type: 2
- name: send-invite
type: call
call: "outlook.create-event"
with:
subject: "{{topic}} - {{client_name}}"
start_time: "{{date_time}}"
body: "Join Zoom: {{create-meeting.join_url}}"
attendees: "{{advisor_email}},{{client_email}}"
consumes:
- type: http
namespace: zoom
baseUri: "https://api.zoom.us/v2"
authentication:
type: bearer
token: "$secrets.zoom_token"
resources:
- name: meetings
path: "/users/me/meetings"
operations:
- name: create-meeting
method: POST
- type: http
namespace: outlook
baseUri: "https://graph.microsoft.com/v1.0"
authentication:
type: bearer
token: "$secrets.msgraph_token"
resources:
- name: events
path: "/me/events"
operations:
- name: create-event
method: POST