Morgan Stanley Capabilities

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

Sort
Expand

Compares ADP payroll run totals against Snowflake budget forecasts, creates a ServiceNow task for finance review if variance exceeds threshold, and notifies via Teams.

naftiko: "0.5"
info:
  label: "ADP Payroll Variance Alert"
  description: "Compares ADP payroll run totals against Snowflake budget forecasts, creates a ServiceNow task for finance review if variance exceeds threshold, and notifies via Teams."
  tags:
    - finance
    - payroll
    - adp
    - snowflake
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: payroll-variance
      port: 8080
      tools:
        - name: check-payroll-variance
          description: "Given a payroll period, compare ADP actuals against Snowflake budget and alert if variance exceeds threshold."
          inputParameters:
            - name: payroll_period
              in: body
              type: string
              description: "Payroll period identifier (e.g., 2026-03)."
            - name: variance_threshold
              in: body
              type: number
              description: "Percentage variance threshold."
          steps:
            - name: get-budget-forecast
              type: call
              call: "snowflake-payroll.execute-query"
              with:
                statement: "SELECT department, budgeted_amount, actual_amount, ((actual_amount - budgeted_amount)/budgeted_amount * 100) as variance_pct FROM finance.payroll_budget WHERE period = '{{payroll_period}}' AND ABS(variance_pct) > {{variance_threshold}}"
            - name: create-review-task
              type: call
              call: "snow-finance.create-task"
              with:
                short_description: "Payroll variance alert: {{payroll_period}}"
                description: "Departments exceeding {{variance_threshold}}% variance threshold identified."
                assignment_group: "Finance_Payroll"
            - name: notify-finance
              type: call
              call: "teams-payroll.send-message"
              with:
                channel_id: "$secrets.finance_teams_channel"
                text: "Payroll Variance Alert: Period {{payroll_period}} has departments exceeding {{variance_threshold}}% variance. ServiceNow: {{create-review-task.number}}"
  consumes:
    - type: http
      namespace: snowflake-payroll
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: snow-finance
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: teams-payroll
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.finance_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Fetches a compliance document from SharePoint, sends it to Anthropic Claude for risk clause identification, logs flagged clauses to Snowflake, and posts a review summary to the Legal Compliance Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Anthropic AI Compliance Document Review"
  description: "Fetches a compliance document from SharePoint, sends it to Anthropic Claude for risk clause identification, logs flagged clauses to Snowflake, and posts a review summary to the Legal Compliance Microsoft Teams channel."
  tags:
    - ai
    - compliance
    - anthropic
    - sharepoint
    - snowflake
    - microsoft-teams
    - document-review
capability:
  exposes:
    - type: mcp
      namespace: ai-compliance-review
      port: 8080
      tools:
        - name: review-compliance-document
          description: "Given a SharePoint document ID for a compliance document, extract text content, send to Anthropic Claude for risk clause detection, log findings to Snowflake, and post the review summary to the LegalCompliance Teams channel."
          inputParameters:
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID where the compliance document is stored."
            - name: document_item_id
              in: body
              type: string
              description: "SharePoint drive item ID of the compliance document to review."
            - name: regulation_context
              in: body
              type: string
              description: "Regulatory context to frame the review, e.g. 'MiFID II', 'GDPR', 'SEC Rule 17a-4'."
          steps:
            - name: fetch-document
              type: call
              call: "sharepoint-legal.get-file-content"
              with:
                site_id: "{{sharepoint_site_id}}"
                item_id: "{{document_item_id}}"
            - name: ai-review
              type: call
              call: "anthropic-review.create-message"
              with:
                model: "claude-opus-4-5"
                content: "Review the following document for compliance risk clauses under {{regulation_context}}: {{fetch-document.text_content}}"
            - name: log-findings
              type: call
              call: "snowflake-legal.insert-record"
              with:
                table: "COMPLIANCE.AI_DOCUMENT_REVIEWS"
                document_id: "{{document_item_id}}"
                regulation: "{{regulation_context}}"
                risk_clauses: "{{ai-review.content}}"
            - name: notify-legal
              type: call
              call: "msteams-legal.post-channel-message"
              with:
                channel_id: "LegalCompliance"
                text: "AI compliance review complete for document {{document_item_id}} under {{regulation_context}}. Risk clauses identified and logged to Snowflake."
  consumes:
    - type: http
      namespace: sharepoint-legal
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: file-content
          path: "/sites/{{site_id}}/drive/items/{{item_id}}/content"
          inputParameters:
            - name: site_id
              in: path
            - name: item_id
              in: path
          operations:
            - name: get-file-content
              method: GET
    - type: http
      namespace: anthropic-review
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: snowflake-legal
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: msteams-legal
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Generates personalized client communication drafts using Anthropic Claude based on Salesforce relationship data, stores in Confluence for review, and notifies the advisor via Slack.

naftiko: "0.5"
info:
  label: "Anthropic Client Communication Draft"
  description: "Generates personalized client communication drafts using Anthropic Claude based on Salesforce relationship data, stores in Confluence for review, and notifies the advisor via Slack."
  tags:
    - client-management
    - ai-content
    - anthropic
    - salesforce
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: client-comms
      port: 8080
      tools:
        - name: draft-client-communication
          description: "Given a Salesforce account ID and communication purpose, draft a personalized message using Claude."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID."
            - name: purpose
              in: body
              type: string
              description: "Communication purpose (e.g., quarterly review, market update, birthday)."
          steps:
            - name: get-client-data
              type: call
              call: "sfdc-comms.get-account"
              with:
                id: "{{account_id}}"
            - name: generate-draft
              type: call
              call: "anthropic-comms.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                content: "Draft a professional {{purpose}} communication for client {{get-client-data.name}} ({{get-client-data.industry}}). Relationship manager: {{get-client-data.owner_name}}. Keep it warm, professional, and concise."
            - name: store-draft
              type: call
              call: "confluence-comms.create-page"
              with:
                space: "CLIENT"
                title: "Draft: {{purpose}} - {{get-client-data.name}}"
                body: "{{generate-draft.text}}"
            - name: notify-advisor
              type: call
              call: "slack-comms.post-message"
              with:
                channel: "$secrets.advisors_slack_channel"
                text: "Client communication draft ready: {{purpose}} for {{get-client-data.name}}. Review in Confluence: {{store-draft.url}}"
  consumes:
    - type: http
      namespace: sfdc-comms
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: anthropic-comms
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: confluence-comms
      baseUri: "https://morganstanley.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: slack-comms
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Submits a regulatory document to Anthropic Claude for summarization, stores the summary in Confluence, and notifies the compliance team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Anthropic Regulatory Document Summarization"
  description: "Submits a regulatory document to Anthropic Claude for summarization, stores the summary in Confluence, and notifies the compliance team via Microsoft Teams."
  tags:
    - compliance
    - ai
    - anthropic
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: reg-doc-summary
      port: 8080
      tools:
        - name: summarize-regulatory-document
          description: "Given a Confluence page ID containing a regulatory document, generate an AI summary and notify the compliance team."
          inputParameters:
            - name: source_page_id
              in: body
              type: string
              description: "Confluence page ID of the regulatory document."
            - name: target_space
              in: body
              type: string
              description: "Confluence space key to store the summary."
          steps:
            - name: get-document
              type: call
              call: "confluence-reg.get-page"
              with:
                page_id: "{{source_page_id}}"
            - name: generate-summary
              type: call
              call: "anthropic-reg.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                content: "Summarize the following regulatory document in 3-5 key points, highlighting compliance requirements and deadlines: {{get-document.body}}"
            - name: store-summary
              type: call
              call: "confluence-reg.create-page"
              with:
                space: "{{target_space}}"
                title: "Summary: {{get-document.title}}"
                body: "{{generate-summary.text}}"
            - name: notify-compliance
              type: call
              call: "teams-compliance.send-message"
              with:
                channel_id: "$secrets.compliance_teams_channel"
                text: "New regulatory summary available: {{get-document.title}}. View: {{store-summary.url}}"
  consumes:
    - type: http
      namespace: confluence-reg
      baseUri: "https://morganstanley.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}?expand=body.storage"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET
        - name: new-pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: anthropic-reg
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: teams-compliance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.compliance_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Screens high-value transactions against sanctions lists via Refinitiv World-Check, creates a compliance case in ServiceNow if flagged, and logs results to Snowflake for audit trail.

naftiko: "0.5"
info:
  label: "Anti-Money Laundering Transaction Screening"
  description: "Screens high-value transactions against sanctions lists via Refinitiv World-Check, creates a compliance case in ServiceNow if flagged, and logs results to Snowflake for audit trail."
  tags:
    - compliance
    - aml
    - refinitiv
    - servicenow
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: aml-screening
      port: 8080
      tools:
        - name: screen-transaction
          description: "Given a transaction ID, counterparty name, and amount, screen against sanctions lists and create a compliance case if flagged."
          inputParameters:
            - name: transaction_id
              in: body
              type: string
              description: "Internal transaction reference ID."
            - name: counterparty_name
              in: body
              type: string
              description: "Name of the transaction counterparty."
            - name: amount
              in: body
              type: number
              description: "Transaction amount in USD."
          steps:
            - name: sanctions-check
              type: call
              call: "refinitiv-aml.search-entity"
              with:
                name: "{{counterparty_name}}"
                entity_type: "organization"
            - name: create-compliance-case
              type: call
              call: "snow-compliance.create-case"
              with:
                short_description: "AML screening alert: {{counterparty_name}} - ${{amount}}"
                description: "Transaction: {{transaction_id}}\nMatch count: {{sanctions-check.match_count}}\nRisk score: {{sanctions-check.risk_score}}"
                assignment_group: "AML_Compliance"
            - name: log-screening-result
              type: call
              call: "snowflake-aml.insert-record"
              with:
                table: "COMPLIANCE.AML_SCREENINGS"
                transaction_id: "{{transaction_id}}"
                counterparty: "{{counterparty_name}}"
                risk_score: "{{sanctions-check.risk_score}}"
                case_number: "{{create-compliance-case.number}}"
  consumes:
    - type: http
      namespace: refinitiv-aml
      baseUri: "https://api.thomsonreuters.com/worldcheck/v1"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: entities
          path: "/entities/search"
          operations:
            - name: search-entity
              method: POST
    - type: http
      namespace: snow-compliance
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_compliance_case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: snowflake-aml
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

Validates a deployment release in Azure DevOps, checks SonarQube quality gate status, and posts approval request to the release management Slack channel.

naftiko: "0.5"
info:
  label: "Azure DevOps Deployment Approval Gate"
  description: "Validates a deployment release in Azure DevOps, checks SonarQube quality gate status, and posts approval request to the release management Slack channel."
  tags:
    - devops
    - deployment
    - azure-devops
    - sonarqube
    - slack
capability:
  exposes:
    - type: mcp
      namespace: deploy-gate
      port: 8080
      tools:
        - name: validate-deployment
          description: "Given an Azure DevOps release ID and project, check quality gates and post approval request to Slack."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "Azure DevOps project name."
            - name: release_id
              in: body
              type: string
              description: "Azure DevOps release ID."
          steps:
            - name: get-release
              type: call
              call: "azdo-release.get-release"
              with:
                project: "{{project}}"
                release_id: "{{release_id}}"
            - name: check-quality-gate
              type: call
              call: "sonarqube-api.get-quality-gate"
              with:
                project_key: "{{get-release.artifact_source}}"
            - name: post-approval-request
              type: call
              call: "slack-release.post-message"
              with:
                channel: "$secrets.release_mgmt_channel"
                text: "Deployment approval needed: {{project}} release {{release_id}}\nQuality Gate: {{check-quality-gate.status}}\nArtifact: {{get-release.artifact_version}}"
  consumes:
    - type: http
      namespace: azdo-release
      baseUri: "https://vsrm.dev.azure.com/morganstanley"
      authentication:
        type: bearer
        token: "$secrets.azdo_pat"
      resources:
        - name: releases
          path: "/{{project}}/_apis/release/releases/{{release_id}}"
          inputParameters:
            - name: project
              in: path
            - name: release_id
              in: path
          operations:
            - name: get-release
              method: GET
    - type: http
      namespace: sonarqube-api
      baseUri: "https://sonarqube.morganstanley.com/api"
      authentication:
        type: bearer
        token: "$secrets.sonarqube_token"
      resources:
        - name: quality-gates
          path: "/qualitygates/project_status"
          inputParameters:
            - name: project_key
              in: query
          operations:
            - name: get-quality-gate
              method: GET
    - type: http
      namespace: slack-release
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks the health status of an Azure resource, returning availability state and any active service issues affecting Morgan Stanley cloud infrastructure.

naftiko: "0.5"
info:
  label: "Azure Resource Health Check"
  description: "Checks the health status of an Azure resource, returning availability state and any active service issues affecting Morgan Stanley cloud infrastructure."
  tags:
    - cloud
    - infrastructure
    - microsoft-azure
capability:
  exposes:
    - type: mcp
      namespace: azure-health
      port: 8080
      tools:
        - name: check-resource-health
          description: "Given an Azure resource ID, return its current availability status and any recent health events."
          inputParameters:
            - name: resource_id
              in: body
              type: string
              description: "Full Azure resource ID."
          call: "azure-api.get-health"
          with:
            resource_id: "{{resource_id}}"
          outputParameters:
            - name: availability_state
              type: string
              mapping: "$.properties.availabilityState"
  consumes:
    - type: http
      namespace: azure-api
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: health
          path: "/{{resource_id}}/providers/Microsoft.ResourceHealth/availabilityStatuses/current"
          inputParameters:
            - name: resource_id
              in: path
          operations:
            - name: get-health
              method: GET

Pulls credit ratings from Bloomberg, calculates exposure metrics in Snowflake, and generates a risk assessment summary stored in Confluence for the credit committee.

naftiko: "0.5"
info:
  label: "Bloomberg Credit Risk Assessment Workflow"
  description: "Pulls credit ratings from Bloomberg, calculates exposure metrics in Snowflake, and generates a risk assessment summary stored in Confluence for the credit committee."
  tags:
    - risk-management
    - credit
    - bloomberg
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: credit-risk
      port: 8080
      tools:
        - name: assess-credit-risk
          description: "Given a counterparty identifier, pull credit data and generate a risk assessment."
          inputParameters:
            - name: counterparty_id
              in: body
              type: string
              description: "Counterparty identifier."
          steps:
            - name: get-credit-ratings
              type: call
              call: "bloomberg-cr.get-ratings"
              with:
                entity: "{{counterparty_id}}"
            - name: calculate-exposure
              type: call
              call: "snowflake-cr.execute-query"
              with:
                statement: "SELECT total_exposure, net_exposure, collateral_value FROM risk.counterparty_exposure WHERE counterparty_id = '{{counterparty_id}}'"
            - name: publish-assessment
              type: call
              call: "confluence-cr.create-page"
              with:
                space: "CREDIT"
                title: "Credit Assessment: {{counterparty_id}}"
                body: "Rating: {{get-credit-ratings.rating}}\nTotal Exposure: {{calculate-exposure.total_exposure}}\nNet Exposure: {{calculate-exposure.net_exposure}}"
  consumes:
    - type: http
      namespace: bloomberg-cr
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_api_token"
      resources:
        - name: ratings
          path: "/credit-ratings/{{entity}}"
          inputParameters:
            - name: entity
              in: path
          operations:
            - name: get-ratings
              method: GET
    - type: http
      namespace: snowflake-cr
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: confluence-cr
      baseUri: "https://morganstanley.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Pulls end-of-day market summary data from Bloomberg, formats a digest using Anthropic Claude, and distributes to trading desks via Slack and Microsoft Teams.

naftiko: "0.5"
info:
  label: "Bloomberg EOD Market Summary Distribution"
  description: "Pulls end-of-day market summary data from Bloomberg, formats a digest using Anthropic Claude, and distributes to trading desks via Slack and Microsoft Teams."
  tags:
    - trading
    - market-data
    - bloomberg
    - anthropic
    - slack
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: eod-summary
      port: 8080
      tools:
        - name: distribute-eod-summary
          description: "Generate and distribute an end-of-day market summary to trading desks."
          inputParameters:
            - name: market_date
              in: body
              type: string
              description: "Market date in YYYY-MM-DD format."
          steps:
            - name: get-market-data
              type: call
              call: "bloomberg-eod.get-summary"
              with:
                date: "{{market_date}}"
            - name: format-digest
              type: call
              call: "anthropic-eod.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                content: "Format a concise end-of-day market summary for {{market_date}}: {{get-market-data.summary}}. Include key index moves, notable sector performance, and overnight outlook."
            - name: post-to-slack
              type: call
              call: "slack-eod.post-message"
              with:
                channel: "$secrets.trading_slack_channel"
                text: "EOD Market Summary - {{market_date}}\n\n{{format-digest.text}}"
  consumes:
    - type: http
      namespace: bloomberg-eod
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_api_token"
      resources:
        - name: summaries
          path: "/market-summary/{{date}}"
          inputParameters:
            - name: date
              in: path
          operations:
            - name: get-summary
              method: GET
    - type: http
      namespace: anthropic-eod
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: slack-eod
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves real-time market data for a given security ticker from Bloomberg Enterprise Data, returning price, volume, and change metrics for trading desk review.

naftiko: "0.5"
info:
  label: "Bloomberg Market Data Lookup"
  description: "Retrieves real-time market data for a given security ticker from Bloomberg Enterprise Data, returning price, volume, and change metrics for trading desk review."
  tags:
    - trading
    - market-data
    - bloomberg
capability:
  exposes:
    - type: mcp
      namespace: market-data
      port: 8080
      tools:
        - name: get-security-quote
          description: "Given a Bloomberg security ticker, return current price, daily change, volume, and 52-week range. Use for pre-trade analysis or portfolio monitoring."
          inputParameters:
            - name: ticker
              in: body
              type: string
              description: "Bloomberg security ticker symbol."
          call: "bloomberg-data.get-quote"
          with:
            security: "{{ticker}}"
          outputParameters:
            - name: last_price
              type: string
              mapping: "$.last_price"
            - name: daily_change
              type: string
              mapping: "$.daily_change_pct"
            - name: volume
              type: string
              mapping: "$.volume"
  consumes:
    - type: http
      namespace: bloomberg-data
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_api_token"
      resources:
        - name: quotes
          path: "/quotes/{{security}}"
          inputParameters:
            - name: security
              in: path
          operations:
            - name: get-quote
              method: GET

Logs completed trade executions from Bloomberg AIM to Snowflake for post-trade analytics and generates a Slack summary notification for the trading desk.

naftiko: "0.5"
info:
  label: "Bloomberg Terminal Trade Execution Log"
  description: "Logs completed trade executions from Bloomberg AIM to Snowflake for post-trade analytics and generates a Slack summary notification for the trading desk."
  tags:
    - trading
    - post-trade
    - bloomberg
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: trade-logging
      port: 8080
      tools:
        - name: log-trade-execution
          description: "Given a Bloomberg trade reference, log execution details to Snowflake and send a Slack summary to the trading desk channel."
          inputParameters:
            - name: trade_ref
              in: body
              type: string
              description: "Bloomberg AIM trade reference ID."
            - name: desk_channel
              in: body
              type: string
              description: "Slack channel ID for the trading desk."
          steps:
            - name: get-trade-details
              type: call
              call: "bloomberg-trade.get-execution"
              with:
                reference: "{{trade_ref}}"
            - name: log-to-snowflake
              type: call
              call: "snowflake-trade.insert-record"
              with:
                table: "TRADING.EXECUTIONS"
                trade_ref: "{{trade_ref}}"
                security: "{{get-trade-details.security}}"
                quantity: "{{get-trade-details.quantity}}"
                price: "{{get-trade-details.execution_price}}"
            - name: notify-desk
              type: call
              call: "slack-trade.post-message"
              with:
                channel: "{{desk_channel}}"
                text: "Trade executed: {{get-trade-details.security}} | Qty: {{get-trade-details.quantity}} @ {{get-trade-details.execution_price}} | Ref: {{trade_ref}}"
  consumes:
    - type: http
      namespace: bloomberg-trade
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_api_token"
      resources:
        - name: executions
          path: "/executions/{{reference}}"
          inputParameters:
            - name: reference
              in: path
          operations:
            - name: get-execution
              method: GET
    - type: http
      namespace: snowflake-trade
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: slack-trade
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a document is uploaded to Box, uses Anthropic Claude to classify it, applies retention labels, and logs the classification to Snowflake for compliance tracking.

naftiko: "0.5"
info:
  label: "Box Document Classification Workflow"
  description: "When a document is uploaded to Box, uses Anthropic Claude to classify it, applies retention labels, and logs the classification to Snowflake for compliance tracking."
  tags:
    - document-management
    - classification
    - box
    - anthropic
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: doc-classification
      port: 8080
      tools:
        - name: classify-document
          description: "Given a Box file ID, classify the document using Claude and log the classification to Snowflake."
          inputParameters:
            - name: file_id
              in: body
              type: string
              description: "Box file ID to classify."
          steps:
            - name: get-file-content
              type: call
              call: "box-api.get-file"
              with:
                file_id: "{{file_id}}"
            - name: classify-with-ai
              type: call
              call: "anthropic-cls.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                content: "Classify this document into one of: Client Agreement, Regulatory Filing, Internal Memo, Research Report, Trade Confirmation. Document: {{get-file-content.text_representation}}"
            - name: log-classification
              type: call
              call: "snowflake-cls.insert-record"
              with:
                table: "COMPLIANCE.DOCUMENT_CLASSIFICATIONS"
                file_id: "{{file_id}}"
                classification: "{{classify-with-ai.text}}"
                file_name: "{{get-file-content.name}}"
  consumes:
    - type: http
      namespace: box-api
      baseUri: "https://api.box.com/2.0"
      authentication:
        type: bearer
        token: "$secrets.box_token"
      resources:
        - name: files
          path: "/files/{{file_id}}"
          inputParameters:
            - name: file_id
              in: path
          operations:
            - name: get-file
              method: GET
    - type: http
      namespace: anthropic-cls
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: snowflake-cls
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

Orchestrates new client account opening by creating a Salesforce account record, initiating KYC screening via Refinitiv, and opening a ServiceNow onboarding task.

naftiko: "0.5"
info:
  label: "Client Account Opening Workflow"
  description: "Orchestrates new client account opening by creating a Salesforce account record, initiating KYC screening via Refinitiv, and opening a ServiceNow onboarding task."
  tags:
    - client-onboarding
    - account-opening
    - salesforce
    - refinitiv
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: account-opening
      port: 8080
      tools:
        - name: open-client-account
          description: "Given client details, create a Salesforce account, run KYC screening, and open a ServiceNow onboarding task."
          inputParameters:
            - name: client_name
              in: body
              type: string
              description: "Full legal name of the client."
            - name: entity_type
              in: body
              type: string
              description: "Entity type: individual or organization."
            - name: country
              in: body
              type: string
              description: "ISO country code for the client."
          steps:
            - name: create-sfdc-account
              type: call
              call: "sfdc-onboard.create-account"
              with:
                name: "{{client_name}}"
                type: "{{entity_type}}"
                country: "{{country}}"
            - name: run-kyc
              type: call
              call: "refinitiv-onboard.screen-entity"
              with:
                name: "{{client_name}}"
                entity_type: "{{entity_type}}"
            - name: open-onboarding-task
              type: call
              call: "snow-onboard.create-task"
              with:
                short_description: "Account onboarding: {{client_name}}"
                description: "Salesforce Account: {{create-sfdc-account.id}}\nKYC Risk Score: {{run-kyc.risk_score}}"
                assignment_group: "Client_Onboarding"
  consumes:
    - type: http
      namespace: sfdc-onboard
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account"
          operations:
            - name: create-account
              method: POST
    - type: http
      namespace: refinitiv-onboard
      baseUri: "https://api.thomsonreuters.com/worldcheck/v1"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: screening
          path: "/entities/search"
          operations:
            - name: screen-entity
              method: POST
    - type: http
      namespace: snow-onboard
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Creates a DocuSign envelope for required client documents, tracks collection status in Salesforce, and sends follow-up reminders via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Client Document Collection Workflow"
  description: "Creates a DocuSign envelope for required client documents, tracks collection status in Salesforce, and sends follow-up reminders via Microsoft Teams."
  tags:
    - client-onboarding
    - document-management
    - docusign
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: doc-collection
      port: 8080
      tools:
        - name: initiate-document-collection
          description: "Given a Salesforce opportunity ID and document template, create a DocuSign envelope and track in Salesforce."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
            - name: template_id
              in: body
              type: string
              description: "DocuSign template ID for required documents."
            - name: client_email
              in: body
              type: string
              description: "Client email address for signing."
          steps:
            - name: get-opportunity
              type: call
              call: "sfdc-doc.get-opportunity"
              with:
                opp_id: "{{opportunity_id}}"
            - name: create-envelope
              type: call
              call: "docusign-doc.create-envelope"
              with:
                template_id: "{{template_id}}"
                signer_email: "{{client_email}}"
                signer_name: "{{get-opportunity.contact_name}}"
            - name: update-opportunity
              type: call
              call: "sfdc-doc.update-opportunity"
              with:
                opp_id: "{{opportunity_id}}"
                envelope_id: "{{create-envelope.envelopeId}}"
                doc_status: "Sent"
  consumes:
    - type: http
      namespace: sfdc-doc
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
            - name: update-opportunity
              method: PATCH
    - type: http
      namespace: docusign-doc
      baseUri: "https://na4.docusign.net/restapi/v2.1"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/accounts/default/envelopes"
          operations:
            - name: create-envelope
              method: POST

When a Snowflake portfolio drift query exceeds threshold, creates a Salesforce task for the financial advisor and sends a Microsoft Teams notification with rebalance recommendations.

naftiko: "0.5"
info:
  label: "Client Portfolio Rebalance Notification"
  description: "When a Snowflake portfolio drift query exceeds threshold, creates a Salesforce task for the financial advisor and sends a Microsoft Teams notification with rebalance recommendations."
  tags:
    - wealth-management
    - portfolio
    - snowflake
    - salesforce
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: portfolio-rebalance
      port: 8080
      tools:
        - name: trigger-rebalance-alert
          description: "Given a client account ID and drift threshold, query Snowflake for portfolio drift, create a Salesforce task, and notify the advisor via Teams."
          inputParameters:
            - name: client_account_id
              in: body
              type: string
              description: "Client portfolio account identifier."
            - name: drift_threshold
              in: body
              type: number
              description: "Percentage drift threshold that triggers the alert."
          steps:
            - name: check-drift
              type: call
              call: "snowflake-portfolio.execute-query"
              with:
                statement: "SELECT asset_class, target_pct, actual_pct, (actual_pct - target_pct) AS drift FROM wealth.portfolio_allocations WHERE account_id = '{{client_account_id}}' AND ABS(actual_pct - target_pct) > {{drift_threshold}}"
            - name: create-advisor-task
              type: call
              call: "sfdc-task.create-task"
              with:
                subject: "Portfolio rebalance required: {{client_account_id}}"
                description: "Drift detected exceeding {{drift_threshold}}% threshold. Review allocation changes."
                priority: "High"
            - name: notify-advisor
              type: call
              call: "teams-notify.send-message"
              with:
                recipient_upn: "{{create-advisor-task.owner_email}}"
                text: "Portfolio drift alert for account {{client_account_id}}. Salesforce task: {{create-advisor-task.task_id}}"
  consumes:
    - type: http
      namespace: snowflake-portfolio
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sfdc-task
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: teams-notify
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: chat-messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Fetches the title and body content of a Confluence wiki page by ID, supporting knowledge base lookups and document review workflows.

naftiko: "0.5"
info:
  label: "Confluence Page Content Retrieval"
  description: "Fetches the title and body content of a Confluence wiki page by ID, supporting knowledge base lookups and document review workflows."
  tags:
    - documentation
    - knowledge-management
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: wiki-content
      port: 8080
      tools:
        - name: get-page-content
          description: "Given a Confluence page ID, return the page title, body content, and last modified date."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "Confluence page ID."
          call: "confluence-api.get-page"
          with:
            id: "{{page_id}}"
          outputParameters:
            - name: title
              type: string
              mapping: "$.title"
            - name: body
              type: string
              mapping: "$.body.storage.value"
  consumes:
    - type: http
      namespace: confluence-api
      baseUri: "https://morganstanley.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{id}}?expand=body.storage"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-page
              method: GET

Retrieves operational runbook steps from Confluence, validates preconditions via Datadog health checks, and logs execution results to ServiceNow.

naftiko: "0.5"
info:
  label: "Confluence Runbook Automated Execution"
  description: "Retrieves operational runbook steps from Confluence, validates preconditions via Datadog health checks, and logs execution results to ServiceNow."
  tags:
    - operations
    - runbooks
    - confluence
    - datadog
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: runbook-exec
      port: 8080
      tools:
        - name: execute-runbook
          description: "Given a Confluence runbook page ID, validate preconditions and log execution results."
          inputParameters:
            - name: runbook_page_id
              in: body
              type: string
              description: "Confluence runbook page ID."
            - name: service_name
              in: body
              type: string
              description: "Target service for runbook execution."
          steps:
            - name: get-runbook
              type: call
              call: "confluence-rb.get-page"
              with:
                page_id: "{{runbook_page_id}}"
            - name: check-preconditions
              type: call
              call: "datadog-rb.get-service-health"
              with:
                service: "{{service_name}}"
            - name: log-execution
              type: call
              call: "snow-rb.create-record"
              with:
                short_description: "Runbook executed: {{get-runbook.title}}"
                description: "Service: {{service_name}}\nPrecondition check: {{check-preconditions.overall_state}}"
  consumes:
    - type: http
      namespace: confluence-rb
      baseUri: "https://morganstanley.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content/{{page_id}}?expand=body.storage"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET
    - type: http
      namespace: datadog-rb
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: services
          path: "/service_level_objectives"
          operations:
            - name: get-service-health
              method: GET
    - type: http
      namespace: snow-rb
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: records
          path: "/table/change_request"
          operations:
            - name: create-record
              method: POST

Routes Coupa purchase orders exceeding budget thresholds through ServiceNow approval and notifies the budget owner via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Coupa Purchase Order Approval Workflow"
  description: "Routes Coupa purchase orders exceeding budget thresholds through ServiceNow approval and notifies the budget owner via Microsoft Teams."
  tags:
    - procurement
    - approvals
    - coupa
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: po-approval
      port: 8080
      tools:
        - name: route-po-approval
          description: "Given a Coupa PO number, retrieve details, create a ServiceNow approval, and notify the budget owner."
          inputParameters:
            - name: po_number
              in: body
              type: string
              description: "Coupa purchase order number."
          steps:
            - name: get-po-details
              type: call
              call: "coupa-api.get-po"
              with:
                po_number: "{{po_number}}"
            - name: create-approval
              type: call
              call: "snow-procurement.create-approval"
              with:
                short_description: "PO Approval: {{po_number}} - ${{get-po-details.total_amount}}"
                description: "Supplier: {{get-po-details.supplier_name}}\nAmount: ${{get-po-details.total_amount}}\nCost Center: {{get-po-details.cost_center}}"
            - name: notify-budget-owner
              type: call
              call: "teams-procurement.send-message"
              with:
                recipient_upn: "{{get-po-details.budget_owner_email}}"
                text: "PO {{po_number}} (${{get-po-details.total_amount}}) from {{get-po-details.supplier_name}} requires your approval. ServiceNow: {{create-approval.number}}"
  consumes:
    - type: http
      namespace: coupa-api
      baseUri: "https://morganstanley.coupahost.com/api"
      authentication:
        type: apikey
        key: "X-COUPA-API-KEY"
        value: "$secrets.coupa_api_key"
        placement: header
      resources:
        - name: purchase-orders
          path: "/purchase_orders/{{po_number}}"
          inputParameters:
            - name: po_number
              in: path
          operations:
            - name: get-po
              method: GET
    - type: http
      namespace: snow-procurement
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: approvals
          path: "/table/sysapproval_approver"
          operations:
            - name: create-approval
              method: POST
    - type: http
      namespace: teams-procurement
      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 ML model deployment status from Databricks, logs the deployment to Snowflake model registry, and notifies the data science team via Slack.

naftiko: "0.5"
info:
  label: "Databricks ML Model Deployment Notification"
  description: "Retrieves ML model deployment status from Databricks, logs the deployment to Snowflake model registry, and notifies the data science team via Slack."
  tags:
    - data-science
    - ml-ops
    - databricks
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: ml-deploy
      port: 8080
      tools:
        - name: log-model-deployment
          description: "Given a Databricks model name and version, log deployment to Snowflake and notify the data science Slack channel."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "Databricks registered model name."
            - name: model_version
              in: body
              type: string
              description: "Model version number."
          steps:
            - name: get-model-version
              type: call
              call: "databricks-ml.get-model-version"
              with:
                name: "{{model_name}}"
                version: "{{model_version}}"
            - name: log-deployment
              type: call
              call: "snowflake-ml.insert-record"
              with:
                table: "ML_OPS.MODEL_DEPLOYMENTS"
                model_name: "{{model_name}}"
                version: "{{model_version}}"
                status: "{{get-model-version.current_stage}}"
            - name: notify-team
              type: call
              call: "slack-ds.post-message"
              with:
                channel: "$secrets.datascience_slack_channel"
                text: "Model deployed: {{model_name}} v{{model_version}} | Stage: {{get-model-version.current_stage}} | Run ID: {{get-model-version.run_id}}"
  consumes:
    - type: http
      namespace: databricks-ml
      baseUri: "https://morganstanley.cloud.databricks.com/api/2.0"
      authentication:
        type: bearer
        token: "$secrets.databricks_token"
      resources:
        - name: model-versions
          path: "/mlflow/model-versions/get"
          inputParameters:
            - name: name
              in: query
            - name: version
              in: query
          operations:
            - name: get-model-version
              method: GET
    - type: http
      namespace: snowflake-ml
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: slack-ds
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Detects cloud cost anomalies from Datadog, creates a FinOps review task in ServiceNow, and alerts the cloud platform team via Slack with cost breakdown details.

naftiko: "0.5"
info:
  label: "Datadog Cost Anomaly to FinOps Review"
  description: "Detects cloud cost anomalies from Datadog, creates a FinOps review task in ServiceNow, and alerts the cloud platform team via Slack with cost breakdown details."
  tags:
    - finops
    - cost-management
    - datadog
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cost-anomaly
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given a Datadog cost anomaly alert, create a FinOps review task and notify the team."
          inputParameters:
            - name: anomaly_id
              in: body
              type: string
              description: "Datadog cost anomaly alert ID."
          steps:
            - name: get-anomaly-details
              type: call
              call: "datadog-cost.get-anomaly"
              with:
                id: "{{anomaly_id}}"
            - name: create-review-task
              type: call
              call: "snow-finops.create-task"
              with:
                short_description: "Cloud cost anomaly: {{get-anomaly-details.service_name}}"
                description: "Service: {{get-anomaly-details.service_name}}\nExpected: ${{get-anomaly-details.expected_cost}}\nActual: ${{get-anomaly-details.actual_cost}}\nVariance: {{get-anomaly-details.variance_pct}}%"
                assignment_group: "Cloud_FinOps"
            - name: alert-team
              type: call
              call: "slack-finops.post-message"
              with:
                channel: "$secrets.finops_slack_channel"
                text: "Cost Anomaly: {{get-anomaly-details.service_name}} | Expected: ${{get-anomaly-details.expected_cost}} vs Actual: ${{get-anomaly-details.actual_cost}} | Task: {{create-review-task.number}}"
  consumes:
    - type: http
      namespace: datadog-cost
      baseUri: "https://api.datadoghq.com/api/v2"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: anomalies
          path: "/cost/anomalies/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-anomaly
              method: GET
    - type: http
      namespace: snow-finops
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: slack-finops
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves the current state and details of a Datadog monitor, including overall status, last triggered time, and affected hosts.

naftiko: "0.5"
info:
  label: "Datadog Monitor Status Check"
  description: "Retrieves the current state and details of a Datadog monitor, including overall status, last triggered time, and affected hosts."
  tags:
    - monitoring
    - observability
    - datadog
capability:
  exposes:
    - type: mcp
      namespace: dd-monitor
      port: 8080
      tools:
        - name: get-monitor-status
          description: "Given a Datadog monitor ID, return its name, overall state, last triggered timestamp, and message."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID."
          call: "datadog-api.get-monitor"
          with:
            id: "{{monitor_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.name"
            - name: overall_state
              type: string
              mapping: "$.overall_state"
  consumes:
    - type: http
      namespace: datadog-api
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-monitor
              method: GET

When a Datadog SLI breaches its SLO threshold, creates a ServiceNow problem record and posts an alert to the reliability engineering Slack channel.

naftiko: "0.5"
info:
  label: "Datadog SLI Breach to ServiceNow Problem"
  description: "When a Datadog SLI breaches its SLO threshold, creates a ServiceNow problem record and posts an alert to the reliability engineering Slack channel."
  tags:
    - sre
    - reliability
    - datadog
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sli-breach
      port: 8080
      tools:
        - name: handle-sli-breach
          description: "Given a Datadog SLO ID and service name, create a ServiceNow problem and notify the SRE team."
          inputParameters:
            - name: slo_id
              in: body
              type: string
              description: "Datadog SLO ID that breached."
            - name: service_name
              in: body
              type: string
              description: "Name of the service with the SLO breach."
          steps:
            - name: get-slo-details
              type: call
              call: "datadog-slo.get-slo"
              with:
                slo_id: "{{slo_id}}"
            - name: create-problem
              type: call
              call: "snow-sre.create-problem"
              with:
                short_description: "SLO breach: {{service_name}} - {{get-slo-details.name}}"
                description: "SLO: {{get-slo-details.name}}\nTarget: {{get-slo-details.target_threshold}}\nCurrent: {{get-slo-details.overall_status}}"
                assignment_group: "Site_Reliability_Engineering"
            - name: alert-sre
              type: call
              call: "slack-sre.post-message"
              with:
                channel: "$secrets.sre_slack_channel"
                text: "SLO Breach: {{service_name}} | Target: {{get-slo-details.target_threshold}} | Problem: {{create-problem.number}}"
  consumes:
    - type: http
      namespace: datadog-slo
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slos
          path: "/slo/{{slo_id}}"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: get-slo
              method: GET
    - type: http
      namespace: snow-sre
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: problems
          path: "/table/problem"
          operations:
            - name: create-problem
              method: POST
    - type: http
      namespace: slack-sre
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors Datadog for latency threshold breaches on trading APIs, triggers a PagerDuty on-call alert, and posts a diagnostic summary to the Trading Operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Datadog Trading Platform Observability Alert"
  description: "Monitors Datadog for latency threshold breaches on trading APIs, triggers a PagerDuty on-call alert, and posts a diagnostic summary to the Trading Operations Microsoft Teams channel."
  tags:
    - observability
    - trading
    - datadog
    - pagerduty
    - microsoft-teams
    - latency
    - reliability
capability:
  exposes:
    - type: mcp
      namespace: trading-observability
      port: 8080
      tools:
        - name: handle-latency-breach
          description: "Given a Datadog monitor ID detecting a trading API latency breach, retrieve monitor details, trigger a PagerDuty alert for the trading on-call team, and post diagnostics to the TradingOps Teams channel."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "Datadog monitor ID that detected the latency threshold breach."
            - name: service_name
              in: body
              type: string
              description: "Name of the trading service exhibiting latency."
          steps:
            - name: get-monitor-details
              type: call
              call: "datadog-trading.get-monitor"
              with:
                monitor_id: "{{monitor_id}}"
            - name: page-oncall
              type: call
              call: "pagerduty-trading.create-incident"
              with:
                title: "Latency breach: {{service_name}} — {{get-monitor-details.current_value}}ms"
                description: "Monitor: {{monitor_id}}\nThreshold exceeded: {{get-monitor-details.threshold}}ms"
            - name: post-diagnostics
              type: call
              call: "msteams-trading.post-channel-message"
              with:
                channel_id: "TradingOps"
                text: "Latency alert: {{service_name}} at {{get-monitor-details.current_value}}ms (threshold {{get-monitor-details.threshold}}ms). PD: {{page-oncall.incident_id}}"
  consumes:
    - type: http
      namespace: datadog-trading
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: monitors
          path: "/monitor/{{monitor_id}}"
          inputParameters:
            - name: monitor_id
              in: path
          operations:
            - name: get-monitor
              method: GET
    - type: http
      namespace: pagerduty-trading
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: msteams-trading
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Retrieves the signing status, recipient details, and completion date for a DocuSign envelope used in client agreement workflows.

naftiko: "0.5"
info:
  label: "DocuSign Envelope Status Check"
  description: "Retrieves the signing status, recipient details, and completion date for a DocuSign envelope used in client agreement workflows."
  tags:
    - legal
    - document-signing
    - docusign
capability:
  exposes:
    - type: mcp
      namespace: docusign-status
      port: 8080
      tools:
        - name: get-envelope-status
          description: "Given a DocuSign envelope ID, return its status, sent date, and list of recipients with their signing status."
          inputParameters:
            - name: envelope_id
              in: body
              type: string
              description: "DocuSign envelope ID."
          call: "docusign-api.get-envelope"
          with:
            envelope_id: "{{envelope_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: sent_datetime
              type: string
              mapping: "$.sentDateTime"
  consumes:
    - type: http
      namespace: docusign-api
      baseUri: "https://na4.docusign.net/restapi/v2.1"
      authentication:
        type: bearer
        token: "$secrets.docusign_token"
      resources:
        - name: envelopes
          path: "/accounts/default/envelopes/{{envelope_id}}"
          inputParameters:
            - name: envelope_id
              in: path
          operations:
            - name: get-envelope
              method: GET

When an employee is terminated in Workday, deactivates their Okta account, disables Microsoft 365 access via Microsoft Graph, and opens a ServiceNow offboarding change request.

naftiko: "0.5"
info:
  label: "Employee Offboarding and Access Revocation"
  description: "When an employee is terminated in Workday, deactivates their Okta account, disables Microsoft 365 access via Microsoft Graph, and opens a ServiceNow offboarding change request."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - microsoft-graph
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID for a terminated employee, deactivate Okta account, disable Microsoft 365 access, and open a ServiceNow change request for asset recovery."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "Workday worker ID of the departing employee."
            - name: termination_date
              in: body
              type: string
              description: "Effective termination date in ISO 8601 format."
          steps:
            - name: get-worker
              type: call
              call: "workday-offboard.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: deactivate-okta
              type: call
              call: "okta-offboard.deactivate-user"
              with:
                user_id: "{{get-worker.okta_user_id}}"
            - name: disable-m365
              type: call
              call: "msgraph-offboard.disable-user"
              with:
                user_id: "{{get-worker.azure_object_id}}"
            - name: open-change
              type: call
              call: "servicenow-offboard.create-change"
              with:
                short_description: "Offboarding: {{get-worker.full_name}} — termination {{termination_date}}"
                category: "hr_offboarding"
  consumes:
    - type: http
      namespace: workday-offboard
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/morganstanley/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta-offboard
      baseUri: "https://morganstanley.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: user-lifecycle
          path: "/users/{{user_id}}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - type: http
      namespace: msgraph-offboard
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: users
          path: "/users/{{user_id}}"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: disable-user
              method: PATCH
    - type: http
      namespace: servicenow-offboard
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          operations:
            - name: create-change
              method: POST

When a new hire is created in Workday, provisions an Okta identity, creates a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message to the new employee.

naftiko: "0.5"
info:
  label: "Employee Onboarding Provisioning"
  description: "When a new hire is created in Workday, provisions an Okta identity, creates a ServiceNow onboarding ticket, and sends a Microsoft Teams welcome message to the new employee."
  tags:
    - hr
    - onboarding
    - workday
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, provision an Okta user account, open a ServiceNow onboarding ticket, and send a Teams welcome message to the new hire."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire."
            - name: start_date
              in: body
              type: string
              description: "Employee start date in ISO 8601 format."
            - name: department
              in: body
              type: string
              description: "Department name for Okta group assignment and ticket routing."
          steps:
            - name: get-worker
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: create-okta-user
              type: call
              call: "okta.create-user"
              with:
                firstName: "{{get-worker.first_name}}"
                lastName: "{{get-worker.last_name}}"
                email: "{{get-worker.work_email}}"
                department: "{{department}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-worker.full_name}}"
                category: "hr_onboarding"
                assigned_to: "IT_Onboarding"
            - name: send-welcome
              type: call
              call: "msteams.send-message"
              with:
                recipient_upn: "{{get-worker.work_email}}"
                text: "Welcome to Morgan Stanley, {{get-worker.first_name}}! Your IT onboarding ticket: {{open-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: "/morganstanley/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta
      baseUri: "https://morganstanley.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          operations:
            - name: create-user
              method: POST
    - type: http
      namespace: servicenow
      baseUri: "https://morganstanley.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: user-mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Retrieves consensus earnings estimates for a given security from FactSet, supporting equity research and investment decision workflows.

naftiko: "0.5"
info:
  label: "FactSet Earnings Estimate Lookup"
  description: "Retrieves consensus earnings estimates for a given security from FactSet, supporting equity research and investment decision workflows."
  tags:
    - research
    - equity
    - factset
capability:
  exposes:
    - type: mcp
      namespace: factset-estimates
      port: 8080
      tools:
        - name: get-earnings-estimates
          description: "Given a FactSet security identifier, return consensus EPS estimates for the next four quarters."
          inputParameters:
            - name: security_id
              in: body
              type: string
              description: "FactSet security identifier."
          call: "factset-api.get-estimates"
          with:
            id: "{{security_id}}"
          outputParameters:
            - name: estimates
              type: string
              mapping: "$.data"
  consumes:
    - type: http
      namespace: factset-api
      baseUri: "https://api.factset.com/analytics/v3"
      authentication:
        type: basic
        username: "$secrets.factset_user"
        password: "$secrets.factset_api_key"
      resources:
        - name: estimates
          path: "/estimates/{{id}}/consensus"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-estimates
              method: GET

When a GitHub Actions workflow fails, retrieves failure details, creates a Jira bug ticket, and notifies the development team via Slack.

naftiko: "0.5"
info:
  label: "GitHub Actions Failure to Jira Ticket"
  description: "When a GitHub Actions workflow fails, retrieves failure details, creates a Jira bug ticket, and notifies the development team via Slack."
  tags:
    - development
    - ci-cd
    - github-actions
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cicd-failure
      port: 8080
      tools:
        - name: handle-workflow-failure
          description: "Given a GitHub Actions run ID and repository, create a Jira ticket and notify the team via Slack."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository in org/repo format."
            - name: run_id
              in: body
              type: string
              description: "GitHub Actions workflow run ID."
          steps:
            - name: get-run-details
              type: call
              call: "github-ci.get-workflow-run"
              with:
                repo: "{{repo}}"
                run_id: "{{run_id}}"
            - name: create-bug
              type: call
              call: "jira-ci.create-issue"
              with:
                project_key: "INFRA"
                issuetype: "Bug"
                summary: "CI failure: {{get-run-details.name}} in {{repo}}"
                description: "Workflow: {{get-run-details.name}}\nBranch: {{get-run-details.head_branch}}"
            - name: notify-team
              type: call
              call: "slack-ci.post-message"
              with:
                channel: "$secrets.dev_slack_channel"
                text: "CI Failure: {{get-run-details.name}} in {{repo}} | Jira: {{create-bug.key}}"
  consumes:
    - type: http
      namespace: github-ci
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: runs
          path: "/repos/{{repo}}/actions/runs/{{run_id}}"
          inputParameters:
            - name: repo
              in: path
            - name: run_id
              in: path
          operations:
            - name: get-workflow-run
              method: GET
    - type: http
      namespace: jira-ci
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack-ci
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When Dependabot finds critical vulnerabilities, creates a prioritized Jira security ticket, assigns to the owning team, and tracks remediation SLA in Snowflake.

naftiko: "0.5"
info:
  label: "GitHub Dependency Vulnerability Remediation"
  description: "When Dependabot finds critical vulnerabilities, creates a prioritized Jira security ticket, assigns to the owning team, and tracks remediation SLA in Snowflake."
  tags:
    - security
    - vulnerability
    - github
    - jira
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: vuln-remediation
      port: 8080
      tools:
        - name: handle-vulnerability
          description: "Given a GitHub Dependabot alert, create a Jira ticket and track the remediation SLA."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository with the vulnerability."
            - name: alert_number
              in: body
              type: string
              description: "Dependabot alert number."
          steps:
            - name: get-alert
              type: call
              call: "github-vuln.get-dependabot-alert"
              with:
                repo: "{{repo}}"
                alert_number: "{{alert_number}}"
            - name: create-ticket
              type: call
              call: "jira-vuln.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Vulnerability: {{get-alert.package_name}} in {{repo}}"
                description: "Severity: {{get-alert.severity}}\nPackage: {{get-alert.package_name}}\nCVE: {{get-alert.cve_id}}\nFixed version: {{get-alert.fixed_version}}"
                priority: "High"
            - name: track-sla
              type: call
              call: "snowflake-vuln.insert-record"
              with:
                table: "SECURITY.VULNERABILITY_SLA_TRACKING"
                repo: "{{repo}}"
                severity: "{{get-alert.severity}}"
                jira_key: "{{create-ticket.key}}"
  consumes:
    - type: http
      namespace: github-vuln
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: alerts
          path: "/repos/{{repo}}/dependabot/alerts/{{alert_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-dependabot-alert
              method: GET
    - type: http
      namespace: jira-vuln
      baseUri: "https://morganstanley.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: snowflake-vuln
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

On pull requests to production branches, verifies that all commits are signed and the PR has required compliance reviewer approvals, posts gate results to Jira, and notifies the DevSecOps Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "GitHub Pull Request Compliance Gate"
  description: "On pull requests to production branches, verifies that all commits are signed and the PR has required compliance reviewer approvals, posts gate results to Jira, and notifies the DevSecOps Microsoft Teams channel."
  tags:
    - devops
    - compliance
    - github
    - jira
    - microsoft-teams
    - code-review
    - devsecops
capability:
  exposes:
    - type: mcp
      namespace: compliance-gate
      port: 8080
      tools:
        - name: enforce-pr-compliance-gate
          description: "Given a GitHub repo and PR number, verify commit signing and required compliance reviewer approvals, post gate results as a PR comment, and notify DevSecOps Teams channel if gate fails."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "GitHub repository in owner/repo format."
            - name: pr_number
              in: body
              type: integer
              description: "Pull request number to enforce the compliance gate on."
            - name: required_reviewers
              in: body
              type: string
              description: "Comma-separated list of required reviewer GitHub logins."
          steps:
            - name: get-pr-reviews
              type: call
              call: "github-reviews.list-reviews"
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
            - name: post-gate-result
              type: call
              call: "github-gate-comment.create-pr-comment"
              with:
                repo: "{{repo}}"
                pr_number: "{{pr_number}}"
                body: "Compliance gate result: required reviewers {{required_reviewers}} — approval status: {{get-pr-reviews.approval_status}}"
            - name: notify-devsecops
              type: call
              call: "msteams-devsecops.post-channel-message"
              with:
                channel_id: "DevSecOps"
                text: "Compliance gate for PR #{{pr_number}} in {{repo}}: {{get-pr-reviews.approval_status}}. Required: {{required_reviewers}}"
  consumes:
    - type: http
      namespace: github-reviews
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pr-reviews
          path: "/repos/{{repo}}/pulls/{{pr_number}}/reviews"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: list-reviews
              method: GET
    - type: http
      namespace: github-gate-comment
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: issue-comments
          path: "/repos/{{repo}}/issues/{{pr_number}}/comments"
          inputParameters:
            - name: repo
              in: path
            - name: pr_number
              in: path
          operations:
            - name: create-pr-comment
              method: POST
    - type: http
      namespace: msteams-devsecops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Returns metadata for a GitHub repository including language breakdown, open issues count, last commit date, and CI status.

naftiko: "0.5"
info:
  label: "GitHub Repository Info Lookup"
  description: "Returns metadata for a GitHub repository including language breakdown, open issues count, last commit date, and CI status."
  tags:
    - development
    - source-control
    - github
capability:
  exposes:
    - type: mcp
      namespace: gh-repo
      port: 8080
      tools:
        - name: get-repo-info
          description: "Given an organization and repository name, return its description, primary language, open issues count, and default branch."
          inputParameters:
            - name: org
              in: body
              type: string
              description: "GitHub organization name."
            - name: repo
              in: body
              type: string
              description: "Repository name."
          call: "github-api.get-repository"
          with:
            owner: "{{org}}"
            repo: "{{repo}}"
          outputParameters:
            - name: description
              type: string
              mapping: "$.description"
            - name: language
              type: string
              mapping: "$.language"
  consumes:
    - type: http
      namespace: github-api
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: repos
          path: "/repos/{{owner}}/{{repo}}"
          inputParameters:
            - name: owner
              in: path
            - name: repo
              in: path
          operations:
            - name: get-repository
              method: GET

When GitHub detects exposed secrets, creates a PagerDuty incident for immediate rotation, opens a Jira security ticket, and notifies the security team via Slack.

naftiko: "0.5"
info:
  label: "GitHub Secret Scanning Alert Response"
  description: "When GitHub detects exposed secrets, creates a PagerDuty incident for immediate rotation, opens a Jira security ticket, and notifies the security team via Slack."
  tags:
    - security
    - secret-management
    - github
    - pagerduty
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: secret-response
      port: 8080
      tools:
        - name: respond-to-secret-exposure
          description: "Given a GitHub secret scanning alert, create a PagerDuty incident, Jira ticket, and Slack notification."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "Repository with the exposed secret."
            - name: alert_number
              in: body
              type: string
              description: "GitHub secret scanning alert number."
          steps:
            - name: get-alert
              type: call
              call: "github-sec.get-secret-alert"
              with:
                repo: "{{repo}}"
                alert_number: "{{alert_number}}"
            - name: page-security
              type: call
              call: "pagerduty-sec.create-incident"
              with:
                service_id: "$secrets.pagerduty_security_service_id"
                summary: "CRITICAL: Secret exposed in {{repo}} - {{get-alert.secret_type}}"
                severity: "critical"
            - name: create-ticket
              type: call
              call: "jira-sec.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Secret rotation required: {{get-alert.secret_type}} in {{repo}}"
                description: "Secret type: {{get-alert.secret_type}}\nFile: {{get-alert.path}}\nImmediate rotation required."
                priority: "Highest"
  consumes:
    - type: http
      namespace: github-sec
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: alerts
          path: "/repos/{{repo}}/secret-scanning/alerts/{{alert_number}}"
          inputParameters:
            - name: repo
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-secret-alert
              method: GET
    - type: http
      namespace: pagerduty-sec
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: jira-sec
      baseUri: "https://morganstanley.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

Scans GitHub repositories for exposed secrets and code vulnerabilities using GitHub Advanced Security, logs findings to Snowflake for audit, and creates Jira tickets for critical issues.

naftiko: "0.5"
info:
  label: "GitHub Security Scanning and Compliance Audit"
  description: "Scans GitHub repositories for exposed secrets and code vulnerabilities using GitHub Advanced Security, logs findings to Snowflake for audit, and creates Jira tickets for critical issues."
  tags:
    - security
    - devops
    - github
    - snowflake
    - jira
    - code-scanning
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: code-security
      port: 8080
      tools:
        - name: audit-github-security-findings
          description: "Given a GitHub organization, list all open code scanning and secret scanning alerts at high or critical severity, log findings to Snowflake for compliance audit, and create Jira SEC tickets for each critical alert."
          inputParameters:
            - name: github_org
              in: body
              type: string
              description: "GitHub organization to scan for security alerts."
            - name: severity_filter
              in: body
              type: string
              description: "Minimum severity to include: 'high' or 'critical'."
          steps:
            - name: get-code-scanning-alerts
              type: call
              call: "github-code-scan.list-alerts"
              with:
                org: "{{github_org}}"
                severity: "{{severity_filter}}"
            - name: log-to-snowflake
              type: call
              call: "snowflake-security.insert-record"
              with:
                table: "SECURITY.CODE_SCANNING_ALERTS"
                org: "{{github_org}}"
                alert_count: "{{get-code-scanning-alerts.alert_count}}"
                severities: "{{get-code-scanning-alerts.severity_breakdown}}"
            - name: create-jira-ticket
              type: call
              call: "jira-code-sec.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Code scanning: {{get-code-scanning-alerts.alert_count}} {{severity_filter}} alerts in {{github_org}}"
                description: "Alerts: {{get-code-scanning-alerts.alert_ids}}\nSnowflake audit logged."
  consumes:
    - type: http
      namespace: github-code-scan
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: code-scanning-alerts
          path: "/orgs/{{org}}/code-scanning/alerts"
          inputParameters:
            - name: org
              in: path
            - name: severity
              in: query
          operations:
            - name: list-alerts
              method: GET
    - type: http
      namespace: snowflake-security
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: jira-code-sec
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Syncs deal pipeline data from Salesforce to Snowflake and refreshes the Power BI deal tracking dashboard for investment banking leadership review.

naftiko: "0.5"
info:
  label: "Investment Banking Deal Pipeline Sync"
  description: "Syncs deal pipeline data from Salesforce to Snowflake and refreshes the Power BI deal tracking dashboard for investment banking leadership review."
  tags:
    - investment-banking
    - pipeline
    - salesforce
    - snowflake
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: deal-pipeline
      port: 8080
      tools:
        - name: sync-deal-pipeline
          description: "Extract current deal pipeline from Salesforce, load into Snowflake staging, and trigger a Power BI dashboard refresh."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter to sync (e.g., Q1-2026)."
          steps:
            - name: extract-deals
              type: call
              call: "sfdc-deals.query-deals"
              with:
                query: "SELECT Id, Name, Amount, StageName FROM Opportunity WHERE FiscalQuarter = '{{fiscal_quarter}}'"
            - name: load-to-snowflake
              type: call
              call: "snowflake-deals.execute-statement"
              with:
                statement: "CALL STAGING.LOAD_IB_DEAL_PIPELINE('{{fiscal_quarter}}')"
            - name: refresh-dashboard
              type: call
              call: "pbi-deals.trigger-refresh"
              with:
                group_id: "$secrets.pbi_ib_workspace_id"
                dataset_id: "$secrets.pbi_deal_pipeline_dataset_id"
  consumes:
    - type: http
      namespace: sfdc-deals
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: query
          path: "/query"
          operations:
            - name: query-deals
              method: GET
    - type: http
      namespace: snowflake-deals
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: pbi-deals
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Fetches completed Jira sprint metrics for the technology division, generates a sprint report, and posts a digest to the Technology Leadership Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Jira Development Sprint Reporting"
  description: "Fetches completed Jira sprint metrics for the technology division, generates a sprint report, and posts a digest to the Technology Leadership Microsoft Teams channel."
  tags:
    - devops
    - engineering
    - jira
    - microsoft-teams
    - agile
    - sprint-reporting
capability:
  exposes:
    - type: mcp
      namespace: sprint-reporting
      port: 8080
      tools:
        - name: publish-sprint-report
          description: "Given a Jira board ID and the number of sprints to analyze, calculate velocity, bug rate, and completion rate, then post a sprint report digest to the Technology Leadership Teams channel."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "Jira board ID to pull sprint data from."
            - name: sprint_count
              in: body
              type: integer
              description: "Number of completed sprints to include in the report."
          steps:
            - name: get-sprint-data
              type: call
              call: "jira-sprints.list-completed-sprints"
              with:
                board_id: "{{board_id}}"
                limit: "{{sprint_count}}"
            - name: post-report
              type: call
              call: "msteams-tech.post-channel-message"
              with:
                channel_id: "TechLeadership"
                text: "Sprint report for board {{board_id}}: Avg velocity {{get-sprint-data.avg_velocity}} pts | Bug rate {{get-sprint-data.bug_rate}}% | Completion rate {{get-sprint-data.completion_rate}}% over {{sprint_count}} sprints."
  consumes:
    - type: http
      namespace: jira-sprints
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: board-sprints
          path: "/board/{{board_id}}/sprint"
          inputParameters:
            - name: board_id
              in: path
            - name: limit
              in: query
          operations:
            - name: list-completed-sprints
              method: GET
    - type: http
      namespace: msteams-tech
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Returns the summary, status, assignee, and sprint for a Jira issue by key, enabling quick status checks during standups or planning sessions.

naftiko: "0.5"
info:
  label: "Jira Issue Detail Lookup"
  description: "Returns the summary, status, assignee, and sprint for a Jira issue by key, enabling quick status checks during standups or planning sessions."
  tags:
    - development
    - project-management
    - jira
capability:
  exposes:
    - type: mcp
      namespace: jira-lookup
      port: 8080
      tools:
        - name: get-issue-details
          description: "Given a Jira issue key, return its summary, status, assignee, priority, and current sprint name."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "Jira issue key (e.g., PLAT-1234)."
          call: "jira-api.get-issue"
          with:
            key: "{{issue_key}}"
          outputParameters:
            - name: summary
              type: string
              mapping: "$.fields.summary"
            - name: status
              type: string
              mapping: "$.fields.status.name"
  consumes:
    - type: http
      namespace: jira-api
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue/{{key}}"
          inputParameters:
            - name: key
              in: path
          operations:
            - name: get-issue
              method: GET

Aggregates sprint velocity metrics from Jira, stores historical data in Snowflake, and publishes a quarterly engineering report to Confluence.

naftiko: "0.5"
info:
  label: "Jira Quarterly Velocity Report"
  description: "Aggregates sprint velocity metrics from Jira, stores historical data in Snowflake, and publishes a quarterly engineering report to Confluence."
  tags:
    - engineering
    - velocity
    - jira
    - snowflake
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: velocity-report
      port: 8080
      tools:
        - name: generate-velocity-report
          description: "Given a Jira board ID and quarter, generate a velocity report and publish to Confluence."
          inputParameters:
            - name: board_id
              in: body
              type: string
              description: "Jira board ID."
            - name: quarter
              in: body
              type: string
              description: "Quarter (e.g., Q1-2026)."
          steps:
            - name: get-velocity
              type: call
              call: "jira-vel.get-board-velocity"
              with:
                board_id: "{{board_id}}"
            - name: store-metrics
              type: call
              call: "snowflake-vel.insert-record"
              with:
                table: "ENGINEERING.VELOCITY_METRICS"
                board_id: "{{board_id}}"
                quarter: "{{quarter}}"
                avg_velocity: "{{get-velocity.average}}"
            - name: publish-report
              type: call
              call: "confluence-vel.create-page"
              with:
                space: "ENG"
                title: "Velocity Report - {{quarter}}"
                body: "Average velocity: {{get-velocity.average}} points\nSprints completed: {{get-velocity.sprint_count}}"
  consumes:
    - type: http
      namespace: jira-vel
      baseUri: "https://morganstanley.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: boards
          path: "/board/{{board_id}}/sprint"
          inputParameters:
            - name: board_id
              in: path
          operations:
            - name: get-board-velocity
              method: GET
    - type: http
      namespace: snowflake-vel
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: confluence-vel
      baseUri: "https://morganstanley.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Runs a new client through Refinitiv World-Check for KYC screening, creates a Salesforce onboarding case with risk results, and logs the screening outcome to Snowflake for compliance reporting.

naftiko: "0.5"
info:
  label: "KYC Client Risk Screening"
  description: "Runs a new client through Refinitiv World-Check for KYC screening, creates a Salesforce onboarding case with risk results, and logs the screening outcome to Snowflake for compliance reporting."
  tags:
    - compliance
    - kyc
    - refinitiv
    - salesforce
    - snowflake
    - client-onboarding
capability:
  exposes:
    - type: mcp
      namespace: kyc-screening
      port: 8080
      tools:
        - name: screen-new-client
          description: "Given a new client name and entity type, run a Refinitiv World-Check KYC screening, create a Salesforce onboarding case with the risk score, and log the result to Snowflake for audit."
          inputParameters:
            - name: client_name
              in: body
              type: string
              description: "Full legal name of the client entity to screen."
            - name: entity_type
              in: body
              type: string
              description: "Entity type: 'individual' or 'organization'."
            - name: country_of_incorporation
              in: body
              type: string
              description: "ISO 3166-1 alpha-2 country code for the client's country of incorporation."
          steps:
            - name: run-kyc-screen
              type: call
              call: "refinitiv-kyc.search-entity"
              with:
                name: "{{client_name}}"
                entity_type: "{{entity_type}}"
                country: "{{country_of_incorporation}}"
            - name: create-onboarding-case
              type: call
              call: "salesforce-kyc.create-case"
              with:
                subject: "KYC screening: {{client_name}}"
                description: "Entity type: {{entity_type}}\nCountry: {{country_of_incorporation}}\nRisk score: {{run-kyc-screen.risk_score}}\nMatch count: {{run-kyc-screen.match_count}}"
                priority: "{{run-kyc-screen.recommended_priority}}"
            - name: log-screening
              type: call
              call: "snowflake-kyc.insert-record"
              with:
                table: "COMPLIANCE.KYC_SCREENINGS"
                client_name: "{{client_name}}"
                risk_score: "{{run-kyc-screen.risk_score}}"
                case_id: "{{create-onboarding-case.case_number}}"
  consumes:
    - type: http
      namespace: refinitiv-kyc
      baseUri: "https://api.thomsonreuters.com/worldcheck/v1"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: entities
          path: "/entities/search"
          inputParameters:
            - name: name
              in: query
            - name: entity_type
              in: query
            - name: country
              in: query
          operations:
            - name: search-entity
              method: GET
    - type: http
      namespace: salesforce-kyc
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: snowflake-kyc
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

Fetches approved executive communications from SharePoint, publishes them as LinkedIn posts on behalf of the organization, and logs publication metadata to Snowflake for campaign tracking.

naftiko: "0.5"
info:
  label: "LinkedIn Executive Communications Publisher"
  description: "Fetches approved executive communications from SharePoint, publishes them as LinkedIn posts on behalf of the organization, and logs publication metadata to Snowflake for campaign tracking."
  tags:
    - marketing
    - communications
    - linkedin
    - sharepoint
    - snowflake
    - social-media
    - executive-communications
capability:
  exposes:
    - type: mcp
      namespace: exec-comms
      port: 8080
      tools:
        - name: publish-executive-post
          description: "Given a SharePoint document ID containing approved communications content and a LinkedIn organization ID, publish the post to LinkedIn and log the publication record to Snowflake."
          inputParameters:
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID where the approved content document is stored."
            - name: document_item_id
              in: body
              type: string
              description: "SharePoint drive item ID of the approved communications document."
            - name: linkedin_org_id
              in: body
              type: string
              description: "LinkedIn organization URN ID to post on behalf of."
          steps:
            - name: fetch-content
              type: call
              call: "sharepoint-comms.get-file-content"
              with:
                site_id: "{{sharepoint_site_id}}"
                item_id: "{{document_item_id}}"
            - name: publish-to-linkedin
              type: call
              call: "linkedin-comms.create-share"
              with:
                organization_id: "{{linkedin_org_id}}"
                text: "{{fetch-content.text_content}}"
            - name: log-publication
              type: call
              call: "snowflake-comms.insert-record"
              with:
                table: "MARKETING.LINKEDIN_PUBLICATIONS"
                org_id: "{{linkedin_org_id}}"
                post_id: "{{publish-to-linkedin.post_id}}"
                published_at: "{{publish-to-linkedin.created_at}}"
  consumes:
    - type: http
      namespace: sharepoint-comms
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: file-content
          path: "/sites/{{site_id}}/drive/items/{{item_id}}/content"
          inputParameters:
            - name: site_id
              in: path
            - name: item_id
              in: path
          operations:
            - name: get-file-content
              method: GET
    - type: http
      namespace: linkedin-comms
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: shares
          path: "/ugcPosts"
          operations:
            - name: create-share
              method: POST
    - type: http
      namespace: snowflake-comms
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

Drafts thought leadership content using Anthropic Claude based on Bloomberg market data, publishes to LinkedIn, and logs the campaign to Salesforce Marketing Cloud.

naftiko: "0.5"
info:
  label: "LinkedIn Thought Leadership Publisher"
  description: "Drafts thought leadership content using Anthropic Claude based on Bloomberg market data, publishes to LinkedIn, and logs the campaign to Salesforce Marketing Cloud."
  tags:
    - marketing
    - content
    - anthropic
    - bloomberg
    - linkedin
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: thought-leadership
      port: 8080
      tools:
        - name: publish-thought-leadership
          description: "Given a market topic and Bloomberg data points, draft content with Claude, publish to LinkedIn, and log to Salesforce."
          inputParameters:
            - name: topic
              in: body
              type: string
              description: "Market topic for the thought leadership piece."
            - name: bloomberg_data_ref
              in: body
              type: string
              description: "Bloomberg data reference for supporting market data."
          steps:
            - name: get-market-data
              type: call
              call: "bloomberg-mktg.get-data"
              with:
                reference: "{{bloomberg_data_ref}}"
            - name: draft-content
              type: call
              call: "anthropic-mktg.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                content: "Write a professional LinkedIn thought leadership post about {{topic}} using these market data points: {{get-market-data.summary}}. Keep it under 1300 characters."
            - name: publish-to-linkedin
              type: call
              call: "linkedin-api.create-post"
              with:
                text: "{{draft-content.text}}"
  consumes:
    - type: http
      namespace: bloomberg-mktg
      baseUri: "https://api.bloomberg.com/eap/catalogs/bbg/datasets"
      authentication:
        type: bearer
        token: "$secrets.bloomberg_api_token"
      resources:
        - name: data
          path: "/{{reference}}"
          inputParameters:
            - name: reference
              in: path
          operations:
            - name: get-data
              method: GET
    - type: http
      namespace: anthropic-mktg
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: linkedin-api
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: posts
          path: "/ugcPosts"
          operations:
            - name: create-post
              method: POST

Triages Microsoft Sentinel security alerts by enriching with Splunk log data, creates a ServiceNow security incident, and notifies the SOC team via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Microsoft Sentinel Alert Triage"
  description: "Triages Microsoft Sentinel security alerts by enriching with Splunk log data, creates a ServiceNow security incident, and notifies the SOC team via Microsoft Teams."
  tags:
    - security
    - siem
    - microsoft-sentinel
    - splunk
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: sentinel-triage
      port: 8080
      tools:
        - name: triage-sentinel-alert
          description: "Given a Sentinel alert ID, enrich with Splunk data, create a ServiceNow incident, and notify the SOC."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Microsoft Sentinel alert ID."
          steps:
            - name: get-alert
              type: call
              call: "sentinel-api.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: correlate-logs
              type: call
              call: "splunk-soc.create-search"
              with:
                search: "index=security {{get-alert.entities}} earliest=-1h"
            - name: create-incident
              type: call
              call: "snow-soc.create-incident"
              with:
                short_description: "Sentinel: {{get-alert.display_name}}"
                description: "Severity: {{get-alert.severity}}\nCorrelated events: {{correlate-logs.result_count}}"
                priority: "2"
  consumes:
    - type: http
      namespace: sentinel-api
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: alerts
          path: "/providers/Microsoft.SecurityInsights/incidents/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: splunk-soc
      baseUri: "https://splunk.morganstanley.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: searches
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST
    - type: http
      namespace: snow-soc
      baseUri: "https://morganstanley.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

When a New Relic alert condition fires, retrieves violation details, creates a PagerDuty incident, and posts a notification to the engineering Slack channel.

naftiko: "0.5"
info:
  label: "New Relic Alert to PagerDuty Escalation"
  description: "When a New Relic alert condition fires, retrieves violation details, creates a PagerDuty incident, and posts a notification to the engineering Slack channel."
  tags:
    - monitoring
    - incident-response
    - new-relic
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: nr-escalation
      port: 8080
      tools:
        - name: escalate-nr-alert
          description: "Given a New Relic violation ID, retrieve details, create a PagerDuty incident, and notify the engineering Slack channel."
          inputParameters:
            - name: violation_id
              in: body
              type: string
              description: "New Relic alert violation ID."
            - name: slack_channel_id
              in: body
              type: string
              description: "Slack channel ID for engineering notifications."
          steps:
            - name: get-violation
              type: call
              call: "newrelic-api.get-violation"
              with:
                violation_id: "{{violation_id}}"
            - name: create-incident
              type: call
              call: "pagerduty-api.create-incident"
              with:
                service_id: "$secrets.pagerduty_infra_service_id"
                summary: "New Relic: {{get-violation.condition_name}} on {{get-violation.entity_name}}"
                severity: "critical"
            - name: notify-slack
              type: call
              call: "slack-eng.post-message"
              with:
                channel: "{{slack_channel_id}}"
                text: "New Relic Alert: {{get-violation.condition_name}} | Entity: {{get-violation.entity_name}} | PagerDuty: {{create-incident.incidentId}}"
  consumes:
    - type: http
      namespace: newrelic-api
      baseUri: "https://api.newrelic.com/v2"
      authentication:
        type: apikey
        key: "Api-Key"
        value: "$secrets.newrelic_api_key"
        placement: header
      resources:
        - name: violations
          path: "/alerts_violations/{{violation_id}}.json"
          inputParameters:
            - name: violation_id
              in: path
          operations:
            - name: get-violation
              method: GET
    - type: http
      namespace: pagerduty-api
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: slack-eng
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Audits Okta group memberships against Workday organizational data, flags mismatches in a ServiceNow task, and sends an audit summary to the identity team via Slack.

naftiko: "0.5"
info:
  label: "Okta Group Membership Audit"
  description: "Audits Okta group memberships against Workday organizational data, flags mismatches in a ServiceNow task, and sends an audit summary to the identity team via Slack."
  tags:
    - security
    - identity-audit
    - okta
    - workday
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: identity-audit
      port: 8080
      tools:
        - name: audit-group-memberships
          description: "Given an Okta group ID, audit memberships against Workday org data and flag mismatches."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "Okta group ID to audit."
          steps:
            - name: get-okta-members
              type: call
              call: "okta-audit.get-group-members"
              with:
                group_id: "{{group_id}}"
            - name: get-workday-org
              type: call
              call: "workday-audit.get-org-members"
              with:
                group_id: "{{group_id}}"
            - name: create-audit-task
              type: call
              call: "snow-audit.create-task"
              with:
                short_description: "Identity audit: Okta group {{group_id}}"
                description: "Okta members: {{get-okta-members.count}}\nWorkday expected: {{get-workday-org.count}}\nMismatches flagged for review."
                assignment_group: "Identity_Governance"
  consumes:
    - type: http
      namespace: okta-audit
      baseUri: "https://morganstanley.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: groups
          path: "/groups/{{group_id}}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: get-group-members
              method: GET
    - type: http
      namespace: workday-audit
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: orgs
          path: "/morganstanley/organizations"
          operations:
            - name: get-org-members
              method: GET
    - type: http
      namespace: snow-audit
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST

Queries Okta for users without MFA enrolled, generates a non-compliance report in SharePoint, and sends a reminder notification via Microsoft Teams to each non-compliant user's manager.

naftiko: "0.5"
info:
  label: "Okta MFA Compliance Enforcement"
  description: "Queries Okta for users without MFA enrolled, generates a non-compliance report in SharePoint, and sends a reminder notification via Microsoft Teams to each non-compliant user's manager."
  tags:
    - security
    - identity
    - okta
    - sharepoint
    - microsoft-teams
    - mfa
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: mfa-compliance
      port: 8080
      tools:
        - name: enforce-mfa-compliance
          description: "Query Okta for all active users without MFA enrolled, export the list to SharePoint for compliance records, and send Teams reminders to each non-compliant user."
          inputParameters:
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID where the MFA non-compliance report will be saved."
          steps:
            - name: get-non-mfa-users
              type: call
              call: "okta-mfa.list-users-without-mfa"
              with:
                status: "ACTIVE"
                factor_type: "NONE"
            - name: export-report
              type: call
              call: "sharepoint-mfa.create-file"
              with:
                site_id: "{{sharepoint_site_id}}"
                file_name: "MFA_NonCompliance_Report.csv"
                content: "{{get-non-mfa-users.csv_data}}"
            - name: notify-security
              type: call
              call: "msteams-mfa.post-channel-message"
              with:
                channel_id: "InformationSecurity"
                text: "MFA compliance: {{get-non-mfa-users.user_count}} active users without MFA. Non-compliance report exported to SharePoint: {{export-report.file_url}}"
  consumes:
    - type: http
      namespace: okta-mfa
      baseUri: "https://morganstanley.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users"
          inputParameters:
            - name: status
              in: query
            - name: factor_type
              in: query
          operations:
            - name: list-users-without-mfa
              method: GET
    - type: http
      namespace: sharepoint-mfa
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-file
              method: POST
    - type: http
      namespace: msteams-mfa
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Processes Okta group access requests from employees, routes approval through Jira, applies group membership on approval, and audits the change in Snowflake.

naftiko: "0.5"
info:
  label: "Okta Privileged Access Request Workflow"
  description: "Processes Okta group access requests from employees, routes approval through Jira, applies group membership on approval, and audits the change in Snowflake."
  tags:
    - identity
    - security
    - okta
    - jira
    - snowflake
    - access-management
    - approval
capability:
  exposes:
    - type: mcp
      namespace: access-requests
      port: 8080
      tools:
        - name: process-access-request
          description: "Given an employee Okta user ID and requested group name, create a Jira approval ticket for the access request, and upon approval add the user to the Okta group and log the change in Snowflake."
          inputParameters:
            - name: okta_user_id
              in: body
              type: string
              description: "Okta user ID of the employee requesting access."
            - name: requested_group
              in: body
              type: string
              description: "Okta group name being requested."
            - name: business_justification
              in: body
              type: string
              description: "Business justification for the access request."
          steps:
            - name: create-approval-ticket
              type: call
              call: "jira-access.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Task"
                summary: "Access request: {{okta_user_id}} for group {{requested_group}}"
                description: "Justification: {{business_justification}}"
            - name: add-to-group
              type: call
              call: "okta-access.add-user-to-group"
              with:
                group_name: "{{requested_group}}"
                user_id: "{{okta_user_id}}"
            - name: log-access-change
              type: call
              call: "snowflake-access.insert-record"
              with:
                table: "SECURITY.ACCESS_CHANGES"
                user_id: "{{okta_user_id}}"
                group: "{{requested_group}}"
                ticket: "{{create-approval-ticket.key}}"
  consumes:
    - type: http
      namespace: jira-access
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: okta-access
      baseUri: "https://morganstanley.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: group-members
          path: "/groups/{{group_name}}/users"
          inputParameters:
            - name: group_name
              in: path
          operations:
            - name: add-user-to-group
              method: PUT
    - type: http
      namespace: snowflake-access
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

Detects Okta users with anomalous sign-in behavior (impossible travel or new device), revokes their active sessions, logs the event to Snowflake, and alerts the Information Security Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Okta Session Anomaly Revocation"
  description: "Detects Okta users with anomalous sign-in behavior (impossible travel or new device), revokes their active sessions, logs the event to Snowflake, and alerts the Information Security Microsoft Teams channel."
  tags:
    - security
    - identity
    - okta
    - snowflake
    - microsoft-teams
    - session-management
    - threat-detection
capability:
  exposes:
    - type: mcp
      namespace: session-security
      port: 8080
      tools:
        - name: revoke-anomalous-session
          description: "Given an Okta user ID flagged for anomalous sign-in activity, revoke all active sessions, log the event to Snowflake for security audit, and alert the InformationSecurity Teams channel."
          inputParameters:
            - name: okta_user_id
              in: body
              type: string
              description: "Okta user ID whose sessions should be revoked due to anomalous activity."
            - name: anomaly_type
              in: body
              type: string
              description: "Type of anomaly detected, e.g. 'impossible_travel' or 'new_device_high_risk'."
          steps:
            - name: revoke-sessions
              type: call
              call: "okta-session.revoke-user-sessions"
              with:
                user_id: "{{okta_user_id}}"
            - name: log-event
              type: call
              call: "snowflake-session.insert-record"
              with:
                table: "SECURITY.SESSION_REVOCATIONS"
                user_id: "{{okta_user_id}}"
                anomaly_type: "{{anomaly_type}}"
                revoked_at: "{{revoke-sessions.revoked_at}}"
            - name: alert-infosec
              type: call
              call: "msteams-infosec.post-channel-message"
              with:
                channel_id: "InformationSecurity"
                text: "Session revocation: User {{okta_user_id}} — anomaly: {{anomaly_type}}. All sessions revoked and logged to Snowflake."
  consumes:
    - type: http
      namespace: okta-session
      baseUri: "https://morganstanley.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: user-sessions
          path: "/users/{{user_id}}/sessions"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: revoke-user-sessions
              method: DELETE
    - type: http
      namespace: snowflake-session
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: msteams-infosec
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

When Okta detects suspicious login activity, queries Splunk for correlated security events, creates a ServiceNow security incident, and alerts the SOC via Slack.

naftiko: "0.5"
info:
  label: "Okta Suspicious Activity to Splunk Investigation"
  description: "When Okta detects suspicious login activity, queries Splunk for correlated security events, creates a ServiceNow security incident, and alerts the SOC via Slack."
  tags:
    - security
    - soc
    - okta
    - splunk
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: security-investigation
      port: 8080
      tools:
        - name: investigate-suspicious-login
          description: "Given an Okta user ID and event ID, correlate with Splunk logs, create a security incident, and alert the SOC."
          inputParameters:
            - name: okta_user_id
              in: body
              type: string
              description: "Okta user ID with suspicious activity."
            - name: event_id
              in: body
              type: string
              description: "Okta system log event ID."
          steps:
            - name: get-okta-event
              type: call
              call: "okta-sec.get-event"
              with:
                event_id: "{{event_id}}"
            - name: search-splunk
              type: call
              call: "splunk-sec.create-search"
              with:
                search: "index=security sourcetype=okta user={{okta_user_id}} earliest=-24h"
            - name: create-security-incident
              type: call
              call: "snow-sec.create-incident"
              with:
                short_description: "Suspicious login: {{okta_user_id}}"
                description: "Okta event: {{event_id}}\nClient IP: {{get-okta-event.client_ip}}\nCorrelated events: {{search-splunk.result_count}}"
                category: "security"
                priority: "2"
            - name: alert-soc
              type: call
              call: "slack-soc.post-message"
              with:
                channel: "$secrets.soc_slack_channel"
                text: "Security Alert: Suspicious login for {{okta_user_id}} | {{search-splunk.result_count}} correlated events | Incident: {{create-security-incident.number}}"
  consumes:
    - type: http
      namespace: okta-sec
      baseUri: "https://morganstanley.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: events
          path: "/logs"
          operations:
            - name: get-event
              method: GET
    - type: http
      namespace: splunk-sec
      baseUri: "https://splunk.morganstanley.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: searches
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST
    - type: http
      namespace: snow-sec
      baseUri: "https://morganstanley.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: slack-soc
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks the current status and last login time for an Okta user account, supporting identity verification and access review workflows.

naftiko: "0.5"
info:
  label: "Okta User Status Check"
  description: "Checks the current status and last login time for an Okta user account, supporting identity verification and access review workflows."
  tags:
    - security
    - identity
    - okta
capability:
  exposes:
    - type: mcp
      namespace: okta-status
      port: 8080
      tools:
        - name: check-user-status
          description: "Given an Okta user login email, return their account status, last login time, and MFA enrollment state."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "User's Okta login email address."
          call: "okta-users.get-user"
          with:
            login: "{{user_login}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: last_login
              type: string
              mapping: "$.lastLogin"
  consumes:
    - type: http
      namespace: okta-users
      baseUri: "https://morganstanley.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{login}}"
          inputParameters:
            - name: login
              in: path
          operations:
            - name: get-user
              method: GET

Returns the current on-call engineer for a given PagerDuty schedule, supporting rapid incident escalation and team coordination.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Lookup"
  description: "Returns the current on-call engineer for a given PagerDuty schedule, supporting rapid incident escalation and team coordination."
  tags:
    - incident-management
    - on-call
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: oncall-lookup
      port: 8080
      tools:
        - name: get-on-call
          description: "Given a PagerDuty schedule ID, return the current on-call user's name, email, and escalation level."
          inputParameters:
            - name: schedule_id
              in: body
              type: string
              description: "PagerDuty schedule ID."
          call: "pagerduty-api.get-oncall"
          with:
            schedule_id: "{{schedule_id}}"
          outputParameters:
            - name: user_name
              type: string
              mapping: "$.oncalls[0].user.name"
            - name: user_email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - type: http
      namespace: pagerduty-api
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: oncalls
          path: "/oncalls"
          inputParameters:
            - name: schedule_id
              in: query
          operations:
            - name: get-oncall
              method: GET

Fetches the current PagerDuty on-call schedule, updates the On-Call rotation in SharePoint, and posts the weekly on-call roster to the Operations Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Sync"
  description: "Fetches the current PagerDuty on-call schedule, updates the On-Call rotation in SharePoint, and posts the weekly on-call roster to the Operations Microsoft Teams channel."
  tags:
    - itsm
    - pagerduty
    - sharepoint
    - microsoft-teams
    - on-call
    - operations
capability:
  exposes:
    - type: mcp
      namespace: oncall-sync
      port: 8080
      tools:
        - name: sync-oncall-roster
          description: "Given a PagerDuty schedule ID, fetch the current on-call rotation, update the on-call SharePoint list, and post the weekly roster to the Operations Teams channel."
          inputParameters:
            - name: pagerduty_schedule_id
              in: body
              type: string
              description: "PagerDuty schedule ID to fetch on-call rotation from."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID where the on-call roster list is maintained."
          steps:
            - name: get-oncall-schedule
              type: call
              call: "pagerduty-schedule.get-schedule"
              with:
                schedule_id: "{{pagerduty_schedule_id}}"
            - name: update-sharepoint-roster
              type: call
              call: "sharepoint-oncall.create-file"
              with:
                site_id: "{{sharepoint_site_id}}"
                file_name: "OnCall_Roster_Current.csv"
                content: "{{get-oncall-schedule.roster_csv}}"
            - name: post-roster
              type: call
              call: "msteams-ops.post-channel-message"
              with:
                channel_id: "Operations"
                text: "On-call roster updated for schedule {{pagerduty_schedule_id}}. Current on-call: {{get-oncall-schedule.current_oncall}}. Roster: {{update-sharepoint-roster.file_url}}"
  consumes:
    - type: http
      namespace: pagerduty-schedule
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: schedules
          path: "/schedules/{{schedule_id}}"
          inputParameters:
            - name: schedule_id
              in: path
          operations:
            - name: get-schedule
              method: GET
    - type: http
      namespace: sharepoint-oncall
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-file
              method: POST
    - type: http
      namespace: msteams-ops
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks the last refresh status and timestamp for a Power BI dataset, supporting data freshness monitoring for financial dashboards.

naftiko: "0.5"
info:
  label: "Power BI Dataset Refresh Status"
  description: "Checks the last refresh status and timestamp for a Power BI dataset, supporting data freshness monitoring for financial dashboards."
  tags:
    - reporting
    - business-intelligence
    - power-bi
capability:
  exposes:
    - type: mcp
      namespace: pbi-refresh
      port: 8080
      tools:
        - name: get-refresh-status
          description: "Given a Power BI group ID and dataset ID, return the last refresh status, end time, and any error message."
          inputParameters:
            - name: group_id
              in: body
              type: string
              description: "Power BI workspace (group) ID."
            - name: dataset_id
              in: body
              type: string
              description: "Power BI dataset ID."
          call: "pbi-api.get-refresh-history"
          with:
            group_id: "{{group_id}}"
            dataset_id: "{{dataset_id}}"
  consumes:
    - type: http
      namespace: pbi-api
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: get-refresh-history
              method: GET

Refreshes Snowflake data warehouse views, triggers Power BI dataset refresh, and posts a readiness notification to the executive reporting Slack channel.

naftiko: "0.5"
info:
  label: "Power BI Executive Dashboard Pipeline"
  description: "Refreshes Snowflake data warehouse views, triggers Power BI dataset refresh, and posts a readiness notification to the executive reporting Slack channel."
  tags:
    - reporting
    - executive
    - snowflake
    - power-bi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: exec-dashboard
      port: 8080
      tools:
        - name: refresh-executive-dashboard
          description: "Refresh Snowflake views and Power BI datasets for executive dashboards."
          inputParameters:
            - name: dashboard_name
              in: body
              type: string
              description: "Name of the executive dashboard to refresh."
          steps:
            - name: refresh-snowflake
              type: call
              call: "snowflake-exec.execute-query"
              with:
                statement: "CALL EXEC_REPORTING.REFRESH_VIEWS('{{dashboard_name}}')"
            - name: refresh-pbi
              type: call
              call: "pbi-exec.trigger-refresh"
              with:
                group_id: "$secrets.pbi_exec_workspace_id"
                dataset_id: "$secrets.pbi_exec_dataset_id"
            - name: notify-ready
              type: call
              call: "slack-exec.post-message"
              with:
                channel: "$secrets.exec_reporting_channel"
                text: "Executive Dashboard '{{dashboard_name}}' refreshed and ready for review."
  consumes:
    - type: http
      namespace: snowflake-exec
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: pbi-exec
      baseUri: "https://api.powerbi.com/v1.0/myorg"
      authentication:
        type: bearer
        token: "$secrets.powerbi_token"
      resources:
        - name: refreshes
          path: "/groups/{{group_id}}/datasets/{{dataset_id}}/refreshes"
          inputParameters:
            - name: group_id
              in: path
            - name: dataset_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST
    - type: http
      namespace: slack-exec
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Snowflake for quarterly risk metrics, generates a summary report using Anthropic Claude, and publishes to Confluence with a Microsoft Teams notification.

naftiko: "0.5"
info:
  label: "Quarterly Risk Report Generation"
  description: "Queries Snowflake for quarterly risk metrics, generates a summary report using Anthropic Claude, and publishes to Confluence with a Microsoft Teams notification."
  tags:
    - risk-management
    - reporting
    - snowflake
    - anthropic
    - confluence
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: risk-report
      port: 8080
      tools:
        - name: generate-quarterly-risk-report
          description: "Given a fiscal quarter, generate a risk report from Snowflake data, summarize with Claude, and publish to Confluence."
          inputParameters:
            - name: fiscal_quarter
              in: body
              type: string
              description: "Fiscal quarter (e.g., Q1-2026)."
          steps:
            - name: get-risk-metrics
              type: call
              call: "snowflake-risk.execute-query"
              with:
                statement: "SELECT risk_category, var_95, expected_shortfall, stress_test_result FROM risk.quarterly_metrics WHERE quarter = '{{fiscal_quarter}}'"
            - name: generate-summary
              type: call
              call: "anthropic-risk.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                content: "Generate an executive summary of quarterly risk metrics for {{fiscal_quarter}}: {{get-risk-metrics.data}}. Include key findings and recommendations."
            - name: publish-report
              type: call
              call: "confluence-risk.create-page"
              with:
                space: "RISK"
                title: "Quarterly Risk Report - {{fiscal_quarter}}"
                body: "{{generate-summary.text}}"
  consumes:
    - type: http
      namespace: snowflake-risk
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: anthropic-risk
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: confluence-risk
      baseUri: "https://morganstanley.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Retrieves key financial fundamentals for a company from Refinitiv, including market cap, P/E ratio, and revenue, for investment research support.

naftiko: "0.5"
info:
  label: "Refinitiv Company Fundamentals Lookup"
  description: "Retrieves key financial fundamentals for a company from Refinitiv, including market cap, P/E ratio, and revenue, for investment research support."
  tags:
    - research
    - market-data
    - refinitiv
capability:
  exposes:
    - type: mcp
      namespace: fundamentals
      port: 8080
      tools:
        - name: get-company-fundamentals
          description: "Given a Refinitiv instrument code (RIC), return the company's market capitalization, P/E ratio, EPS, and last reported revenue."
          inputParameters:
            - name: ric
              in: body
              type: string
              description: "Refinitiv Instrument Code (e.g., MSFT.O)."
          call: "refinitiv-data.get-fundamentals"
          with:
            instrument: "{{ric}}"
          outputParameters:
            - name: market_cap
              type: string
              mapping: "$.market_cap"
            - name: pe_ratio
              type: string
              mapping: "$.pe_ratio"
  consumes:
    - type: http
      namespace: refinitiv-data
      baseUri: "https://api.refinitiv.com/data/v1"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: fundamentals
          path: "/instruments/{{instrument}}/fundamentals"
          inputParameters:
            - name: instrument
              in: path
          operations:
            - name: get-fundamentals
              method: GET

Queries Snowflake for upcoming regulatory filing deadlines, creates Jira tracking tickets, and sends a digest to the compliance Slack channel.

naftiko: "0.5"
info:
  label: "Regulatory Filing Deadline Tracker"
  description: "Queries Snowflake for upcoming regulatory filing deadlines, creates Jira tracking tickets, and sends a digest to the compliance Slack channel."
  tags:
    - compliance
    - regulatory
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: reg-filing
      port: 8080
      tools:
        - name: track-upcoming-filings
          description: "Query upcoming regulatory filing deadlines and create tracking tickets with Slack notification."
          inputParameters:
            - name: days_ahead
              in: body
              type: number
              description: "Number of days ahead to look for filing deadlines."
          steps:
            - name: get-deadlines
              type: call
              call: "snowflake-reg.execute-query"
              with:
                statement: "SELECT filing_type, jurisdiction, deadline_date FROM compliance.regulatory_filings WHERE deadline_date BETWEEN CURRENT_DATE AND DATEADD(day, {{days_ahead}}, CURRENT_DATE) AND status = 'PENDING'"
            - name: create-tracking-ticket
              type: call
              call: "jira-reg.create-issue"
              with:
                project_key: "COMPLIANCE"
                issuetype: "Task"
                summary: "Regulatory filing due: {{get-deadlines.filing_type}}"
                description: "Deadline: {{get-deadlines.deadline_date}}\nJurisdiction: {{get-deadlines.jurisdiction}}"
            - name: send-digest
              type: call
              call: "slack-compliance.post-message"
              with:
                channel: "$secrets.compliance_slack_channel"
                text: "Regulatory Filing Digest: filings due in next {{days_ahead}} days. Jira tickets created."
  consumes:
    - type: http
      namespace: snowflake-reg
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira-reg
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack-compliance
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

At period close, queries Snowflake for required regulatory metrics, generates a PDF report via an internal reporting service, uploads it to SharePoint for compliance archival, and notifies the Regulatory Reporting Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Regulatory Reporting Period Close"
  description: "At period close, queries Snowflake for required regulatory metrics, generates a PDF report via an internal reporting service, uploads it to SharePoint for compliance archival, and notifies the Regulatory Reporting Microsoft Teams channel."
  tags:
    - compliance
    - finance
    - snowflake
    - sharepoint
    - microsoft-teams
    - regulatory-reporting
    - period-close
capability:
  exposes:
    - type: mcp
      namespace: regulatory-reporting
      port: 8080
      tools:
        - name: run-period-close-report
          description: "Given a reporting period and regulation type (e.g. MiFID II, Basel III), query Snowflake for required metrics, save the report to SharePoint, and notify the Regulatory Reporting Teams channel."
          inputParameters:
            - name: reporting_period
              in: body
              type: string
              description: "Reporting period identifier, e.g. '2026-Q1'."
            - name: regulation_type
              in: body
              type: string
              description: "Regulatory framework for the report, e.g. 'MiFID_II', 'Basel_III', 'Dodd_Frank'."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID where the compliance report will be archived."
          steps:
            - name: query-metrics
              type: call
              call: "snowflake-regulatory.run-report-query"
              with:
                period: "{{reporting_period}}"
                regulation: "{{regulation_type}}"
            - name: upload-report
              type: call
              call: "sharepoint-regulatory.create-file"
              with:
                site_id: "{{sharepoint_site_id}}"
                file_name: "{{regulation_type}}_{{reporting_period}}_Report.csv"
                content: "{{query-metrics.csv_data}}"
            - name: notify-regulatory
              type: call
              call: "msteams-regulatory.post-channel-message"
              with:
                channel_id: "RegulatoryReporting"
                text: "{{regulation_type}} period close complete for {{reporting_period}}. Report archived: {{upload-report.file_url}}"
  consumes:
    - type: http
      namespace: snowflake-regulatory
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          inputParameters:
            - name: period
              in: query
            - name: regulation
              in: query
          operations:
            - name: run-report-query
              method: POST
    - type: http
      namespace: sharepoint-regulatory
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-file
              method: POST
    - type: http
      namespace: msteams-regulatory
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Checks the completion status of a SailPoint identity access review campaign, returning progress percentage and pending reviewers.

naftiko: "0.5"
info:
  label: "SailPoint Access Review Status"
  description: "Checks the completion status of a SailPoint identity access review campaign, returning progress percentage and pending reviewers."
  tags:
    - security
    - identity-governance
    - sailpoint
capability:
  exposes:
    - type: mcp
      namespace: sailpoint-review
      port: 8080
      tools:
        - name: get-review-status
          description: "Given a SailPoint access review campaign ID, return its completion percentage, total items, and pending reviewer count."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "SailPoint access review campaign ID."
          call: "sailpoint-api.get-campaign"
          with:
            id: "{{campaign_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.status"
            - name: completion_pct
              type: string
              mapping: "$.completionPercentage"
  consumes:
    - type: http
      namespace: sailpoint-api
      baseUri: "https://morganstanley.api.identitynow.com/v3"
      authentication:
        type: bearer
        token: "$secrets.sailpoint_token"
      resources:
        - name: campaigns
          path: "/campaigns/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-campaign
              method: GET

Returns account name, industry, AUM tier, and relationship manager for a Salesforce account ID, supporting client relationship review.

naftiko: "0.5"
info:
  label: "Salesforce Account Detail Lookup"
  description: "Returns account name, industry, AUM tier, and relationship manager for a Salesforce account ID, supporting client relationship review."
  tags:
    - crm
    - client-management
    - salesforce
capability:
  exposes:
    - type: mcp
      namespace: sfdc-account
      port: 8080
      tools:
        - name: get-account-details
          description: "Given a Salesforce account ID, return the account name, industry, AUM tier, and owner details."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account record ID."
          call: "sfdc-acct.get-account"
          with:
            id: "{{account_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.Name"
            - name: industry
              type: string
              mapping: "$.Industry"
            - name: owner
              type: string
              mapping: "$.Owner.Name"
  consumes:
    - type: http
      namespace: sfdc-acct
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-account
              method: GET

Analyzes client engagement metrics from Salesforce and Snowflake, identifies churn risk accounts, and creates retention tasks for relationship managers with Teams notifications.

naftiko: "0.5"
info:
  label: "Salesforce Client Churn Risk Alert"
  description: "Analyzes client engagement metrics from Salesforce and Snowflake, identifies churn risk accounts, and creates retention tasks for relationship managers with Teams notifications."
  tags:
    - client-retention
    - analytics
    - salesforce
    - snowflake
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: churn-risk
      port: 8080
      tools:
        - name: identify-churn-risk
          description: "Given a risk threshold score, identify at-risk accounts and create retention tasks."
          inputParameters:
            - name: risk_threshold
              in: body
              type: number
              description: "Churn risk score threshold (0-100)."
          steps:
            - name: get-risk-scores
              type: call
              call: "snowflake-churn.execute-query"
              with:
                statement: "SELECT account_id, account_name, churn_risk_score, last_interaction_days FROM analytics.client_churn_model WHERE churn_risk_score > {{risk_threshold}} ORDER BY churn_risk_score DESC"
            - name: create-retention-task
              type: call
              call: "sfdc-churn.create-task"
              with:
                subject: "Retention outreach: {{get-risk-scores.account_name}}"
                description: "Churn risk score: {{get-risk-scores.churn_risk_score}}\nDays since last interaction: {{get-risk-scores.last_interaction_days}}"
                priority: "High"
            - name: notify-rm
              type: call
              call: "teams-churn.send-message"
              with:
                channel_id: "$secrets.wm_teams_channel"
                text: "Churn Risk Alert: {{get-risk-scores.account_name}} (Score: {{get-risk-scores.churn_risk_score}}). Retention task created in Salesforce."
  consumes:
    - type: http
      namespace: snowflake-churn
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sfdc-churn
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: teams-churn
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.wm_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Logs completed client meeting activities from Microsoft Teams calendar events to Salesforce as Activity records, ensuring CRM data remains current for wealth management and investment banking relationship tracking.

naftiko: "0.5"
info:
  label: "Salesforce Client Meeting Activity Logger"
  description: "Logs completed client meeting activities from Microsoft Teams calendar events to Salesforce as Activity records, ensuring CRM data remains current for wealth management and investment banking relationship tracking."
  tags:
    - sales
    - crm
    - salesforce
    - microsoft-teams
    - activity-logging
    - wealth-management
capability:
  exposes:
    - type: mcp
      namespace: activity-logging
      port: 8080
      tools:
        - name: log-client-meeting-to-salesforce
          description: "Given a Microsoft Graph calendar event ID for a completed client meeting and a Salesforce contact ID, create a Salesforce Activity record linking the meeting details to the contact."
          inputParameters:
            - name: event_id
              in: body
              type: string
              description: "Microsoft Graph calendar event ID for the completed client meeting."
            - name: salesforce_contact_id
              in: body
              type: string
              description: "Salesforce contact ID representing the client who attended the meeting."
            - name: user_upn
              in: body
              type: string
              description: "UPN of the employee whose calendar the event belongs to."
          steps:
            - name: get-calendar-event
              type: call
              call: "msgraph-calendar.get-event"
              with:
                user_upn: "{{user_upn}}"
                event_id: "{{event_id}}"
            - name: log-to-salesforce
              type: call
              call: "salesforce-activity.create-task"
              with:
                contact_id: "{{salesforce_contact_id}}"
                subject: "{{get-calendar-event.subject}}"
                activity_date: "{{get-calendar-event.start_datetime}}"
                description: "Meeting duration: {{get-calendar-event.duration_minutes}} min. Attendees: {{get-calendar-event.attendee_count}}"
  consumes:
    - type: http
      namespace: msgraph-calendar
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: calendar-events
          path: "/users/{{user_upn}}/events/{{event_id}}"
          inputParameters:
            - name: user_upn
              in: path
            - name: event_id
              in: path
          operations:
            - name: get-event
              method: GET
    - type: http
      namespace: salesforce-activity
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: tasks
          path: "/sobjects/Task"
          operations:
            - name: create-task
              method: POST

When a Salesforce opportunity is marked Closed Won, logs the deal to Snowflake, updates the leaderboard in Power BI, and posts a celebration to the sales Slack channel.

naftiko: "0.5"
info:
  label: "Salesforce Deal Closure Celebration Notification"
  description: "When a Salesforce opportunity is marked Closed Won, logs the deal to Snowflake, updates the leaderboard in Power BI, and posts a celebration to the sales Slack channel."
  tags:
    - sales
    - crm
    - salesforce
    - snowflake
    - power-bi
    - slack
capability:
  exposes:
    - type: mcp
      namespace: deal-celebration
      port: 8080
      tools:
        - name: celebrate-deal-closure
          description: "Given a Salesforce opportunity ID that closed won, log to Snowflake and celebrate in Slack."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "Salesforce opportunity ID."
          steps:
            - name: get-deal
              type: call
              call: "sfdc-deal.get-opportunity"
              with:
                opp_id: "{{opportunity_id}}"
            - name: log-to-snowflake
              type: call
              call: "snowflake-deal.insert-record"
              with:
                table: "SALES.CLOSED_WON_DEALS"
                opp_id: "{{opportunity_id}}"
                amount: "{{get-deal.amount}}"
                owner: "{{get-deal.owner_name}}"
            - name: celebrate
              type: call
              call: "slack-sales.post-message"
              with:
                channel: "$secrets.sales_celebration_channel"
                text: "Deal Closed Won! {{get-deal.name}} - ${{get-deal.amount}} by {{get-deal.owner_name}}. Account: {{get-deal.account_name}}"
  consumes:
    - type: http
      namespace: sfdc-deal
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity/{{opp_id}}"
          inputParameters:
            - name: opp_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - type: http
      namespace: snowflake-deal
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: slack-sales
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Salesforce for open opportunities by close date range, aggregates pipeline value by stage, and posts a weekly forecast digest to the Investment Banking Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Salesforce Pipeline Forecast Report"
  description: "Queries Salesforce for open opportunities by close date range, aggregates pipeline value by stage, and posts a weekly forecast digest to the Investment Banking Microsoft Teams channel."
  tags:
    - sales
    - crm
    - salesforce
    - microsoft-teams
    - forecasting
    - investment-banking
capability:
  exposes:
    - type: mcp
      namespace: pipeline-forecasting
      port: 8080
      tools:
        - name: digest-pipeline-forecast
          description: "Given a close date range, query Salesforce for open opportunities, aggregate pipeline value by stage, and post a forecast digest to the Investment Banking Teams channel."
          inputParameters:
            - name: close_date_start
              in: body
              type: string
              description: "Start of the close date window in ISO 8601 format."
            - name: close_date_end
              in: body
              type: string
              description: "End of the close date window in ISO 8601 format."
          steps:
            - name: get-opportunities
              type: call
              call: "salesforce-forecast.list-opportunities"
              with:
                close_date_gte: "{{close_date_start}}"
                close_date_lte: "{{close_date_end}}"
            - name: post-forecast
              type: call
              call: "msteams-ib.post-channel-message"
              with:
                channel_id: "InvestmentBanking"
                text: "Pipeline forecast {{close_date_start}} to {{close_date_end}}: Total ${{get-opportunities.total_value}} across {{get-opportunities.count}} opportunities. Weighted: ${{get-opportunities.weighted_value}}"
  consumes:
    - type: http
      namespace: salesforce-forecast
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          inputParameters:
            - name: close_date_gte
              in: query
            - name: close_date_lte
              in: query
          operations:
            - name: list-opportunities
              method: GET
    - type: http
      namespace: msteams-ib
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Extracts client relationship data from Salesforce, pulls revenue metrics from Snowflake, and generates a QBR deck outline via Anthropic Claude stored in Confluence.

naftiko: "0.5"
info:
  label: "Salesforce Quarterly Business Review Prep"
  description: "Extracts client relationship data from Salesforce, pulls revenue metrics from Snowflake, and generates a QBR deck outline via Anthropic Claude stored in Confluence."
  tags:
    - client-management
    - qbr
    - salesforce
    - snowflake
    - anthropic
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: qbr-prep
      port: 8080
      tools:
        - name: prepare-qbr
          description: "Given a Salesforce account ID and quarter, generate a QBR outline and store in Confluence."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "Salesforce account ID."
            - name: quarter
              in: body
              type: string
              description: "Fiscal quarter for the QBR."
          steps:
            - name: get-account-data
              type: call
              call: "sfdc-qbr.get-account"
              with:
                id: "{{account_id}}"
            - name: get-revenue-metrics
              type: call
              call: "snowflake-qbr.execute-query"
              with:
                statement: "SELECT total_revenue, product_breakdown, yoy_growth FROM finance.client_revenue WHERE account_id = '{{account_id}}' AND quarter = '{{quarter}}'"
            - name: generate-outline
              type: call
              call: "anthropic-qbr.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                content: "Generate a QBR deck outline for {{get-account-data.name}}, {{quarter}}. Revenue: {{get-revenue-metrics.total_revenue}}, Growth: {{get-revenue-metrics.yoy_growth}}."
            - name: store-outline
              type: call
              call: "confluence-qbr.create-page"
              with:
                space: "CLIENT"
                title: "QBR - {{get-account-data.name}} - {{quarter}}"
                body: "{{generate-outline.text}}"
  consumes:
    - type: http
      namespace: sfdc-qbr
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/sobjects/Account/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-account
              method: GET
    - type: http
      namespace: snowflake-qbr
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: anthropic-qbr
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: confluence-qbr
      baseUri: "https://morganstanley.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST

Enriches Salesforce wealth management client records with LinkedIn professional data and Bloomberg financial summaries, then flags high-net-worth leads for advisor follow-up via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Salesforce Wealth Management Client Enrichment"
  description: "Enriches Salesforce wealth management client records with LinkedIn professional data and Bloomberg financial summaries, then flags high-net-worth leads for advisor follow-up via Microsoft Teams."
  tags:
    - sales
    - wealth-management
    - salesforce
    - linkedin
    - microsoft-teams
    - client-enrichment
capability:
  exposes:
    - type: mcp
      namespace: wealth-enrichment
      port: 8080
      tools:
        - name: enrich-wealth-client
          description: "Given a Salesforce contact ID for a wealth management prospect, enrich with LinkedIn profile data, update the Salesforce record, and post an advisor follow-up reminder to the Wealth Management Teams channel."
          inputParameters:
            - name: contact_id
              in: body
              type: string
              description: "Salesforce contact ID for the wealth management prospect to enrich."
          steps:
            - name: get-contact
              type: call
              call: "salesforce-wealth.get-contact"
              with:
                contact_id: "{{contact_id}}"
            - name: enrich-linkedin
              type: call
              call: "linkedin-wealth.search-profile"
              with:
                name: "{{get-contact.full_name}}"
                company: "{{get-contact.account_name}}"
            - name: update-contact
              type: call
              call: "salesforce-wealth.update-contact"
              with:
                contact_id: "{{contact_id}}"
                linkedin_url: "{{enrich-linkedin.profile_url}}"
                title: "{{enrich-linkedin.headline}}"
            - name: notify-advisor
              type: call
              call: "msteams-wealth.post-channel-message"
              with:
                channel_id: "WealthManagement"
                text: "Client enriched: {{get-contact.full_name}} | LinkedIn: {{enrich-linkedin.profile_url}} | Advisor follow-up recommended."
  consumes:
    - type: http
      namespace: salesforce-wealth
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: contacts
          path: "/sobjects/Contact/{{contact_id}}"
          inputParameters:
            - name: contact_id
              in: path
          operations:
            - name: get-contact
              method: GET
            - name: update-contact
              method: PATCH
    - type: http
      namespace: linkedin-wealth
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: profiles
          path: "/people"
          inputParameters:
            - name: name
              in: query
            - name: company
              in: query
          operations:
            - name: search-profile
              method: GET
    - type: http
      namespace: msteams-wealth
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Audits submitted SAP Concur expense reports against Morgan Stanley's expense policy, flags out-of-policy items, and notifies the Finance compliance Microsoft Teams channel with a summary.

naftiko: "0.5"
info:
  label: "SAP Concur Expense Audit"
  description: "Audits submitted SAP Concur expense reports against Morgan Stanley's expense policy, flags out-of-policy items, and notifies the Finance compliance Microsoft Teams channel with a summary."
  tags:
    - finance
    - expense-management
    - sap-concur
    - microsoft-teams
    - audit
    - compliance
capability:
  exposes:
    - type: mcp
      namespace: expense-audit
      port: 8080
      tools:
        - name: audit-expense-reports
          description: "Given an expense submission period, fetch submitted SAP Concur expense reports, flag any line items violating expense policy (amount over threshold, missing receipt), and post a violation summary to Finance Teams."
          inputParameters:
            - name: period_start
              in: body
              type: string
              description: "Start of the expense audit period in ISO 8601 format."
            - name: period_end
              in: body
              type: string
              description: "End of the expense audit period in ISO 8601 format."
            - name: policy_limit_usd
              in: body
              type: number
              description: "Maximum allowed single expense amount in USD before flagging."
          steps:
            - name: get-expense-reports
              type: call
              call: "sap-concur-audit.list-reports"
              with:
                status: "Submitted"
                start_date: "{{period_start}}"
                end_date: "{{period_end}}"
            - name: notify-finance
              type: call
              call: "msteams-expense.post-channel-message"
              with:
                channel_id: "FinanceCompliance"
                text: "Expense audit: {{get-expense-reports.count}} reports for {{period_start}} to {{period_end}}. Policy violations: {{get-expense-reports.violation_count}} items over ${{policy_limit_usd}}."
  consumes:
    - type: http
      namespace: sap-concur-audit
      baseUri: "https://www.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: expense-reports
          path: "/expense/reports"
          inputParameters:
            - name: status
              in: query
            - name: start_date
              in: query
            - name: end_date
              in: query
          operations:
            - name: list-reports
              method: GET
    - type: http
      namespace: msteams-expense
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Detects travel expense policy violations in SAP Concur, creates a compliance case in ServiceNow, and notifies the employee's manager via Microsoft Teams.

naftiko: "0.5"
info:
  label: "SAP Concur Travel Policy Violation Alert"
  description: "Detects travel expense policy violations in SAP Concur, creates a compliance case in ServiceNow, and notifies the employee's manager via Microsoft Teams."
  tags:
    - finance
    - travel
    - sap-concur
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: travel-compliance
      port: 8080
      tools:
        - name: flag-policy-violation
          description: "Given a Concur expense report ID, check for policy violations, create a ServiceNow case, and notify the manager."
          inputParameters:
            - name: report_id
              in: body
              type: string
              description: "SAP Concur expense report ID."
          steps:
            - name: get-expense-report
              type: call
              call: "concur-travel.get-report"
              with:
                report_id: "{{report_id}}"
            - name: create-compliance-case
              type: call
              call: "snow-travel.create-case"
              with:
                short_description: "Travel policy violation: Report {{report_id}}"
                description: "Employee: {{get-expense-report.employee_name}}\nTotal: ${{get-expense-report.total_amount}}"
                assignment_group: "Travel_Compliance"
            - name: notify-manager
              type: call
              call: "teams-mgr.send-message"
              with:
                recipient_upn: "{{get-expense-report.manager_email}}"
                text: "Travel policy violation flagged for {{get-expense-report.employee_name}} - Report {{report_id}}. Case: {{create-compliance-case.number}}"
  consumes:
    - type: http
      namespace: concur-travel
      baseUri: "https://us.api.concursolutions.com/api/v3.0"
      authentication:
        type: bearer
        token: "$secrets.concur_token"
      resources:
        - name: reports
          path: "/expense/reports/{{report_id}}"
          inputParameters:
            - name: report_id
              in: path
          operations:
            - name: get-report
              method: GET
    - type: http
      namespace: snow-travel
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cases
          path: "/table/sn_compliance_case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: teams-mgr
      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 pending invoices from SAP, creates approval tasks in ServiceNow, and notifies the finance team via Microsoft Teams when invoices exceed threshold.

naftiko: "0.5"
info:
  label: "SAP Invoice Approval and Payment Routing"
  description: "Retrieves pending invoices from SAP, creates approval tasks in ServiceNow, and notifies the finance team via Microsoft Teams when invoices exceed threshold."
  tags:
    - finance
    - procurement
    - sap
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: invoice-approval
      port: 8080
      tools:
        - name: route-invoice-for-approval
          description: "Given an SAP invoice number, retrieve details, create a ServiceNow approval task, and notify finance via Teams."
          inputParameters:
            - name: invoice_number
              in: body
              type: string
              description: "SAP invoice document number."
          steps:
            - name: get-invoice
              type: call
              call: "sap-invoice.get-document"
              with:
                document_number: "{{invoice_number}}"
            - name: create-approval
              type: call
              call: "snow-approval.create-task"
              with:
                short_description: "Invoice approval: {{invoice_number}} - ${{get-invoice.amount}}"
                description: "Vendor: {{get-invoice.vendor_name}}\nAmount: ${{get-invoice.amount}}\nCost Center: {{get-invoice.cost_center}}"
                assignment_group: "Finance_AP"
            - name: notify-finance
              type: call
              call: "teams-finance.send-message"
              with:
                channel_id: "$secrets.finance_teams_channel"
                text: "Invoice {{invoice_number}} from {{get-invoice.vendor_name}} (${{get-invoice.amount}}) requires approval. ServiceNow: {{create-approval.number}}"
  consumes:
    - type: http
      namespace: sap-invoice
      baseUri: "https://morganstanley-sap.s4hana.cloud.sap/sap/opu/odata/sap"
      authentication:
        type: basic
        username: "$secrets.sap_user"
        password: "$secrets.sap_password"
      resources:
        - name: invoices
          path: "/API_SUPPLIER_INVOICE_PROCESS_SRV/A_SupplierInvoice('{{document_number}}')"
          inputParameters:
            - name: document_number
              in: path
          operations:
            - name: get-document
              method: GET
    - type: http
      namespace: snow-approval
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: tasks
          path: "/table/sc_task"
          operations:
            - name: create-task
              method: POST
    - type: http
      namespace: teams-finance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.finance_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Processes IT asset retirements by updating ServiceNow CMDB records, triggering data wipe verification via Jira, and logging to Snowflake for audit.

naftiko: "0.5"
info:
  label: "ServiceNow Asset Lifecycle Retirement"
  description: "Processes IT asset retirements by updating ServiceNow CMDB records, triggering data wipe verification via Jira, and logging to Snowflake for audit."
  tags:
    - asset-management
    - lifecycle
    - servicenow
    - jira
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: asset-retire
      port: 8080
      tools:
        - name: retire-asset
          description: "Given a ServiceNow asset tag, process the retirement workflow."
          inputParameters:
            - name: asset_tag
              in: body
              type: string
              description: "ServiceNow asset tag to retire."
          steps:
            - name: get-asset
              type: call
              call: "snow-asset.get-ci"
              with:
                asset_tag: "{{asset_tag}}"
            - name: create-wipe-ticket
              type: call
              call: "jira-asset.create-issue"
              with:
                project_key: "ITSEC"
                issuetype: "Task"
                summary: "Data wipe verification: {{asset_tag}}"
                description: "Asset: {{get-asset.name}}\nType: {{get-asset.ci_type}}\nSerial: {{get-asset.serial_number}}\nVerify data wipe before disposal."
            - name: log-retirement
              type: call
              call: "snowflake-asset.insert-record"
              with:
                table: "IT.ASSET_RETIREMENT_LOG"
                asset_tag: "{{asset_tag}}"
                ci_type: "{{get-asset.ci_type}}"
                wipe_ticket: "{{create-wipe-ticket.key}}"
  consumes:
    - type: http
      namespace: snow-asset
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci"
          operations:
            - name: get-ci
              method: GET
    - type: http
      namespace: jira-asset
      baseUri: "https://morganstanley.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: snowflake-asset
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

Aggregates pending ServiceNow change requests for the weekly CAB review, posts a pre-read digest to SharePoint, and sends the meeting agenda to the Change Management Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "ServiceNow Change Advisory Board Automation"
  description: "Aggregates pending ServiceNow change requests for the weekly CAB review, posts a pre-read digest to SharePoint, and sends the meeting agenda to the Change Management Microsoft Teams channel."
  tags:
    - itsm
    - change-management
    - servicenow
    - sharepoint
    - microsoft-teams
    - cab
capability:
  exposes:
    - type: mcp
      namespace: cab-automation
      port: 8080
      tools:
        - name: prepare-cab-agenda
          description: "Fetch all ServiceNow change requests in Scheduled state for the upcoming week, generate a CAB pre-read in SharePoint, and post the meeting agenda to the ChangeManagement Teams channel."
          inputParameters:
            - name: cab_date
              in: body
              type: string
              description: "Date of the CAB meeting in ISO 8601 format."
            - name: sharepoint_site_id
              in: body
              type: string
              description: "SharePoint site ID where the CAB pre-read will be saved."
          steps:
            - name: get-pending-changes
              type: call
              call: "servicenow-cab.list-changes"
              with:
                state: "Scheduled"
                cab_date: "{{cab_date}}"
            - name: create-preread
              type: call
              call: "sharepoint-cab.create-file"
              with:
                site_id: "{{sharepoint_site_id}}"
                file_name: "CAB_PreRead_{{cab_date}}.csv"
                content: "{{get-pending-changes.csv_data}}"
            - name: post-agenda
              type: call
              call: "msteams-cab.post-channel-message"
              with:
                channel_id: "ChangeManagement"
                text: "CAB pre-read ready for {{cab_date}}: {{get-pending-changes.change_count}} changes scheduled. Pre-read: {{create-preread.file_url}}"
  consumes:
    - type: http
      namespace: servicenow-cab
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: change-requests
          path: "/table/change_request"
          inputParameters:
            - name: state
              in: query
            - name: cab_date
              in: query
          operations:
            - name: list-changes
              method: GET
    - type: http
      namespace: sharepoint-cab
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: drive-items
          path: "/sites/{{site_id}}/drive/root/children"
          inputParameters:
            - name: site_id
              in: path
          operations:
            - name: create-file
              method: POST
    - type: http
      namespace: msteams-cab
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Evaluates a ServiceNow change request by querying Datadog for service health, checks the deployment window, and posts a risk assessment to the CAB Slack channel.

naftiko: "0.5"
info:
  label: "ServiceNow Change Risk Assessment"
  description: "Evaluates a ServiceNow change request by querying Datadog for service health, checks the deployment window, and posts a risk assessment to the CAB Slack channel."
  tags:
    - change-management
    - risk
    - servicenow
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: change-risk
      port: 8080
      tools:
        - name: assess-change-risk
          description: "Given a ServiceNow change request number, check service health in Datadog and post a risk assessment to the CAB channel."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "ServiceNow change request number."
          steps:
            - name: get-change-request
              type: call
              call: "snow-change.get-change"
              with:
                number: "{{change_number}}"
            - name: check-service-health
              type: call
              call: "datadog-change.get-service-health"
              with:
                service: "{{get-change-request.cmdb_ci}}"
            - name: post-risk-assessment
              type: call
              call: "slack-cab.post-message"
              with:
                channel: "$secrets.cab_slack_channel"
                text: "Change Risk Assessment: {{change_number}}\nService: {{get-change-request.cmdb_ci}}\nHealth: {{check-service-health.overall_state}}\nRisk Level: {{get-change-request.risk}}\nWindow: {{get-change-request.planned_start}} - {{get-change-request.planned_end}}"
  consumes:
    - type: http
      namespace: snow-change
      baseUri: "https://morganstanley.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: get-change
              method: GET
    - type: http
      namespace: datadog-change
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: services
          path: "/service_level_objectives"
          operations:
            - name: get-service-health
              method: GET
    - type: http
      namespace: slack-cab
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Reconciles ServiceNow CMDB records against Azure resource inventory, flags discrepancies in a Jira ticket, and notifies the asset management team via Slack.

naftiko: "0.5"
info:
  label: "ServiceNow CMDB Asset Reconciliation"
  description: "Reconciles ServiceNow CMDB records against Azure resource inventory, flags discrepancies in a Jira ticket, and notifies the asset management team via Slack."
  tags:
    - asset-management
    - cmdb
    - servicenow
    - microsoft-azure
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cmdb-recon
      port: 8080
      tools:
        - name: reconcile-cmdb-assets
          description: "Given a resource group, reconcile Azure resources against ServiceNow CMDB and flag discrepancies."
          inputParameters:
            - name: resource_group
              in: body
              type: string
              description: "Azure resource group name to reconcile."
          steps:
            - name: get-azure-resources
              type: call
              call: "azure-recon.list-resources"
              with:
                resource_group: "{{resource_group}}"
            - name: get-cmdb-records
              type: call
              call: "snow-recon.query-cmdb"
              with:
                resource_group: "{{resource_group}}"
            - name: create-discrepancy-ticket
              type: call
              call: "jira-recon.create-issue"
              with:
                project_key: "ASSET"
                issuetype: "Task"
                summary: "CMDB reconciliation: {{resource_group}}"
                description: "Azure resources: {{get-azure-resources.count}}\nCMDB records: {{get-cmdb-records.count}}\nDiscrepancies detected."
  consumes:
    - type: http
      namespace: azure-recon
      baseUri: "https://management.azure.com"
      authentication:
        type: bearer
        token: "$secrets.azure_mgmt_token"
      resources:
        - name: resources
          path: "/subscriptions/$secrets.azure_subscription_id/resourceGroups/{{resource_group}}/resources"
          inputParameters:
            - name: resource_group
              in: path
          operations:
            - name: list-resources
              method: GET
    - type: http
      namespace: snow-recon
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: cmdb
          path: "/table/cmdb_ci"
          operations:
            - name: query-cmdb
              method: GET
    - type: http
      namespace: jira-recon
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves the current status, priority, assigned group, and resolution notes for a ServiceNow incident by number.

naftiko: "0.5"
info:
  label: "ServiceNow Incident Status Lookup"
  description: "Retrieves the current status, priority, assigned group, and resolution notes for a ServiceNow incident by number."
  tags:
    - it-operations
    - incident-management
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: incident-lookup
      port: 8080
      tools:
        - name: get-incident-status
          description: "Given a ServiceNow incident number, return its current state, priority, assigned group, and short description."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow incident number (e.g., INC0012345)."
          call: "snow-incidents.get-incident"
          with:
            number: "{{incident_number}}"
          outputParameters:
            - name: state
              type: string
              mapping: "$.result.state"
            - name: priority
              type: string
              mapping: "$.result.priority"
  consumes:
    - type: http
      namespace: snow-incidents
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-incident
              method: GET

When a P1 incident is created in ServiceNow, automatically creates a Zoom bridge, posts details to the incident Slack channel, and pages the on-call via PagerDuty.

naftiko: "0.5"
info:
  label: "ServiceNow Major Incident Bridge Setup"
  description: "When a P1 incident is created in ServiceNow, automatically creates a Zoom bridge, posts details to the incident Slack channel, and pages the on-call via PagerDuty."
  tags:
    - incident-management
    - major-incident
    - servicenow
    - zoom
    - slack
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: major-incident
      port: 8080
      tools:
        - name: setup-incident-bridge
          description: "Given a ServiceNow incident number, create a Zoom bridge, post to Slack, and page the on-call engineer."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow P1 incident number."
            - name: service_id
              in: body
              type: string
              description: "PagerDuty service ID for the affected service."
          steps:
            - name: get-incident
              type: call
              call: "snow-mi.get-incident"
              with:
                number: "{{incident_number}}"
            - name: create-bridge
              type: call
              call: "zoom-mi.create-meeting"
              with:
                topic: "P1 Bridge: {{get-incident.short_description}}"
                duration: 120
            - name: notify-channel
              type: call
              call: "slack-mi.post-message"
              with:
                channel: "$secrets.incident_slack_channel"
                text: "P1 INCIDENT: {{incident_number}} - {{get-incident.short_description}}\nZoom Bridge: {{create-bridge.join_url}}\nPriority: {{get-incident.priority}}"
            - name: page-oncall
              type: call
              call: "pagerduty-mi.create-incident"
              with:
                service_id: "{{service_id}}"
                summary: "P1: {{get-incident.short_description}} | Bridge: {{create-bridge.join_url}}"
                severity: "critical"
  consumes:
    - type: http
      namespace: snow-mi
      baseUri: "https://morganstanley.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
    - type: http
      namespace: zoom-mi
      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: slack-mi
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - type: http
      namespace: pagerduty-mi
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_api_key"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

When a P1 ServiceNow incident is opened for a production trading system, pages the on-call engineer via PagerDuty, posts context to Microsoft Teams, and creates a Jira war room issue.

naftiko: "0.5"
info:
  label: "ServiceNow P1 Incident Escalation"
  description: "When a P1 ServiceNow incident is opened for a production trading system, pages the on-call engineer via PagerDuty, posts context to Microsoft Teams, and creates a Jira war room issue."
  tags:
    - itsm
    - incident-response
    - servicenow
    - pagerduty
    - microsoft-teams
    - jira
    - trading-systems
capability:
  exposes:
    - type: mcp
      namespace: p1-escalation
      port: 8080
      tools:
        - name: escalate-p1-incident
          description: "Given a ServiceNow P1 incident number for a trading system outage, trigger a PagerDuty alert to the on-call engineer, post context to the OnCall Teams channel, and open a Jira war room issue."
          inputParameters:
            - name: incident_number
              in: body
              type: string
              description: "ServiceNow P1 incident number, e.g. INC0012345."
            - name: affected_system
              in: body
              type: string
              description: "Name of the affected trading or production system."
            - name: pagerduty_service_id
              in: body
              type: string
              description: "PagerDuty service ID to trigger the alert on."
          steps:
            - name: get-incident
              type: call
              call: "servicenow-p1.get-incident"
              with:
                number: "{{incident_number}}"
            - name: trigger-pagerduty
              type: call
              call: "pagerduty.create-incident"
              with:
                service_id: "{{pagerduty_service_id}}"
                title: "P1: {{affected_system}} outage — {{incident_number}}"
                description: "{{get-incident.description}}"
            - name: open-war-room
              type: call
              call: "jira-p1.create-issue"
              with:
                project_key: "OPS"
                issuetype: "Incident"
                summary: "[WAR ROOM] P1: {{affected_system}} — {{incident_number}}"
                description: "SNOW: {{incident_number}}\nPagerDuty: {{trigger-pagerduty.incident_id}}"
            - name: alert-oncall
              type: call
              call: "msteams-p1.post-channel-message"
              with:
                channel_id: "OnCall"
                text: "P1 INCIDENT: {{affected_system}} | SNOW: {{incident_number}} | PD: {{trigger-pagerduty.incident_id}} | Jira: {{open-war-room.key}}"
  consumes:
    - type: http
      namespace: servicenow-p1
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incidents
          path: "/table/incident/{{number}}"
          inputParameters:
            - name: number
              in: path
          operations:
            - name: get-incident
              method: GET
    - type: http
      namespace: pagerduty
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incidents
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST
    - type: http
      namespace: jira-p1
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-p1
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Posts a message to a specified Slack channel, supporting automated notifications and team communication workflows.

naftiko: "0.5"
info:
  label: "Slack Channel Message Post"
  description: "Posts a message to a specified Slack channel, supporting automated notifications and team communication workflows."
  tags:
    - communications
    - messaging
    - slack
capability:
  exposes:
    - type: mcp
      namespace: slack-msg
      port: 8080
      tools:
        - name: post-message
          description: "Given a Slack channel ID and message text, post the message to that channel."
          inputParameters:
            - name: channel_id
              in: body
              type: string
              description: "Slack channel ID."
            - name: text
              in: body
              type: string
              description: "Message text to post."
          call: "slack-api.post-message"
          with:
            channel: "{{channel_id}}"
            text: "{{text}}"
  consumes:
    - type: http
      namespace: slack-api
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Converts Slack IT support requests into ServiceNow incidents, assigns priority based on keywords, and sends confirmation back to the requester in Slack.

naftiko: "0.5"
info:
  label: "Slack IT Support Ticket Creation"
  description: "Converts Slack IT support requests into ServiceNow incidents, assigns priority based on keywords, and sends confirmation back to the requester in Slack."
  tags:
    - it-support
    - automation
    - slack
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: it-support
      port: 8080
      tools:
        - name: create-support-ticket
          description: "Given a Slack message and user, create a ServiceNow incident and confirm back in Slack."
          inputParameters:
            - name: message_text
              in: body
              type: string
              description: "IT support request message text."
            - name: requester_email
              in: body
              type: string
              description: "Email of the Slack user requesting support."
            - name: channel_id
              in: body
              type: string
              description: "Slack channel ID where the request was made."
          steps:
            - name: create-incident
              type: call
              call: "snow-support.create-incident"
              with:
                short_description: "{{message_text}}"
                caller_id: "{{requester_email}}"
                category: "inquiry"
            - name: confirm-in-slack
              type: call
              call: "slack-support.post-message"
              with:
                channel: "{{channel_id}}"
                text: "IT Support ticket created: {{create-incident.number}} | {{message_text}}"
  consumes:
    - type: http
      namespace: snow-support
      baseUri: "https://morganstanley.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: slack-support
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Calculates client revenue attribution from Snowflake, updates Salesforce account records, and refreshes the Tableau revenue dashboard.

naftiko: "0.5"
info:
  label: "Snowflake Client Revenue Attribution Report"
  description: "Calculates client revenue attribution from Snowflake, updates Salesforce account records, and refreshes the Tableau revenue dashboard."
  tags:
    - finance
    - revenue
    - snowflake
    - salesforce
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: revenue-attribution
      port: 8080
      tools:
        - name: run-revenue-attribution
          description: "Given a fiscal period, calculate revenue attribution and update downstream systems."
          inputParameters:
            - name: fiscal_period
              in: body
              type: string
              description: "Fiscal period (e.g., 2026-Q1)."
          steps:
            - name: calculate-attribution
              type: call
              call: "snowflake-rev.execute-query"
              with:
                statement: "CALL FINANCE.CALCULATE_REVENUE_ATTRIBUTION('{{fiscal_period}}')"
            - name: update-salesforce
              type: call
              call: "sfdc-rev.update-accounts"
              with:
                period: "{{fiscal_period}}"
                data: "{{calculate-attribution.results}}"
            - name: refresh-dashboard
              type: call
              call: "tableau-rev.trigger-refresh"
              with:
                datasource_id: "$secrets.tableau_revenue_datasource_id"
  consumes:
    - type: http
      namespace: snowflake-rev
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: sfdc-rev
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: accounts
          path: "/composite/sobjects"
          operations:
            - name: update-accounts
              method: PATCH
    - type: http
      namespace: tableau-rev
      baseUri: "https://tableau.morganstanley.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/default/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: trigger-refresh
              method: POST

Runs data quality checks in Snowflake, creates a Jira ticket for data engineering when thresholds are breached, and notifies the data platform team via Slack.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Alert Workflow"
  description: "Runs data quality checks in Snowflake, creates a Jira ticket for data engineering when thresholds are breached, and notifies the data platform team via Slack."
  tags:
    - data-engineering
    - data-quality
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: dq-alert
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Given a Snowflake table and quality rule, run the check and create alerts if thresholds are breached."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "Fully qualified Snowflake table name."
            - name: quality_rule
              in: body
              type: string
              description: "SQL expression for the data quality check."
          steps:
            - name: run-check
              type: call
              call: "snowflake-dq.execute-query"
              with:
                statement: "SELECT COUNT(*) as violations FROM {{table_name}} WHERE {{quality_rule}}"
            - name: create-ticket
              type: call
              call: "jira-dq.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Data quality violation: {{table_name}}"
                description: "Rule: {{quality_rule}}\nViolations: {{run-check.violations}}"
            - name: notify-team
              type: call
              call: "slack-data.post-message"
              with:
                channel: "$secrets.data_platform_channel"
                text: "DQ Alert: {{run-check.violations}} violations in {{table_name}} | Jira: {{create-ticket.key}}"
  consumes:
    - type: http
      namespace: snowflake-dq
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: jira-dq
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack-data
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors Snowflake task execution history for financial data pipeline failures, creates ServiceNow incidents for repeated failures, and posts a pipeline health digest to the Data Engineering Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Snowflake Financial Data Pipeline Monitor"
  description: "Monitors Snowflake task execution history for financial data pipeline failures, creates ServiceNow incidents for repeated failures, and posts a pipeline health digest to the Data Engineering Microsoft Teams channel."
  tags:
    - data
    - analytics
    - snowflake
    - servicenow
    - microsoft-teams
    - pipeline-monitoring
capability:
  exposes:
    - type: mcp
      namespace: data-pipeline-ops
      port: 8080
      tools:
        - name: monitor-financial-pipelines
          description: "Given a Snowflake warehouse name and failure threshold, check task execution history for the last 24 hours, open ServiceNow incidents for failing tasks, and post a digest to the DataEngineering Teams channel."
          inputParameters:
            - name: warehouse_name
              in: body
              type: string
              description: "Snowflake warehouse name to monitor task history for."
            - name: failure_threshold
              in: body
              type: integer
              description: "Number of task failures in 24 hours that triggers a ServiceNow incident."
          steps:
            - name: get-task-failures
              type: call
              call: "snowflake-pipeline.query-task-history"
              with:
                warehouse: "{{warehouse_name}}"
                state: "FAILED"
            - name: create-snow-incident
              type: call
              call: "servicenow-data.create-incident"
              with:
                short_description: "Snowflake pipeline failures: {{warehouse_name}} — {{get-task-failures.failure_count}} failures"
                category: "data_engineering"
                urgency: "2"
            - name: post-digest
              type: call
              call: "msteams-dataeng.post-channel-message"
              with:
                channel_id: "DataEngineering"
                text: "Pipeline monitor: {{get-task-failures.failure_count}} task failures in {{warehouse_name}}. SNOW: {{create-snow-incident.number}}"
  consumes:
    - type: http
      namespace: snowflake-pipeline
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/PROD/schemas/FINANCE/tasks/executions"
          inputParameters:
            - name: warehouse
              in: query
            - name: state
              in: query
          operations:
            - name: query-task-history
              method: GET
    - type: http
      namespace: servicenow-data
      baseUri: "https://morganstanley.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-dataeng
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Executes a read-only SQL query against Morgan Stanley's Snowflake data warehouse and returns the result set for analytics and reporting purposes.

naftiko: "0.5"
info:
  label: "Snowflake Query Execution"
  description: "Executes a read-only SQL query against Morgan Stanley's Snowflake data warehouse and returns the result set for analytics and reporting purposes."
  tags:
    - data
    - analytics
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: snowflake-query
      port: 8080
      tools:
        - name: run-query
          description: "Given a SQL SELECT statement, execute it against Snowflake and return the result set. Only read-only queries are permitted."
          inputParameters:
            - name: sql_statement
              in: body
              type: string
              description: "SQL SELECT statement to execute."
            - name: warehouse
              in: body
              type: string
              description: "Snowflake warehouse name to use for compute."
          call: "snowflake-sql.execute-statement"
          with:
            statement: "{{sql_statement}}"
            warehouse: "{{warehouse}}"
  consumes:
    - type: http
      namespace: snowflake-sql
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST

Executes regulatory capital calculations in Snowflake, generates a formatted report, and distributes to stakeholders via Microsoft Teams and Confluence.

naftiko: "0.5"
info:
  label: "Snowflake Regulatory Capital Report"
  description: "Executes regulatory capital calculations in Snowflake, generates a formatted report, and distributes to stakeholders via Microsoft Teams and Confluence."
  tags:
    - regulatory
    - capital
    - snowflake
    - microsoft-teams
    - confluence
capability:
  exposes:
    - type: mcp
      namespace: reg-capital
      port: 8080
      tools:
        - name: generate-capital-report
          description: "Given a reporting date, run capital calculations in Snowflake and distribute the report."
          inputParameters:
            - name: reporting_date
              in: body
              type: string
              description: "Reporting date in YYYY-MM-DD format."
          steps:
            - name: run-calculations
              type: call
              call: "snowflake-cap.execute-query"
              with:
                statement: "CALL REGULATORY.CALCULATE_CAPITAL_RATIOS('{{reporting_date}}')"
            - name: publish-report
              type: call
              call: "confluence-cap.create-page"
              with:
                space: "REGULATORY"
                title: "Capital Report - {{reporting_date}}"
                body: "CET1 Ratio: {{run-calculations.cet1_ratio}}\nTier 1: {{run-calculations.tier1_ratio}}\nTotal Capital: {{run-calculations.total_capital_ratio}}"
            - name: notify-stakeholders
              type: call
              call: "teams-cap.send-message"
              with:
                channel_id: "$secrets.regulatory_teams_channel"
                text: "Regulatory Capital Report for {{reporting_date}} published. CET1: {{run-calculations.cet1_ratio}}%. View in Confluence."
  consumes:
    - type: http
      namespace: snowflake-cap
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: confluence-cap
      baseUri: "https://morganstanley.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_api_token"
      resources:
        - name: pages
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - type: http
      namespace: teams-cap
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/$secrets.regulatory_team_id/channels/{{channel_id}}/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: send-message
              method: POST

Queries Snowflake for daily market risk metrics (VaR, CVaR), validates results against expected ranges, and posts the risk snapshot to the Risk Management Microsoft Teams channel with exception alerts.

naftiko: "0.5"
info:
  label: "Snowflake Risk Metrics Snapshot"
  description: "Queries Snowflake for daily market risk metrics (VaR, CVaR), validates results against expected ranges, and posts the risk snapshot to the Risk Management Microsoft Teams channel with exception alerts."
  tags:
    - finance
    - risk-management
    - snowflake
    - microsoft-teams
    - market-risk
    - reporting
capability:
  exposes:
    - type: mcp
      namespace: risk-reporting
      port: 8080
      tools:
        - name: publish-risk-snapshot
          description: "Given a reporting date, query Snowflake for VaR and CVaR metrics, flag any values outside expected ranges, and post the daily risk snapshot to the RiskManagement Teams channel."
          inputParameters:
            - name: reporting_date
              in: body
              type: string
              description: "Date for the risk metrics snapshot in ISO 8601 format."
            - name: var_limit_usd
              in: body
              type: number
              description: "Value-at-Risk limit in USD. Breaches trigger exception flags."
          steps:
            - name: query-risk-metrics
              type: call
              call: "snowflake-risk.run-var-query"
              with:
                as_of_date: "{{reporting_date}}"
            - name: post-snapshot
              type: call
              call: "msteams-risk.post-channel-message"
              with:
                channel_id: "RiskManagement"
                text: "Risk snapshot {{reporting_date}}: VaR ${{query-risk-metrics.var_usd}} | CVaR ${{query-risk-metrics.cvar_usd}} | Limit ${{var_limit_usd}} | Status: {{query-risk-metrics.breach_status}}"
  consumes:
    - type: http
      namespace: snowflake-risk
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          inputParameters:
            - name: as_of_date
              in: query
          operations:
            - name: run-var-query
              method: POST
    - type: http
      namespace: msteams-risk
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Submits a Splunk search query and returns matching events, supporting security investigation and log analysis for the technology infrastructure team.

naftiko: "0.5"
info:
  label: "Splunk Search Query"
  description: "Submits a Splunk search query and returns matching events, supporting security investigation and log analysis for the technology infrastructure team."
  tags:
    - security
    - logging
    - splunk
capability:
  exposes:
    - type: mcp
      namespace: splunk-search
      port: 8080
      tools:
        - name: run-search
          description: "Given a Splunk search query string and time range, submit the search and return matching events."
          inputParameters:
            - name: search_query
              in: body
              type: string
              description: "Splunk SPL search query."
            - name: earliest_time
              in: body
              type: string
              description: "Earliest time for the search range (e.g., -24h)."
          call: "splunk-api.create-search"
          with:
            search: "{{search_query}}"
            earliest_time: "{{earliest_time}}"
  consumes:
    - type: http
      namespace: splunk-api
      baseUri: "https://splunk.morganstanley.com:8089/services"
      authentication:
        type: bearer
        token: "$secrets.splunk_token"
      resources:
        - name: searches
          path: "/search/jobs"
          operations:
            - name: create-search
              method: POST

Triggers a Tableau datasource refresh for financial dashboards, monitors completion status, and posts the refresh result to the Finance Analytics Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Tableau Financial Dashboard Refresh"
  description: "Triggers a Tableau datasource refresh for financial dashboards, monitors completion status, and posts the refresh result to the Finance Analytics Microsoft Teams channel."
  tags:
    - data
    - analytics
    - tableau
    - microsoft-teams
    - reporting
    - finance
capability:
  exposes:
    - type: mcp
      namespace: finance-analytics
      port: 8080
      tools:
        - name: refresh-financial-dashboard
          description: "Given a Tableau datasource ID for financial reporting, trigger a refresh and notify the Finance Analytics Teams channel when complete. Use when stakeholders need fresh data outside the scheduled refresh."
          inputParameters:
            - name: datasource_id
              in: body
              type: string
              description: "Tableau datasource ID to trigger refresh for."
            - name: dashboard_name
              in: body
              type: string
              description: "Human-readable dashboard name for the Teams notification."
          steps:
            - name: trigger-refresh
              type: call
              call: "tableau-finance.refresh-datasource"
              with:
                datasource_id: "{{datasource_id}}"
            - name: notify-finance-analytics
              type: call
              call: "msteams-fin-analytics.post-channel-message"
              with:
                channel_id: "FinanceAnalytics"
                text: "Dashboard refresh triggered: {{dashboard_name}} ({{datasource_id}}). Job ID: {{trigger-refresh.job_id}}"
  consumes:
    - type: http
      namespace: tableau-finance
      baseUri: "https://prod-useast-a.online.tableau.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasource-refreshes
          path: "/sites/{{datasource_id}}/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: refresh-datasource
              method: POST
    - type: http
      namespace: msteams-fin-analytics
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Returns the current status, owner, and last published date for a Tableau workbook, supporting dashboard governance and monitoring.

naftiko: "0.5"
info:
  label: "Tableau Workbook Status Check"
  description: "Returns the current status, owner, and last published date for a Tableau workbook, supporting dashboard governance and monitoring."
  tags:
    - reporting
    - visualization
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: tableau-status
      port: 8080
      tools:
        - name: get-workbook-status
          description: "Given a Tableau workbook ID, return the workbook name, owner, project, and last updated timestamp."
          inputParameters:
            - name: workbook_id
              in: body
              type: string
              description: "Tableau Server workbook ID."
          call: "tableau-api.get-workbook"
          with:
            id: "{{workbook_id}}"
          outputParameters:
            - name: name
              type: string
              mapping: "$.workbook.name"
            - name: owner
              type: string
              mapping: "$.workbook.owner.name"
  consumes:
    - type: http
      namespace: tableau-api
      baseUri: "https://tableau.morganstanley.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: workbooks
          path: "/sites/default/workbooks/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-workbook
              method: GET

Detects infrastructure drift via Terraform Cloud, creates a Jira remediation ticket, and alerts the platform engineering team via Slack.

naftiko: "0.5"
info:
  label: "Terraform Drift Detection Remediation"
  description: "Detects infrastructure drift via Terraform Cloud, creates a Jira remediation ticket, and alerts the platform engineering team via Slack."
  tags:
    - infrastructure
    - iac
    - terraform
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: tf-drift
      port: 8080
      tools:
        - name: handle-terraform-drift
          description: "Given a Terraform workspace ID, check for drift, create a Jira ticket, and notify the platform team."
          inputParameters:
            - name: workspace_id
              in: body
              type: string
              description: "Terraform Cloud workspace ID."
          steps:
            - name: check-drift
              type: call
              call: "terraform-api.get-workspace-status"
              with:
                workspace_id: "{{workspace_id}}"
            - name: create-remediation-ticket
              type: call
              call: "jira-infra.create-issue"
              with:
                project_key: "PLATFORM"
                issuetype: "Bug"
                summary: "Terraform drift: {{check-drift.workspace_name}}"
                description: "Workspace: {{check-drift.workspace_name}}\nResources drifted: {{check-drift.drift_count}}"
            - name: notify-team
              type: call
              call: "slack-platform.post-message"
              with:
                channel: "$secrets.platform_slack_channel"
                text: "Terraform Drift: {{check-drift.workspace_name}} | {{check-drift.drift_count}} resources | Jira: {{create-remediation-ticket.key}}"
  consumes:
    - type: http
      namespace: terraform-api
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: workspaces
          path: "/workspaces/{{workspace_id}}"
          inputParameters:
            - name: workspace_id
              in: path
          operations:
            - name: get-workspace-status
              method: GET
    - type: http
      namespace: jira-infra
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_api_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: slack-platform
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Refinitiv World-Check alert is generated for a potential regulatory breach, creates a Salesforce compliance case, logs the alert in Snowflake for audit, and notifies the Compliance Microsoft Teams channel.

naftiko: "0.5"
info:
  label: "Trade Surveillance Alert to Compliance Case"
  description: "When a Refinitiv World-Check alert is generated for a potential regulatory breach, creates a Salesforce compliance case, logs the alert in Snowflake for audit, and notifies the Compliance Microsoft Teams channel."
  tags:
    - compliance
    - finance
    - refinitiv
    - salesforce
    - snowflake
    - microsoft-teams
    - trade-surveillance
capability:
  exposes:
    - type: mcp
      namespace: compliance-ops
      port: 8080
      tools:
        - name: handle-trade-alert
          description: "Given a Refinitiv World-Check alert ID and trade details, create a Salesforce compliance case, log the alert to Snowflake for regulatory audit trail, and notify the Compliance Teams channel."
          inputParameters:
            - name: alert_id
              in: body
              type: string
              description: "Refinitiv World-Check alert identifier."
            - name: trader_id
              in: body
              type: string
              description: "Internal trader identifier associated with the alert."
            - name: trade_date
              in: body
              type: string
              description: "Date of the flagged trade in ISO 8601 format."
          steps:
            - name: get-alert
              type: call
              call: "refinitiv.get-alert"
              with:
                alert_id: "{{alert_id}}"
            - name: create-compliance-case
              type: call
              call: "salesforce-compliance.create-case"
              with:
                subject: "Trade surveillance alert: {{alert_id}} — Trader {{trader_id}}"
                description: "Alert type: {{get-alert.alert_type}}\nRisk score: {{get-alert.risk_score}}\nTrade date: {{trade_date}}"
                priority: "High"
            - name: log-audit-trail
              type: call
              call: "snowflake-audit.insert-record"
              with:
                table: "COMPLIANCE.TRADE_ALERTS"
                alert_id: "{{alert_id}}"
                case_id: "{{create-compliance-case.case_number}}"
                trader_id: "{{trader_id}}"
            - name: notify-compliance
              type: call
              call: "msteams-compliance.post-channel-message"
              with:
                channel_id: "Compliance"
                text: "Trade alert {{alert_id}}: Risk score {{get-alert.risk_score}} | Salesforce case: {{create-compliance-case.case_number}} | Trader: {{trader_id}}"
  consumes:
    - type: http
      namespace: refinitiv
      baseUri: "https://api.thomsonreuters.com/worldcheck/v1"
      authentication:
        type: bearer
        token: "$secrets.refinitiv_token"
      resources:
        - name: alerts
          path: "/alerts/{{alert_id}}"
          inputParameters:
            - name: alert_id
              in: path
          operations:
            - name: get-alert
              method: GET
    - type: http
      namespace: salesforce-compliance
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: cases
          path: "/sobjects/Case"
          operations:
            - name: create-case
              method: POST
    - type: http
      namespace: snowflake-audit
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST
    - type: http
      namespace: msteams-compliance
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: channel-messages
          path: "/teams/{{channel_id}}/channels/General/messages"
          inputParameters:
            - name: channel_id
              in: path
          operations:
            - name: post-channel-message
              method: POST

Pulls client portfolio data from Snowflake, generates a meeting briefing using Anthropic Claude, and delivers it to the advisor via Microsoft Teams before scheduled client meetings.

naftiko: "0.5"
info:
  label: "Wealth Advisor Client Briefing Generator"
  description: "Pulls client portfolio data from Snowflake, generates a meeting briefing using Anthropic Claude, and delivers it to the advisor via Microsoft Teams before scheduled client meetings."
  tags:
    - wealth-management
    - ai
    - snowflake
    - anthropic
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: client-briefing
      port: 8080
      tools:
        - name: generate-client-briefing
          description: "Given a client account ID, pull portfolio data from Snowflake, generate a briefing with Claude, and send to the advisor via Teams."
          inputParameters:
            - name: client_account_id
              in: body
              type: string
              description: "Client portfolio account identifier."
            - name: advisor_upn
              in: body
              type: string
              description: "Advisor Microsoft Teams UPN."
          steps:
            - name: get-portfolio-data
              type: call
              call: "snowflake-wm.execute-query"
              with:
                statement: "SELECT account_name, total_aum, ytd_return, asset_allocation_summary FROM wealth.client_portfolios WHERE account_id = '{{client_account_id}}'"
            - name: generate-briefing
              type: call
              call: "anthropic-wm.create-message"
              with:
                model: "claude-3-5-sonnet-20241022"
                content: "Generate a concise client meeting briefing for account {{client_account_id}}: AUM {{get-portfolio-data.total_aum}}, YTD return {{get-portfolio-data.ytd_return}}. Include talking points and portfolio recommendations."
            - name: deliver-briefing
              type: call
              call: "teams-wm.send-message"
              with:
                recipient_upn: "{{advisor_upn}}"
                text: "Client Briefing - {{get-portfolio-data.account_name}}\n\n{{generate-briefing.text}}"
  consumes:
    - type: http
      namespace: snowflake-wm
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-query
              method: POST
    - type: http
      namespace: anthropic-wm
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: messages
          path: "/messages"
          operations:
            - name: create-message
              method: POST
    - type: http
      namespace: teams-wm
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

Queries Workday for employees with pending benefits elections, sends personalized Microsoft Teams reminders, and logs outreach to Snowflake for HR analytics.

naftiko: "0.5"
info:
  label: "Workday Benefits Enrollment Reminder"
  description: "Queries Workday for employees with pending benefits elections, sends personalized Microsoft Teams reminders, and logs outreach to Snowflake for HR analytics."
  tags:
    - hr
    - benefits
    - workday
    - microsoft-teams
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: benefits-reminder
      port: 8080
      tools:
        - name: send-enrollment-reminders
          description: "Given an enrollment period ID, find employees with pending elections, send Teams reminders, and log outreach."
          inputParameters:
            - name: enrollment_period_id
              in: body
              type: string
              description: "Workday benefits enrollment period identifier."
          steps:
            - name: get-pending-enrollments
              type: call
              call: "workday-benefits.get-pending"
              with:
                period_id: "{{enrollment_period_id}}"
            - name: send-reminder
              type: call
              call: "teams-hr.send-message"
              with:
                recipient_upn: "{{get-pending-enrollments.employee_email}}"
                text: "Reminder: Your benefits enrollment for {{enrollment_period_id}} is pending. Please complete your elections in Workday by the deadline."
            - name: log-outreach
              type: call
              call: "snowflake-hr.insert-record"
              with:
                table: "HR.BENEFITS_OUTREACH_LOG"
                period_id: "{{enrollment_period_id}}"
                employee_count: "{{get-pending-enrollments.count}}"
  consumes:
    - type: http
      namespace: workday-benefits
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: enrollments
          path: "/morganstanley/benefits/enrollments"
          operations:
            - name: get-pending
              method: GET
    - type: http
      namespace: teams-hr
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: snowflake-hr
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

When a compensation change proposal is submitted in Workday, creates a Jira approval task for the HR business partner, notifies the approver via Microsoft Teams, and logs the proposal to Snowflake for compensation audit.

naftiko: "0.5"
info:
  label: "Workday Compensation Change Approval"
  description: "When a compensation change proposal is submitted in Workday, creates a Jira approval task for the HR business partner, notifies the approver via Microsoft Teams, and logs the proposal to Snowflake for compensation audit."
  tags:
    - hr
    - compensation
    - workday
    - jira
    - microsoft-teams
    - snowflake
    - approval
capability:
  exposes:
    - type: mcp
      namespace: compensation-approvals
      port: 8080
      tools:
        - name: route-compensation-change
          description: "Given a Workday compensation change proposal ID, create a Jira approval task for the HR business partner, notify them via Teams direct message, and log the proposal details to Snowflake."
          inputParameters:
            - name: proposal_id
              in: body
              type: string
              description: "Workday compensation change proposal identifier."
            - name: approver_employee_id
              in: body
              type: string
              description: "Workday employee ID of the HR business partner approver."
          steps:
            - name: get-proposal
              type: call
              call: "workday-comp.get-proposal"
              with:
                proposal_id: "{{proposal_id}}"
            - name: create-approval-task
              type: call
              call: "jira-comp.create-issue"
              with:
                project_key: "HR"
                issuetype: "Task"
                summary: "Compensation change approval: {{get-proposal.employee_name}} — {{get-proposal.change_amount}}"
                description: "Proposal: {{proposal_id}}\nEmployee: {{get-proposal.employee_name}}\nChange: {{get-proposal.change_amount}}\nEffective: {{get-proposal.effective_date}}"
            - name: notify-approver
              type: call
              call: "msteams-comp.send-message"
              with:
                recipient_upn: "{{approver_employee_id}}"
                text: "Compensation approval required: {{get-proposal.employee_name}} — change of {{get-proposal.change_amount}}. Jira: {{create-approval-task.key}}"
            - name: log-proposal
              type: call
              call: "snowflake-comp.insert-record"
              with:
                table: "HR.COMPENSATION_PROPOSALS"
                proposal_id: "{{proposal_id}}"
                jira_key: "{{create-approval-task.key}}"
                status: "PENDING_APPROVAL"
  consumes:
    - type: http
      namespace: workday-comp
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation-proposals
          path: "/morganstanley/compensationProposals/{{proposal_id}}"
          inputParameters:
            - name: proposal_id
              in: path
          operations:
            - name: get-proposal
              method: GET
    - type: http
      namespace: jira-comp
      baseUri: "https://morganstanley.atlassian.net/rest/api/3"
      authentication:
        type: bearer
        token: "$secrets.jira_token"
      resources:
        - name: issues
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - type: http
      namespace: msteams-comp
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: user-mail
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: snowflake-comp
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: sql-statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

Extracts compensation review data from Workday, loads it into Snowflake for benchmarking analytics, and refreshes the Tableau compensation dashboard.

naftiko: "0.5"
info:
  label: "Workday Compensation Review to Snowflake Analytics"
  description: "Extracts compensation review data from Workday, loads it into Snowflake for benchmarking analytics, and refreshes the Tableau compensation dashboard."
  tags:
    - hr
    - compensation
    - workday
    - snowflake
    - tableau
capability:
  exposes:
    - type: mcp
      namespace: comp-analytics
      port: 8080
      tools:
        - name: sync-compensation-data
          description: "Extract compensation review cycle data from Workday, load to Snowflake, and refresh the Tableau dashboard."
          inputParameters:
            - name: review_cycle_id
              in: body
              type: string
              description: "Workday compensation review cycle identifier."
          steps:
            - name: extract-comp-data
              type: call
              call: "workday-comp.get-review-data"
              with:
                cycle_id: "{{review_cycle_id}}"
            - name: load-to-snowflake
              type: call
              call: "snowflake-comp.execute-statement"
              with:
                statement: "CALL HR_ANALYTICS.LOAD_COMP_REVIEW('{{review_cycle_id}}')"
            - name: refresh-tableau
              type: call
              call: "tableau-comp.trigger-extract-refresh"
              with:
                datasource_id: "$secrets.tableau_comp_datasource_id"
  consumes:
    - type: http
      namespace: workday-comp
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: compensation
          path: "/morganstanley/compensation/reviews/{{cycle_id}}"
          inputParameters:
            - name: cycle_id
              in: path
          operations:
            - name: get-review-data
              method: GET
    - type: http
      namespace: snowflake-comp
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: execute-statement
              method: POST
    - type: http
      namespace: tableau-comp
      baseUri: "https://tableau.morganstanley.com/api/3.19"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/default/datasources/{{datasource_id}}/refresh"
          inputParameters:
            - name: datasource_id
              in: path
          operations:
            - name: trigger-extract-refresh
              method: POST

Looks up an employee's profile details from Workday including department, manager, location, and job title for internal directory queries.

naftiko: "0.5"
info:
  label: "Workday Employee Directory Lookup"
  description: "Looks up an employee's profile details from Workday including department, manager, location, and job title for internal directory queries."
  tags:
    - hr
    - directory
    - workday
capability:
  exposes:
    - type: mcp
      namespace: employee-directory
      port: 8080
      tools:
        - name: lookup-employee
          description: "Given a Workday employee ID, return their full name, department, job title, manager, and office location."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          call: "workday-dir.get-worker"
          with:
            worker_id: "{{employee_id}}"
          outputParameters:
            - name: full_name
              type: string
              mapping: "$.full_name"
            - name: department
              type: string
              mapping: "$.department"
            - name: job_title
              type: string
              mapping: "$.job_title"
  consumes:
    - type: http
      namespace: workday-dir
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/morganstanley/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET

Exports Workday headcount by department and cost center and pushes the dataset to Tableau for executive workforce cost dashboards.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot for Finance"
  description: "Exports Workday headcount by department and cost center and pushes the dataset to Tableau for executive workforce cost dashboards."
  tags:
    - hr
    - finance
    - workday
    - tableau
    - reporting
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-finance-reporting
      port: 8080
      tools:
        - name: publish-headcount-snapshot
          description: "Export current Workday headcount by department and cost center, and publish the data to a Tableau datasource for executive workforce cost analysis."
          inputParameters:
            - name: as_of_date
              in: body
              type: string
              description: "Effective date for the headcount snapshot in ISO 8601 format."
            - name: tableau_datasource_id
              in: body
              type: string
              description: "Tableau datasource ID to publish headcount data to."
          steps:
            - name: export-headcount
              type: call
              call: "workday-headcount.export-workers"
              with:
                as_of_date: "{{as_of_date}}"
            - name: publish-to-tableau
              type: call
              call: "tableau.publish-datasource"
              with:
                datasource_id: "{{tableau_datasource_id}}"
                data: "{{export-headcount.rows}}"
  consumes:
    - type: http
      namespace: workday-headcount
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: worker-exports
          path: "/morganstanley/workers/export"
          inputParameters:
            - name: as_of_date
              in: query
          operations:
            - name: export-workers
              method: GET
    - type: http
      namespace: tableau
      baseUri: "https://prod-useast-a.online.tableau.com/api/3.21"
      authentication:
        type: bearer
        token: "$secrets.tableau_token"
      resources:
        - name: datasources
          path: "/sites/{{tableau_datasource_id}}/datasources"
          inputParameters:
            - name: tableau_datasource_id
              in: path
          operations:
            - name: publish-datasource
              method: POST

Fetches approved job requisitions from Workday Recruiting, creates corresponding Salesforce opportunity records for recruiting pipeline tracking, and publishes job postings to LinkedIn.

naftiko: "0.5"
info:
  label: "Workday Job Requisition to Salesforce Recruiting"
  description: "Fetches approved job requisitions from Workday Recruiting, creates corresponding Salesforce opportunity records for recruiting pipeline tracking, and publishes job postings to LinkedIn."
  tags:
    - hr
    - recruiting
    - workday
    - salesforce
    - linkedin
    - talent-acquisition
capability:
  exposes:
    - type: mcp
      namespace: talent-pipeline
      port: 8080
      tools:
        - name: sync-requisitions-to-salesforce
          description: "Given a Workday requisition status filter, fetch approved requisitions, create Salesforce opportunity records for each, and publish job postings to LinkedIn."
          inputParameters:
            - name: requisition_status
              in: body
              type: string
              description: "Workday requisition status to filter by, e.g. 'Approved'."
            - name: linkedin_org_id
              in: body
              type: string
              description: "LinkedIn organization ID to publish job postings to."
          steps:
            - name: get-requisitions
              type: call
              call: "workday-talent.list-requisitions"
              with:
                status: "{{requisition_status}}"
            - name: create-sf-opportunity
              type: call
              call: "salesforce-talent.create-opportunity"
              with:
                opportunities: "{{get-requisitions.requisitions}}"
            - name: publish-linkedin-jobs
              type: call
              call: "linkedin-talent.create-job-posting"
              with:
                organization_id: "{{linkedin_org_id}}"
                jobs: "{{get-requisitions.requisitions}}"
  consumes:
    - type: http
      namespace: workday-talent
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: job-requisitions
          path: "/morganstanley/jobRequisitions"
          inputParameters:
            - name: status
              in: query
          operations:
            - name: list-requisitions
              method: GET
    - type: http
      namespace: salesforce-talent
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunities
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST
    - type: http
      namespace: linkedin-talent
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-postings
          path: "/jobPostings"
          operations:
            - name: create-job-posting
              method: POST

Queries Workday Learning for employees with overdue compliance training, sends reminder emails via Microsoft Graph, and logs outreach to Snowflake for tracking.

naftiko: "0.5"
info:
  label: "Workday Learning Compliance Tracker"
  description: "Queries Workday Learning for employees with overdue compliance training, sends reminder emails via Microsoft Graph, and logs outreach to Snowflake for tracking."
  tags:
    - hr
    - compliance-training
    - workday
    - microsoft-teams
    - snowflake
capability:
  exposes:
    - type: mcp
      namespace: compliance-training
      port: 8080
      tools:
        - name: track-overdue-training
          description: "Query Workday for overdue compliance training and send reminders via Teams."
          inputParameters:
            - name: training_program_id
              in: body
              type: string
              description: "Workday training program identifier."
          steps:
            - name: get-overdue
              type: call
              call: "workday-learning.get-overdue"
              with:
                program_id: "{{training_program_id}}"
            - name: send-reminders
              type: call
              call: "teams-training.send-message"
              with:
                recipient_upn: "{{get-overdue.employee_email}}"
                text: "Action Required: Your compliance training '{{get-overdue.course_name}}' is overdue. Please complete it in Workday Learning immediately."
            - name: log-outreach
              type: call
              call: "snowflake-training.insert-record"
              with:
                table: "HR.TRAINING_OUTREACH_LOG"
                program_id: "{{training_program_id}}"
                overdue_count: "{{get-overdue.count}}"
  consumes:
    - type: http
      namespace: workday-learning
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: learning
          path: "/morganstanley/learning/overdue"
          operations:
            - name: get-overdue
              method: GET
    - type: http
      namespace: teams-training
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST
    - type: http
      namespace: snowflake-training
      baseUri: "https://morganstanley.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statements
          path: "/statements"
          operations:
            - name: insert-record
              method: POST

When organizational changes occur in Workday, updates Okta group memberships, modifies ServiceNow assignment groups, and notifies affected managers via Microsoft Teams.

naftiko: "0.5"
info:
  label: "Workday Org Chart Change Propagation"
  description: "When organizational changes occur in Workday, updates Okta group memberships, modifies ServiceNow assignment groups, and notifies affected managers via Microsoft Teams."
  tags:
    - hr
    - org-management
    - workday
    - okta
    - servicenow
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: org-change
      port: 8080
      tools:
        - name: propagate-org-change
          description: "Given a Workday org change event, update Okta groups and ServiceNow assignments."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID affected by the org change."
            - name: new_department
              in: body
              type: string
              description: "New department name."
          steps:
            - name: get-employee
              type: call
              call: "workday-org.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: update-okta-groups
              type: call
              call: "okta-org.update-group-membership"
              with:
                user_id: "{{get-employee.work_email}}"
                new_group: "{{new_department}}"
            - name: update-servicenow
              type: call
              call: "snow-org.update-assignment"
              with:
                user_id: "{{get-employee.work_email}}"
                new_group: "{{new_department}}"
            - name: notify-manager
              type: call
              call: "teams-org.send-message"
              with:
                recipient_upn: "{{get-employee.manager_email}}"
                text: "Org change processed: {{get-employee.full_name}} moved to {{new_department}}. Okta and ServiceNow updated."
  consumes:
    - type: http
      namespace: workday-org
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/morganstanley/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta-org
      baseUri: "https://morganstanley.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: groups
          path: "/groups"
          operations:
            - name: update-group-membership
              method: PUT
    - type: http
      namespace: snow-org
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: users
          path: "/table/sys_user"
          operations:
            - name: update-assignment
              method: PATCH
    - type: http
      namespace: teams-org
      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

Syncs employee performance goals from Workday to Jira epics for engineering teams and notifies managers via Microsoft Teams when goals are updated.

naftiko: "0.5"
info:
  label: "Workday Performance Goal Sync to Jira"
  description: "Syncs employee performance goals from Workday to Jira epics for engineering teams and notifies managers via Microsoft Teams when goals are updated."
  tags:
    - hr
    - performance
    - workday
    - jira
    - microsoft-teams
capability:
  exposes:
    - type: mcp
      namespace: goal-sync
      port: 8080
      tools:
        - name: sync-goals-to-jira
          description: "Given a Workday employee ID, sync their performance goals to Jira epics and notify the manager."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID."
          steps:
            - name: get-goals
              type: call
              call: "workday-goals.get-employee-goals"
              with:
                worker_id: "{{employee_id}}"
            - name: create-epic
              type: call
              call: "jira-goals.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Epic"
                summary: "{{get-goals.goal_title}}"
                description: "Workday Goal: {{get-goals.goal_description}}\nDue: {{get-goals.due_date}}"
            - name: notify-manager
              type: call
              call: "teams-goals.send-message"
              with:
                recipient_upn: "{{get-goals.manager_email}}"
                text: "Performance goals synced for {{get-goals.employee_name}}. Jira epic: {{create-epic.key}}"
  consumes:
    - type: http
      namespace: workday-goals
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: goals
          path: "/morganstanley/workers/{{worker_id}}/goals"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-employee-goals
              method: GET
    - type: http
      namespace: jira-goals
      baseUri: "https://morganstanley.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: teams-goals
      baseUri: "https://graph.microsoft.com/v1.0"
      authentication:
        type: bearer
        token: "$secrets.msgraph_token"
      resources:
        - name: messages
          path: "/users/{{recipient_upn}}/sendMail"
          inputParameters:
            - name: recipient_upn
              in: path
          operations:
            - name: send-message
              method: POST

When an employee termination is detected in Workday, deactivates their Okta account, revokes active sessions, and creates a ServiceNow access removal ticket.

naftiko: "0.5"
info:
  label: "Workday Termination to Okta Deprovisioning"
  description: "When an employee termination is detected in Workday, deactivates their Okta account, revokes active sessions, and creates a ServiceNow access removal ticket."
  tags:
    - hr
    - security
    - workday
    - okta
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: termination-deprovisioning
      port: 8080
      tools:
        - name: process-termination
          description: "Given a Workday employee ID for a terminated worker, deactivate Okta, revoke sessions, and open a ServiceNow access removal ticket."
          inputParameters:
            - name: employee_id
              in: body
              type: string
              description: "Workday employee ID of the terminated worker."
          steps:
            - name: get-worker-details
              type: call
              call: "workday-term.get-worker"
              with:
                worker_id: "{{employee_id}}"
            - name: deactivate-okta
              type: call
              call: "okta-term.deactivate-user"
              with:
                user_id: "{{get-worker-details.work_email}}"
            - name: revoke-sessions
              type: call
              call: "okta-term.clear-sessions"
              with:
                user_id: "{{get-worker-details.work_email}}"
            - name: create-removal-ticket
              type: call
              call: "snow-term.create-request"
              with:
                short_description: "Access removal: {{get-worker-details.full_name}} (terminated)"
                description: "Employee {{employee_id}} terminated. Okta deactivated. Remove remaining access: VPN, building access, shared drives."
                assignment_group: "IT_Access_Management"
  consumes:
    - type: http
      namespace: workday-term
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: workers
          path: "/morganstanley/workers/{{worker_id}}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - type: http
      namespace: okta-term
      baseUri: "https://morganstanley.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_token"
        placement: header
      resources:
        - name: users
          path: "/users/{{user_id}}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
        - name: sessions
          path: "/users/{{user_id}}/sessions"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: clear-sessions
              method: DELETE
    - type: http
      namespace: snow-term
      baseUri: "https://morganstanley.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: requests
          path: "/table/sc_request"
          operations:
            - name: create-request
              method: POST

Retrieves meeting details including participants, duration, and recording status for a Zoom meeting, supporting compliance recording review.

naftiko: "0.5"
info:
  label: "Zoom Meeting Details Lookup"
  description: "Retrieves meeting details including participants, duration, and recording status for a Zoom meeting, supporting compliance recording review."
  tags:
    - communications
    - meetings
    - zoom
capability:
  exposes:
    - type: mcp
      namespace: zoom-meeting
      port: 8080
      tools:
        - name: get-meeting-details
          description: "Given a Zoom meeting ID, return participant count, duration, recording status, and topic."
          inputParameters:
            - name: meeting_id
              in: body
              type: string
              description: "Zoom meeting ID."
          call: "zoom-api.get-meeting"
          with:
            id: "{{meeting_id}}"
          outputParameters:
            - name: topic
              type: string
              mapping: "$.topic"
            - name: duration
              type: string
              mapping: "$.duration"
  consumes:
    - type: http
      namespace: zoom-api
      baseUri: "https://api.zoom.us/v2"
      authentication:
        type: bearer
        token: "$secrets.zoom_token"
      resources:
        - name: meetings
          path: "/meetings/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-meeting
              method: GET

Enriches Salesforce leads with ZoomInfo company and contact data, updates the lead record, and notifies the assigned sales representative via Slack.

naftiko: "0.5"
info:
  label: "ZoomInfo Lead Enrichment to Salesforce"
  description: "Enriches Salesforce leads with ZoomInfo company and contact data, updates the lead record, and notifies the assigned sales representative via Slack."
  tags:
    - sales
    - lead-enrichment
    - zoominfo
    - salesforce
    - slack
capability:
  exposes:
    - type: mcp
      namespace: lead-enrichment
      port: 8080
      tools:
        - name: enrich-salesforce-lead
          description: "Given a Salesforce lead ID, enrich with ZoomInfo data, update the lead, and notify the sales rep via Slack."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "Salesforce lead record ID."
          steps:
            - name: get-lead
              type: call
              call: "sfdc-lead.get-lead"
              with:
                id: "{{lead_id}}"
            - name: enrich-from-zoominfo
              type: call
              call: "zoominfo-api.enrich-contact"
              with:
                email: "{{get-lead.email}}"
                company: "{{get-lead.company}}"
            - name: update-lead
              type: call
              call: "sfdc-lead.update-lead"
              with:
                id: "{{lead_id}}"
                title: "{{enrich-from-zoominfo.job_title}}"
                phone: "{{enrich-from-zoominfo.direct_phone}}"
                company_revenue: "{{enrich-from-zoominfo.company_revenue}}"
            - name: notify-rep
              type: call
              call: "slack-sales.post-message"
              with:
                channel: "$secrets.sales_slack_channel"
                text: "Lead enriched: {{get-lead.name}} at {{get-lead.company}} | Revenue: {{enrich-from-zoominfo.company_revenue}} | Title: {{enrich-from-zoominfo.job_title}}"
  consumes:
    - type: http
      namespace: sfdc-lead
      baseUri: "https://morganstanley.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: leads
          path: "/sobjects/Lead/{{id}}"
          inputParameters:
            - name: id
              in: path
          operations:
            - name: get-lead
              method: GET
            - name: update-lead
              method: PATCH
    - type: http
      namespace: zoominfo-api
      baseUri: "https://api.zoominfo.com"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: contacts
          path: "/enrich/contact"
          operations:
            - name: enrich-contact
              method: POST
    - type: http
      namespace: slack-sales
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_bot_token"
      resources:
        - name: messages
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST