Amazon Capabilities

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

Sort
Expand

Retrieves performance metrics for an Amazon Advertising campaign including impressions, clicks, and spend.

naftiko: "0.5"
info:
  label: "Advertising Campaign Metrics"
  description: "Retrieves performance metrics for an Amazon Advertising campaign including impressions, clicks, and spend."
  tags:
    - advertising
    - marketing
    - analytics
capability:
  exposes:
    - type: mcp
      namespace: ads-metrics
      port: 8080
      tools:
        - name: get-campaign-metrics
          description: "Fetch performance metrics for a given Amazon Advertising campaign. Returns impressions, clicks, CTR, and spend."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Amazon Advertising campaign ID to retrieve metrics for."
            - name: date_range
              in: body
              type: string
              description: "The date range for metrics, e.g. last-7-days."
          call: "ads-api.get-campaign-report"
          with:
            campaign_id: "{{campaign_id}}"
            date_range: "{{date_range}}"
          outputParameters:
            - name: impressions
              type: number
              mapping: "$.metrics.impressions"
            - name: clicks
              type: number
              mapping: "$.metrics.clicks"
            - name: spend
              type: number
              mapping: "$.metrics.cost"
  consumes:
    - namespace: ads-api
      type: http
      baseUri: "https://advertising-api.amazon.com/v3"
      authentication:
        type: bearer
        token: "$secrets.amazon_ads_token"
      resources:
        - name: campaigns
          path: "/campaigns/{campaign_id}/report"
          inputParameters:
            - name: campaign_id
              in: path
            - name: date_range
              in: query
          operations:
            - name: get-campaign-report
              method: GET

Monitors Amazon Advertising campaign spend against budget thresholds, pauses overspending campaigns, and notifies the marketing team via Slack.

naftiko: "0.5"
info:
  label: "Advertising Spend Anomaly Detector"
  description: "Monitors Amazon Advertising campaign spend against budget thresholds, pauses overspending campaigns, and notifies the marketing team via Slack."
  tags:
    - advertising
    - finops
    - cost-management
    - marketing
    - slack
capability:
  exposes:
    - type: mcp
      namespace: ads-anomaly
      port: 8080
      tools:
        - name: detect-spend-anomaly
          description: "Check advertising campaign spend against budget, pause campaigns exceeding threshold, and alert the marketing team."
          inputParameters:
            - name: campaign_id
              in: body
              type: string
              description: "The Amazon Advertising campaign ID to monitor."
            - name: budget_threshold
              in: body
              type: number
              description: "The daily budget threshold in USD."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel for marketing alerts."
          steps:
            - name: get-spend
              type: call
              call: "ads-spend.get-campaign-spend"
              with:
                campaign_id: "{{campaign_id}}"
            - name: pause-campaign
              type: call
              call: "ads-spend.update-campaign-status"
              with:
                campaign_id: "{{campaign_id}}"
                status: "PAUSED"
            - name: alert-team
              type: call
              call: "slack-ads.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Spend Alert: Campaign {{campaign_id}} spend ${{get-spend.daily_spend}} exceeded budget ${{budget_threshold}}. Campaign paused."
  consumes:
    - namespace: ads-spend
      type: http
      baseUri: "https://advertising-api.amazon.com/v3"
      authentication:
        type: bearer
        token: "$secrets.amazon_ads_token"
      resources:
        - name: campaign-spend
          path: "/campaigns/{campaign_id}/spend"
          inputParameters:
            - name: campaign_id
              in: path
          operations:
            - name: get-campaign-spend
              method: GET
        - name: campaign-status
          path: "/campaigns/{campaign_id}"
          inputParameters:
            - name: campaign_id
              in: path
            - name: status
              in: body
          operations:
            - name: update-campaign-status
              method: PUT
    - namespace: slack-ads
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches a Confluence page by ID, sends the content to the Anthropic Claude API for summarization, and posts the executive summary to a Slack channel.

naftiko: "0.5"
info:
  label: "AI-Assisted Document Summarization"
  description: "Fetches a Confluence page by ID, sends the content to the Anthropic Claude API for summarization, and posts the executive summary to a Slack channel."
  tags:
    - ai
    - knowledge-management
    - confluence
    - anthropic
    - slack
capability:
  exposes:
    - type: mcp
      namespace: ai-summarize
      port: 8080
      tools:
        - name: summarize-confluence-page
          description: "Given a Confluence page ID and a Slack channel, fetch the page content from Confluence, send it to the Anthropic Claude API for a concise executive summary, and post the result to Slack."
          inputParameters:
            - name: page_id
              in: body
              type: string
              description: "The Confluence page ID to fetch and summarize."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID where the AI-generated summary will be posted."
          steps:
            - name: get-page
              type: call
              call: "confluence-ai.get-page"
              with:
                page_id: "{{page_id}}"
            - name: generate-summary
              type: call
              call: "anthropic-ai.create-message"
              with:
                model: "claude-opus-4-5"
                max_tokens: 300
                system: "You are a technical writer. Produce a concise 3-sentence executive summary of the following document."
                user_message: "{{get-page.body}}"
            - name: post-summary
              type: call
              call: "slack-ai.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "AI Summary of '{{get-page.title}}': {{generate-summary.content}}"
  consumes:
    - namespace: confluence-ai
      type: http
      baseUri: "https://amazon.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: page
          path: "/content/{page_id}"
          inputParameters:
            - name: page_id
              in: path
          operations:
            - name: get-page
              method: GET
    - namespace: anthropic-ai
      type: http
      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
    - namespace: slack-ai
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks the publication status of an Alexa skill by skill ID and returns its current certification state.

naftiko: "0.5"
info:
  label: "Alexa Skill Status Check"
  description: "Checks the publication status of an Alexa skill by skill ID and returns its current certification state."
  tags:
    - voice
    - alexa
    - smart-home
capability:
  exposes:
    - type: mcp
      namespace: alexa-status
      port: 8080
      tools:
        - name: get-skill-status
          description: "Given an Alexa skill ID, return its current publication and certification status."
          inputParameters:
            - name: skill_id
              in: body
              type: string
              description: "The Alexa skill ID to check status for."
          call: "alexa-api.get-skill-status"
          with:
            skill_id: "{{skill_id}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.manifest.lastUpdateRequest.status"
  consumes:
    - namespace: alexa-api
      type: http
      baseUri: "https://api.amazonalexa.com/v1"
      authentication:
        type: bearer
        token: "$secrets.alexa_developer_token"
      resources:
        - name: skill
          path: "/skills/{skill_id}/status"
          inputParameters:
            - name: skill_id
              in: path
          operations:
            - name: get-skill-status
              method: GET

Pulls usage metrics for an Alexa skill, generates a weekly digest, and posts the summary to a Slack channel.

naftiko: "0.5"
info:
  label: "Alexa Skill Usage Analytics Digest"
  description: "Pulls usage metrics for an Alexa skill, generates a weekly digest, and posts the summary to a Slack channel."
  tags:
    - voice
    - alexa
    - analytics
    - slack
capability:
  exposes:
    - type: mcp
      namespace: alexa-analytics
      port: 8080
      tools:
        - name: generate-usage-digest
          description: "Generate a weekly usage analytics digest for an Alexa skill and post it to Slack."
          inputParameters:
            - name: skill_id
              in: body
              type: string
              description: "The Alexa skill ID to pull usage metrics for."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID to post the digest to."
          steps:
            - name: get-usage-metrics
              type: call
              call: "alexa-metrics.get-skill-metrics"
              with:
                skill_id: "{{skill_id}}"
                metric: "uniqueCustomers,totalSessions"
            - name: post-digest
              type: call
              call: "slack-alexa.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Alexa Skill Weekly Digest ({{skill_id}}): Unique customers: {{get-usage-metrics.unique_customers}}, Total sessions: {{get-usage-metrics.total_sessions}}"
  consumes:
    - namespace: alexa-metrics
      type: http
      baseUri: "https://api.amazonalexa.com/v1"
      authentication:
        type: bearer
        token: "$secrets.alexa_developer_token"
      resources:
        - name: metrics
          path: "/skills/{skill_id}/metrics"
          inputParameters:
            - name: skill_id
              in: path
            - name: metric
              in: query
          operations:
            - name: get-skill-metrics
              method: GET
    - namespace: slack-alexa
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Syncs content from Confluence into an Amazon Q knowledge base index, triggers a re-index, and posts sync status to Slack.

naftiko: "0.5"
info:
  label: "Amazon Q Knowledge Base Sync"
  description: "Syncs content from Confluence into an Amazon Q knowledge base index, triggers a re-index, and posts sync status to Slack."
  tags:
    - ai
    - knowledge-management
    - aws
    - amazon-q
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: q-kb-sync
      port: 8080
      tools:
        - name: sync-knowledge-base
          description: "Pull content from Confluence, sync it to an Amazon Q knowledge base, and report status to Slack."
          inputParameters:
            - name: confluence_space
              in: body
              type: string
              description: "The Confluence space key to sync from."
            - name: index_id
              in: body
              type: string
              description: "The Amazon Q index ID to sync to."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for sync notifications."
          steps:
            - name: get-space-content
              type: call
              call: "confluence-q.get-space-content"
              with:
                space_key: "{{confluence_space}}"
            - name: start-sync
              type: call
              call: "q-api.start-data-source-sync"
              with:
                index_id: "{{index_id}}"
                data_source_id: "confluence-{{confluence_space}}"
            - name: notify-sync
              type: call
              call: "slack-q.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Amazon Q KB Sync started for index {{index_id}} from Confluence space {{confluence_space}}. Sync execution: {{start-sync.execution_id}}."
  consumes:
    - namespace: confluence-q
      type: http
      baseUri: "https://amazon.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: space
          path: "/space/{space_key}/content"
          inputParameters:
            - name: space_key
              in: path
          operations:
            - name: get-space-content
              method: GET
    - namespace: q-api
      type: http
      baseUri: "https://qbusiness.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_q_token"
        placement: header
      resources:
        - name: data-source-sync
          path: "/applications/{index_id}/data-sources/{data_source_id}/sync"
          inputParameters:
            - name: index_id
              in: path
            - name: data_source_id
              in: path
          operations:
            - name: start-data-source-sync
              method: POST
    - namespace: slack-q
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors API Gateway 429 error rates via CloudWatch, adjusts throttling limits, and logs the changes to DynamoDB.

naftiko: "0.5"
info:
  label: "API Gateway Throttling Adjuster"
  description: "Monitors API Gateway 429 error rates via CloudWatch, adjusts throttling limits, and logs the changes to DynamoDB."
  tags:
    - cloud
    - api-management
    - aws
    - api-gateway
    - cloudwatch
    - dynamodb
capability:
  exposes:
    - type: mcp
      namespace: apigw-throttle
      port: 8080
      tools:
        - name: adjust-throttling
          description: "Monitor API Gateway 429 rates, adjust throttling limits if needed, and log the change."
          inputParameters:
            - name: api_id
              in: body
              type: string
              description: "The API Gateway API ID."
            - name: stage_name
              in: body
              type: string
              description: "The API Gateway stage name."
            - name: new_rate_limit
              in: body
              type: number
              description: "The new requests-per-second rate limit."
          steps:
            - name: get-429-rate
              type: call
              call: "cw-apigw.get-metric-data"
              with:
                namespace: "AWS/ApiGateway"
                metric_name: "4XXError"
                api_id: "{{api_id}}"
            - name: update-throttle
              type: call
              call: "apigw-api.update-stage"
              with:
                api_id: "{{api_id}}"
                stage_name: "{{stage_name}}"
                rate_limit: "{{new_rate_limit}}"
            - name: log-change
              type: call
              call: "dynamo-apigw.put-item"
              with:
                table_name: "apigw-throttle-changes"
                api_id: "{{api_id}}"
                previous_429_rate: "{{get-429-rate.sum}}"
                new_rate_limit: "{{new_rate_limit}}"
  consumes:
    - namespace: cw-apigw
      type: http
      baseUri: "https://monitoring.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: metric
          path: "/"
          operations:
            - name: get-metric-data
              method: POST
    - namespace: apigw-api
      type: http
      baseUri: "https://apigateway.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_apigw_token"
        placement: header
      resources:
        - name: stage
          path: "/restapis/{api_id}/stages/{stage_name}"
          inputParameters:
            - name: api_id
              in: path
            - name: stage_name
              in: path
          operations:
            - name: update-stage
              method: PATCH
    - namespace: dynamo-apigw
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST

Monitors Athena query execution costs by tracking data scanned, logs expensive queries to DynamoDB, and alerts the data team via Slack.

naftiko: "0.5"
info:
  label: "Athena Query Cost Tracker"
  description: "Monitors Athena query execution costs by tracking data scanned, logs expensive queries to DynamoDB, and alerts the data team via Slack."
  tags:
    - cloud
    - analytics
    - cost-management
    - aws
    - athena
    - dynamodb
    - slack
capability:
  exposes:
    - type: mcp
      namespace: athena-cost
      port: 8080
      tools:
        - name: track-query-cost
          description: "Check an Athena query execution for data scanned, log expensive queries, and alert the data team."
          inputParameters:
            - name: query_execution_id
              in: body
              type: string
              description: "The Athena query execution ID to track."
            - name: cost_threshold_gb
              in: body
              type: number
              description: "Data scanned threshold in GB that triggers an alert."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for data cost alerts."
          steps:
            - name: get-query-execution
              type: call
              call: "athena-api.get-query-execution"
              with:
                query_execution_id: "{{query_execution_id}}"
            - name: log-expensive-query
              type: call
              call: "dynamo-athena.put-item"
              with:
                table_name: "athena-cost-tracking"
                query_id: "{{query_execution_id}}"
                data_scanned_bytes: "{{get-query-execution.data_scanned}}"
                status: "{{get-query-execution.status}}"
            - name: alert-team
              type: call
              call: "slack-athena.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Athena Cost Alert: Query {{query_execution_id}} scanned {{get-query-execution.data_scanned}} bytes. Status: {{get-query-execution.status}}."
  consumes:
    - namespace: athena-api
      type: http
      baseUri: "https://athena.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_athena_token"
        placement: header
      resources:
        - name: query
          path: "/"
          operations:
            - name: get-query-execution
              method: POST
    - namespace: dynamo-athena
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST
    - namespace: slack-athena
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Tracks Amazon Bedrock foundation model invocation metrics, logs usage patterns to DynamoDB, and posts a usage digest to Slack.

naftiko: "0.5"
info:
  label: "Bedrock Model Invocation Monitor"
  description: "Tracks Amazon Bedrock foundation model invocation metrics, logs usage patterns to DynamoDB, and posts a usage digest to Slack."
  tags:
    - ai
    - generative-ai
    - monitoring
    - aws
    - bedrock
    - dynamodb
    - slack
capability:
  exposes:
    - type: mcp
      namespace: bedrock-monitor
      port: 8080
      tools:
        - name: monitor-model-usage
          description: "Track Bedrock model invocations, log usage to DynamoDB, and post a digest to Slack."
          inputParameters:
            - name: model_id
              in: body
              type: string
              description: "The Bedrock model ID to monitor, e.g. anthropic.claude-v2."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for usage digests."
          steps:
            - name: get-invocation-metrics
              type: call
              call: "cw-bedrock.get-metric-data"
              with:
                namespace: "AWS/Bedrock"
                metric_name: "Invocations"
                model_id: "{{model_id}}"
            - name: log-usage
              type: call
              call: "dynamo-bedrock.put-item"
              with:
                table_name: "bedrock-usage-log"
                model_id: "{{model_id}}"
                invocation_count: "{{get-invocation-metrics.sum}}"
            - name: post-digest
              type: call
              call: "slack-bedrock.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Bedrock Usage Digest: Model {{model_id}} - {{get-invocation-metrics.sum}} invocations in the last 24 hours."
  consumes:
    - namespace: cw-bedrock
      type: http
      baseUri: "https://monitoring.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: metric
          path: "/"
          operations:
            - name: get-metric-data
              method: POST
    - namespace: dynamo-bedrock
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST
    - namespace: slack-bedrock
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a GitHub Actions pipeline fails on a protected branch, creates a Jira bug, posts a Datadog deployment event marker, and alerts the engineering team Slack channel.

naftiko: "0.5"
info:
  label: "CI/CD Pipeline Failure Response"
  description: "When a GitHub Actions pipeline fails on a protected branch, creates a Jira bug, posts a Datadog deployment event marker, and alerts the engineering team Slack channel."
  tags:
    - devops
    - ci-cd
    - incident-response
    - github
    - jira
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: devops-ops
      port: 8080
      tools:
        - name: handle-pipeline-failure
          description: "Given a GitHub Actions pipeline failure event with project, branch, commit SHA, and log URL, create a Jira bug, post a Datadog deployment marker, and alert the Slack engineering channel."
          inputParameters:
            - name: project
              in: body
              type: string
              description: "The GitHub repository name where the pipeline failed, e.g. amazon/platform-core."
            - name: branch
              in: body
              type: string
              description: "The branch name where the pipeline failure occurred."
            - name: commit_sha
              in: body
              type: string
              description: "The git commit SHA that triggered the failed pipeline run."
            - name: failed_job
              in: body
              type: string
              description: "The name of the specific job that failed in the workflow."
            - name: log_url
              in: body
              type: string
              description: "The URL to the failed pipeline run logs in GitHub Actions."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for engineering alerts."
          steps:
            - name: create-bug
              type: call
              call: "jira-devops.create-issue"
              with:
                project_key: "ENG"
                issuetype: "Bug"
                summary: "[CI Failure] {{project}} / {{branch}} — {{failed_job}}"
                description: "Commit: {{commit_sha}}\nLog: {{log_url}}"
            - name: create-dd-event
              type: call
              call: "datadog.create-event"
              with:
                title: "Pipeline failure: {{project}} on {{branch}}"
                text: "Job {{failed_job}} failed. Commit: {{commit_sha}}"
                alert_type: "error"
            - name: post-alert
              type: call
              call: "slack-devops.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Pipeline Failure: {{project}} | Branch: {{branch}} | Job: {{failed_job}} | Jira: {{create-bug.key}} | Log: {{log_url}}"
  consumes:
    - namespace: jira-devops
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: datadog
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: event
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - namespace: slack-devops
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Datadog for cloud cost anomalies exceeding a threshold, creates a Jira cost-investigation ticket, and posts a summary to the FinOps Slack channel.

naftiko: "0.5"
info:
  label: "Cloud Cost Anomaly Responder"
  description: "Queries Datadog for cloud cost anomalies exceeding a threshold, creates a Jira cost-investigation ticket, and posts a summary to the FinOps Slack channel."
  tags:
    - cloud
    - finops
    - cost-management
    - datadog
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: finops-ops
      port: 8080
      tools:
        - name: handle-cost-anomaly
          description: "Given a cost anomaly metric query and threshold, fetch Datadog metrics to confirm the anomaly, open a Jira cost-investigation ticket, and post a FinOps Slack alert."
          inputParameters:
            - name: metric_query
              in: body
              type: string
              description: "The Datadog metrics query string identifying the cost metric, e.g. aws.ec2.estimated_charges."
            - name: threshold
              in: body
              type: number
              description: "The cost threshold in USD above which an anomaly is declared."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key for the cost-investigation ticket, e.g. FINOPS."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the FinOps alert notification."
          steps:
            - name: query-metrics
              type: call
              call: "datadog-cost.query-metrics"
              with:
                query: "{{metric_query}}"
            - name: create-ticket
              type: call
              call: "jira-cost.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Task"
                summary: "Cost anomaly detected: {{metric_query}} exceeded ${{threshold}}"
                description: "Datadog query result: {{query-metrics.value}}"
            - name: post-finops-alert
              type: call
              call: "slack-cost.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Cost Anomaly: {{metric_query}} = {{query-metrics.value}} (threshold: ${{threshold}}). Jira: {{create-ticket.key}}"
  consumes:
    - namespace: datadog-cost
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/query"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: query-metrics
              method: GET
    - namespace: jira-cost
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: slack-cost
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Describes a CloudFormation stack and returns its current status, outputs, and last updated timestamp.

naftiko: "0.5"
info:
  label: "CloudFormation Stack Status"
  description: "Describes a CloudFormation stack and returns its current status, outputs, and last updated timestamp."
  tags:
    - cloud
    - infrastructure
    - aws
    - cloudformation
capability:
  exposes:
    - type: mcp
      namespace: cfn-status
      port: 8080
      tools:
        - name: describe-stack
          description: "Get the status, outputs, and last update time for a CloudFormation stack."
          inputParameters:
            - name: stack_name
              in: body
              type: string
              description: "The CloudFormation stack name or ARN to describe."
          call: "cfn-api.describe-stack"
          with:
            stack_name: "{{stack_name}}"
          outputParameters:
            - name: stack_status
              type: string
              mapping: "$.Stacks[0].StackStatus"
            - name: outputs
              type: array
              mapping: "$.Stacks[0].Outputs"
  consumes:
    - namespace: cfn-api
      type: http
      baseUri: "https://cloudformation.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cfn_token"
        placement: header
      resources:
        - name: stack
          path: "/"
          inputParameters:
            - name: stack_name
              in: query
          operations:
            - name: describe-stack
              method: GET

Creates a CloudFront cache invalidation after a deployment, monitors its completion, and notifies the engineering team via Slack.

naftiko: "0.5"
info:
  label: "CloudFront Cache Invalidation Workflow"
  description: "Creates a CloudFront cache invalidation after a deployment, monitors its completion, and notifies the engineering team via Slack."
  tags:
    - cloud
    - cdn
    - deployment
    - aws
    - cloudfront
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cf-invalidation
      port: 8080
      tools:
        - name: invalidate-and-notify
          description: "Create a CloudFront cache invalidation for specified paths, check completion status, and notify the team via Slack."
          inputParameters:
            - name: distribution_id
              in: body
              type: string
              description: "The CloudFront distribution ID to invalidate."
            - name: paths
              in: body
              type: string
              description: "Comma-separated list of paths to invalidate, e.g. /index.html,/assets/*."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for invalidation notifications."
          steps:
            - name: create-invalidation
              type: call
              call: "cf-api.create-invalidation"
              with:
                distribution_id: "{{distribution_id}}"
                paths: "{{paths}}"
            - name: check-status
              type: call
              call: "cf-api.get-invalidation"
              with:
                distribution_id: "{{distribution_id}}"
                invalidation_id: "{{create-invalidation.invalidation_id}}"
            - name: notify-team
              type: call
              call: "slack-cf.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "CloudFront Invalidation {{create-invalidation.invalidation_id}} for distribution {{distribution_id}}: Status {{check-status.status}}. Paths: {{paths}}"
  consumes:
    - namespace: cf-api
      type: http
      baseUri: "https://cloudfront.amazonaws.com/2020-05-31"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudfront_token"
        placement: header
      resources:
        - name: invalidation
          path: "/distribution/{distribution_id}/invalidation"
          inputParameters:
            - name: distribution_id
              in: path
            - name: paths
              in: body
          operations:
            - name: create-invalidation
              method: POST
        - name: invalidation-status
          path: "/distribution/{distribution_id}/invalidation/{invalidation_id}"
          inputParameters:
            - name: distribution_id
              in: path
            - name: invalidation_id
              in: path
          operations:
            - name: get-invalidation
              method: GET
    - namespace: slack-cf
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries CloudTrail for suspicious API activity patterns, creates a finding in Security Hub, and alerts the SOC team via PagerDuty.

naftiko: "0.5"
info:
  label: "CloudTrail Suspicious Activity Alerter"
  description: "Queries CloudTrail for suspicious API activity patterns, creates a finding in Security Hub, and alerts the SOC team via PagerDuty."
  tags:
    - cloud
    - security
    - monitoring
    - aws
    - cloudtrail
    - security-hub
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: cloudtrail-alert
      port: 8080
      tools:
        - name: detect-suspicious-activity
          description: "Query CloudTrail for suspicious patterns, create a Security Hub finding, and page the SOC team."
          inputParameters:
            - name: event_name
              in: body
              type: string
              description: "The CloudTrail event name to search for, e.g. ConsoleLogin."
            - name: time_range_hours
              in: body
              type: number
              description: "Number of hours to look back for events."
          steps:
            - name: lookup-events
              type: call
              call: "cloudtrail-api.lookup-events"
              with:
                event_name: "{{event_name}}"
                time_range_hours: "{{time_range_hours}}"
            - name: create-finding
              type: call
              call: "securityhub-api.batch-import-findings"
              with:
                title: "Suspicious Activity: {{event_name}}"
                description: "{{lookup-events.event_count}} occurrences of {{event_name}} in the last {{time_range_hours}} hours."
                severity: "HIGH"
            - name: page-soc
              type: call
              call: "pagerduty-ct.create-incident"
              with:
                service_id: "SOC_SERVICE"
                title: "CloudTrail Alert: {{lookup-events.event_count}} suspicious {{event_name}} events detected."
  consumes:
    - namespace: cloudtrail-api
      type: http
      baseUri: "https://cloudtrail.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudtrail_token"
        placement: header
      resources:
        - name: events
          path: "/"
          operations:
            - name: lookup-events
              method: POST
    - namespace: securityhub-api
      type: http
      baseUri: "https://securityhub.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_securityhub_token"
        placement: header
      resources:
        - name: findings
          path: "/findings/import"
          operations:
            - name: batch-import-findings
              method: POST
    - namespace: pagerduty-ct
      type: http
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incident
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Queries a specific CloudWatch metric for a given namespace and returns the latest data points.

naftiko: "0.5"
info:
  label: "CloudWatch Metric Query"
  description: "Queries a specific CloudWatch metric for a given namespace and returns the latest data points."
  tags:
    - cloud
    - monitoring
    - aws
    - cloudwatch
capability:
  exposes:
    - type: mcp
      namespace: cw-metrics
      port: 8080
      tools:
        - name: get-metric-data
          description: "Retrieve the latest data points for a specific CloudWatch metric. Use to check resource utilization or operational health."
          inputParameters:
            - name: namespace
              in: body
              type: string
              description: "The CloudWatch metric namespace, e.g. AWS/EC2."
            - name: metric_name
              in: body
              type: string
              description: "The name of the metric to query, e.g. CPUUtilization."
            - name: period
              in: body
              type: number
              description: "The granularity in seconds for the metric data points."
          call: "cloudwatch-api.get-metric-data"
          with:
            namespace: "{{namespace}}"
            metric_name: "{{metric_name}}"
            period: "{{period}}"
          outputParameters:
            - name: datapoints
              type: array
              mapping: "$.MetricDataResults[0].Values"
  consumes:
    - namespace: cloudwatch-api
      type: http
      baseUri: "https://monitoring.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: metric-data
          path: "/"
          inputParameters:
            - name: namespace
              in: query
            - name: metric_name
              in: query
            - name: period
              in: query
          operations:
            - name: get-metric-data
              method: POST

Monitors an AWS CodePipeline execution, fetches stage results, and posts a deployment summary to Slack with pass/fail status.

naftiko: "0.5"
info:
  label: "CodePipeline Deployment Tracker"
  description: "Monitors an AWS CodePipeline execution, fetches stage results, and posts a deployment summary to Slack with pass/fail status."
  tags:
    - cloud
    - cicd
    - deployment
    - aws
    - codepipeline
    - slack
capability:
  exposes:
    - type: mcp
      namespace: codepipeline-track
      port: 8080
      tools:
        - name: track-deployment
          description: "Monitor a CodePipeline execution, gather stage results, and post a deployment summary to Slack."
          inputParameters:
            - name: pipeline_name
              in: body
              type: string
              description: "The CodePipeline pipeline name."
            - name: execution_id
              in: body
              type: string
              description: "The pipeline execution ID to track."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for deployment updates."
          steps:
            - name: get-execution
              type: call
              call: "cp-api.get-pipeline-execution"
              with:
                pipeline_name: "{{pipeline_name}}"
                execution_id: "{{execution_id}}"
            - name: get-stage-states
              type: call
              call: "cp-api.get-pipeline-state"
              with:
                pipeline_name: "{{pipeline_name}}"
            - name: post-summary
              type: call
              call: "slack-cp.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Deployment {{execution_id}} for {{pipeline_name}}: Status {{get-execution.status}}. Stages: {{get-stage-states.stage_count}} total."
  consumes:
    - namespace: cp-api
      type: http
      baseUri: "https://codepipeline.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_codepipeline_token"
        placement: header
      resources:
        - name: execution
          path: "/"
          operations:
            - name: get-pipeline-execution
              method: POST
        - name: state
          path: "/"
          operations:
            - name: get-pipeline-state
              method: POST
    - namespace: slack-cp
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates a new user in Amazon Cognito, assigns them to appropriate groups, and sends a welcome email via SES with temporary credentials.

naftiko: "0.5"
info:
  label: "Cognito User Provisioning Workflow"
  description: "Creates a new user in Amazon Cognito, assigns them to appropriate groups, and sends a welcome email via SES with temporary credentials."
  tags:
    - cloud
    - identity
    - aws
    - cognito
    - ses
capability:
  exposes:
    - type: mcp
      namespace: cognito-provision
      port: 8080
      tools:
        - name: provision-user
          description: "Create a Cognito user, assign to groups, and send a welcome email with temporary credentials."
          inputParameters:
            - name: user_pool_id
              in: body
              type: string
              description: "The Cognito user pool ID."
            - name: username
              in: body
              type: string
              description: "The username to create."
            - name: email
              in: body
              type: string
              description: "The user email address."
            - name: group_name
              in: body
              type: string
              description: "The Cognito group to assign the user to."
          steps:
            - name: create-user
              type: call
              call: "cognito-api.admin-create-user"
              with:
                user_pool_id: "{{user_pool_id}}"
                username: "{{username}}"
                email: "{{email}}"
            - name: add-to-group
              type: call
              call: "cognito-api.admin-add-user-to-group"
              with:
                user_pool_id: "{{user_pool_id}}"
                username: "{{username}}"
                group_name: "{{group_name}}"
            - name: send-welcome
              type: call
              call: "ses-cognito.send-email"
              with:
                to: "{{email}}"
                subject: "Welcome to Amazon - Your Account is Ready"
                body: "Hello {{username}}, your account has been created. Temporary password: {{create-user.temporary_password}}. You will be prompted to change it on first login."
  consumes:
    - namespace: cognito-api
      type: http
      baseUri: "https://cognito-idp.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cognito_token"
        placement: header
      resources:
        - name: user
          path: "/"
          operations:
            - name: admin-create-user
              method: POST
            - name: admin-add-user-to-group
              method: POST
    - namespace: ses-cognito
      type: http
      baseUri: "https://email.us-east-1.amazonaws.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ses_token"
        placement: header
      resources:
        - name: email
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Fetches non-compliant AWS Config rule evaluations, triggers SSM Automation remediation, and posts the remediation status to Slack.

naftiko: "0.5"
info:
  label: "Config Compliance Remediator"
  description: "Fetches non-compliant AWS Config rule evaluations, triggers SSM Automation remediation, and posts the remediation status to Slack."
  tags:
    - cloud
    - compliance
    - security
    - aws
    - config
    - ssm
    - slack
capability:
  exposes:
    - type: mcp
      namespace: config-remediate
      port: 8080
      tools:
        - name: remediate-non-compliant
          description: "Fetch non-compliant Config evaluations, trigger SSM remediation, and report status to Slack."
          inputParameters:
            - name: config_rule_name
              in: body
              type: string
              description: "The AWS Config rule name to check."
            - name: ssm_document_name
              in: body
              type: string
              description: "The SSM Automation document for remediation."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for compliance notifications."
          steps:
            - name: get-compliance
              type: call
              call: "config-api.get-compliance-details"
              with:
                config_rule_name: "{{config_rule_name}}"
            - name: start-remediation
              type: call
              call: "ssm-api.start-automation-execution"
              with:
                document_name: "{{ssm_document_name}}"
                resource_id: "{{get-compliance.non_compliant_resource}}"
            - name: notify-team
              type: call
              call: "slack-config.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Config Remediation: Rule {{config_rule_name}} - Resource {{get-compliance.non_compliant_resource}} remediation started. SSM execution: {{start-remediation.execution_id}}."
  consumes:
    - namespace: config-api
      type: http
      baseUri: "https://config.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_config_token"
        placement: header
      resources:
        - name: compliance
          path: "/"
          operations:
            - name: get-compliance-details
              method: POST
    - namespace: ssm-api
      type: http
      baseUri: "https://ssm.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ssm_token"
        placement: header
      resources:
        - name: automation
          path: "/"
          operations:
            - name: start-automation-execution
              method: POST
    - namespace: slack-config
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Given a service name, searches the Confluence knowledge base for the relevant runbook page and returns the runbook URL and summary for use during incident response.

naftiko: "0.5"
info:
  label: "Confluence Runbook Lookup"
  description: "Given a service name, searches the Confluence knowledge base for the relevant runbook page and returns the runbook URL and summary for use during incident response."
  tags:
    - itsm
    - knowledge-management
    - confluence
    - incident-response
capability:
  exposes:
    - type: mcp
      namespace: kb-lookup
      port: 8080
      tools:
        - name: get-runbook
          description: "Given a service name, search Confluence for the relevant runbook page and return the page URL and excerpt. Use during incident triage to quickly surface operational runbooks."
          inputParameters:
            - name: service_name
              in: body
              type: string
              description: "The service name to search for in Confluence runbooks, e.g. payment-gateway."
          call: "confluence.search-content"
          with:
            cql: "type=page AND title~\"{{service_name}} runbook\""
          outputParameters:
            - name: runbook_url
              type: string
              mapping: "$.results[0]._links.webui"
            - name: runbook_title
              type: string
              mapping: "$.results[0].title"
  consumes:
    - namespace: confluence
      type: http
      baseUri: "https://amazon.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: content
          path: "/content/search"
          inputParameters:
            - name: cql
              in: query
          operations:
            - name: search-content
              method: GET

Queries AWS Cost Explorer for current month spend by service, compares against budgets, and posts an overspend alert to Slack with a Jira ticket.

naftiko: "0.5"
info:
  label: "Cost Explorer Budget Alert"
  description: "Queries AWS Cost Explorer for current month spend by service, compares against budgets, and posts an overspend alert to Slack with a Jira ticket."
  tags:
    - cloud
    - finops
    - cost-management
    - aws
    - cost-explorer
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: cost-budget
      port: 8080
      tools:
        - name: check-budget-compliance
          description: "Query Cost Explorer for current spend, compare against budget, create a Jira ticket if over budget, and post to Slack."
          inputParameters:
            - name: budget_amount
              in: body
              type: number
              description: "The monthly budget amount in USD."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for budget tickets."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for budget alerts."
          steps:
            - name: get-cost-data
              type: call
              call: "ce-api.get-cost-and-usage"
              with:
                granularity: "MONTHLY"
                metrics: "UnblendedCost"
            - name: create-ticket
              type: call
              call: "jira-budget.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Task"
                summary: "Budget Alert: Current spend ${{get-cost-data.total_cost}} vs budget ${{budget_amount}}"
            - name: post-alert
              type: call
              call: "slack-budget.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Budget Alert: Current month spend ${{get-cost-data.total_cost}} against budget ${{budget_amount}}. Jira: {{create-ticket.key}}"
  consumes:
    - namespace: ce-api
      type: http
      baseUri: "https://ce.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cost_explorer_token"
        placement: header
      resources:
        - name: cost
          path: "/"
          operations:
            - name: get-cost-and-usage
              method: POST
    - namespace: jira-budget
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: slack-budget
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Datadog monitor triggers a critical alert, automatically opens a ServiceNow incident, pages the on-call team via PagerDuty, and posts a war-room Slack message.

naftiko: "0.5"
info:
  label: "Datadog Alert Incident Bridge"
  description: "When a Datadog monitor triggers a critical alert, automatically opens a ServiceNow incident, pages the on-call team via PagerDuty, and posts a war-room Slack message."
  tags:
    - observability
    - incident-response
    - datadog
    - servicenow
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: observability-ops
      port: 8080
      tools:
        - name: handle-critical-alert
          description: "Given a Datadog monitor ID and alert details, open a ServiceNow incident, trigger a PagerDuty incident for the on-call engineer, and post a war-room message in Slack."
          inputParameters:
            - name: monitor_id
              in: body
              type: string
              description: "The Datadog monitor ID that triggered the alert."
            - name: monitor_name
              in: body
              type: string
              description: "The human-readable name of the Datadog monitor."
            - name: alert_message
              in: body
              type: string
              description: "The alert body text describing what threshold was breached."
            - name: pagerduty_service_key
              in: body
              type: string
              description: "The PagerDuty integration service key for routing the incident."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the war-room notification."
          steps:
            - name: open-incident
              type: call
              call: "servicenow-obs.create-incident"
              with:
                short_description: "Critical alert: {{monitor_name}}"
                description: "{{alert_message}}"
                urgency: "1"
                impact: "1"
            - name: page-oncall
              type: call
              call: "pagerduty.create-incident"
              with:
                service_key: "{{pagerduty_service_key}}"
                description: "Critical Datadog alert: {{monitor_name}}"
                incident_key: "dd-{{monitor_id}}"
            - name: post-warroom
              type: call
              call: "slack-obs.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "CRITICAL ALERT: {{monitor_name}} | ServiceNow: {{open-incident.number}} | PagerDuty: {{page-oncall.incident_id}} | {{alert_message}}"
  consumes:
    - namespace: servicenow-obs
      type: http
      baseUri: "https://amazon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incident
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - namespace: pagerduty
      type: http
      baseUri: "https://events.pagerduty.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incident
          path: "/enqueue"
          operations:
            - name: create-incident
              method: POST
    - namespace: slack-obs
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Datadog for SLO burn rate on a target service, and if the burn rate exceeds the threshold, pages PagerDuty and posts a remediation link in Slack.

naftiko: "0.5"
info:
  label: "Datadog SLO Burn Rate Alert"
  description: "Queries Datadog for SLO burn rate on a target service, and if the burn rate exceeds the threshold, pages PagerDuty and posts a remediation link in Slack."
  tags:
    - observability
    - slo
    - datadog
    - pagerduty
    - slack
capability:
  exposes:
    - type: mcp
      namespace: slo-ops
      port: 8080
      tools:
        - name: handle-slo-burn-alert
          description: "Given a Datadog SLO ID and burn rate threshold, check the current SLO burn rate and if it exceeds the threshold, page PagerDuty and alert the Slack ops channel with the SLO status and a remediation link."
          inputParameters:
            - name: slo_id
              in: body
              type: string
              description: "The Datadog SLO ID to check the burn rate for."
            - name: burn_rate_threshold
              in: body
              type: number
              description: "The burn rate multiplier above which an alert is triggered, e.g. 14.4 for a 1-hour burn window."
            - name: pagerduty_service_key
              in: body
              type: string
              description: "The PagerDuty integration service key for routing the SLO burn alert."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the SLO burn notification."
          steps:
            - name: get-slo
              type: call
              call: "datadog-slo.get-slo"
              with:
                slo_id: "{{slo_id}}"
            - name: page-oncall
              type: call
              call: "pagerduty-slo.create-incident"
              with:
                service_key: "{{pagerduty_service_key}}"
                description: "SLO burn rate alert: {{get-slo.name}} burn rate = {{get-slo.burn_rate}}"
                incident_key: "slo-{{slo_id}}"
            - name: post-slo-alert
              type: call
              call: "slack-slo.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "SLO BURN ALERT: {{get-slo.name}} | Burn rate: {{get-slo.burn_rate}} (threshold: {{burn_rate_threshold}}) | Remaining error budget: {{get-slo.error_budget_remaining}}%"
  consumes:
    - namespace: datadog-slo
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: slo
          path: "/slo/{slo_id}"
          inputParameters:
            - name: slo_id
              in: path
          operations:
            - name: get-slo
              method: GET
    - namespace: pagerduty-slo
      type: http
      baseUri: "https://events.pagerduty.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incident
          path: "/enqueue"
          operations:
            - name: create-incident
              method: POST
    - namespace: slack-slo
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Calculates estimated delivery time for an Amazon order using logistics data and warehouse location, then updates the order with the delivery estimate.

naftiko: "0.5"
info:
  label: "Delivery ETA Estimator"
  description: "Calculates estimated delivery time for an Amazon order using logistics data and warehouse location, then updates the order with the delivery estimate."
  tags:
    - ecommerce
    - logistics
    - delivery
    - fulfillment
capability:
  exposes:
    - type: mcp
      namespace: delivery-eta
      port: 8080
      tools:
        - name: estimate-delivery
          description: "Calculate delivery ETA for an order using warehouse location and destination, then update the order with the estimate."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The Amazon order ID to estimate delivery for."
            - name: destination_zip
              in: body
              type: string
              description: "The destination ZIP code."
          steps:
            - name: get-order-warehouse
              type: call
              call: "logistics-api.get-fulfillment-center"
              with:
                order_id: "{{order_id}}"
            - name: calculate-eta
              type: call
              call: "logistics-api.calculate-transit-time"
              with:
                origin_zip: "{{get-order-warehouse.warehouse_zip}}"
                destination_zip: "{{destination_zip}}"
                shipping_method: "{{get-order-warehouse.shipping_method}}"
            - name: update-order-eta
              type: call
              call: "logistics-api.update-delivery-estimate"
              with:
                order_id: "{{order_id}}"
                estimated_delivery: "{{calculate-eta.estimated_date}}"
  consumes:
    - namespace: logistics-api
      type: http
      baseUri: "https://api.amazon.com/logistics/v1"
      authentication:
        type: bearer
        token: "$secrets.amazon_logistics_token"
      resources:
        - name: fulfillment-center
          path: "/orders/{order_id}/fulfillment-center"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-fulfillment-center
              method: GET
        - name: transit-time
          path: "/transit-time/calculate"
          operations:
            - name: calculate-transit-time
              method: POST
        - name: delivery-estimate
          path: "/orders/{order_id}/delivery-estimate"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: update-delivery-estimate
              method: PUT

Generates an Amazon DSP programmatic advertising report, uploads it to S3, and shares the download link via Slack.

naftiko: "0.5"
info:
  label: "DSP Advertising Report Generator"
  description: "Generates an Amazon DSP programmatic advertising report, uploads it to S3, and shares the download link via Slack."
  tags:
    - advertising
    - dsp
    - analytics
    - aws
    - s3
    - slack
capability:
  exposes:
    - type: mcp
      namespace: dsp-report
      port: 8080
      tools:
        - name: generate-dsp-report
          description: "Generate a DSP advertising report, store it in S3, and share the link in Slack."
          inputParameters:
            - name: advertiser_id
              in: body
              type: string
              description: "The Amazon DSP advertiser ID."
            - name: report_type
              in: body
              type: string
              description: "The report type, e.g. campaign, audience, inventory."
            - name: s3_bucket
              in: body
              type: string
              description: "The S3 bucket for report storage."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel to share the report link."
          steps:
            - name: generate-report
              type: call
              call: "dsp-api.create-report"
              with:
                advertiser_id: "{{advertiser_id}}"
                report_type: "{{report_type}}"
            - name: upload-to-s3
              type: call
              call: "s3-dsp.put-object"
              with:
                bucket: "{{s3_bucket}}"
                key: "dsp-reports/{{advertiser_id}}/{{generate-report.report_id}}.csv"
                body: "{{generate-report.report_data}}"
            - name: share-link
              type: call
              call: "slack-dsp.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "DSP Report Ready: s3://{{s3_bucket}}/dsp-reports/{{advertiser_id}}/{{generate-report.report_id}}.csv"
  consumes:
    - namespace: dsp-api
      type: http
      baseUri: "https://advertising-api.amazon.com/dsp/reports/v3"
      authentication:
        type: bearer
        token: "$secrets.amazon_dsp_token"
      resources:
        - name: report
          path: "/"
          operations:
            - name: create-report
              method: POST
    - namespace: s3-dsp
      type: http
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_s3_token"
        placement: header
      resources:
        - name: object
          path: "/{bucket}/{key}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - namespace: slack-dsp
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves a single item from a DynamoDB table by primary key and returns the full item attributes.

naftiko: "0.5"
info:
  label: "DynamoDB Item Lookup"
  description: "Retrieves a single item from a DynamoDB table by primary key and returns the full item attributes."
  tags:
    - cloud
    - database
    - aws
    - dynamodb
capability:
  exposes:
    - type: mcp
      namespace: dynamo-lookup
      port: 8080
      tools:
        - name: get-item
          description: "Fetch a single item from a DynamoDB table by its primary key. Returns all item attributes."
          inputParameters:
            - name: table_name
              in: body
              type: string
              description: "The DynamoDB table name to query."
            - name: key_value
              in: body
              type: string
              description: "The primary key value for the item to retrieve."
          call: "dynamodb-api.get-item"
          with:
            table_name: "{{table_name}}"
            key_value: "{{key_value}}"
          outputParameters:
            - name: item
              type: object
              mapping: "$.Item"
  consumes:
    - namespace: dynamodb-api
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          inputParameters:
            - name: table_name
              in: body
            - name: key_value
              in: body
          operations:
            - name: get-item
              method: POST

Analyzes EC2 instance CPU and memory utilization via CloudWatch, generates rightsizing recommendations, and posts the findings to a Slack channel.

naftiko: "0.5"
info:
  label: "EC2 Instance Rightsizing Advisor"
  description: "Analyzes EC2 instance CPU and memory utilization via CloudWatch, generates rightsizing recommendations, and posts the findings to a Slack channel."
  tags:
    - cloud
    - finops
    - cost-optimization
    - aws
    - ec2
    - cloudwatch
    - slack
capability:
  exposes:
    - type: mcp
      namespace: ec2-rightsize
      port: 8080
      tools:
        - name: analyze-rightsizing
          description: "Given an EC2 instance ID, analyze its CPU and memory utilization over the last 14 days, generate a rightsizing recommendation, and post results to Slack."
          inputParameters:
            - name: instance_id
              in: body
              type: string
              description: "The EC2 instance ID to analyze for rightsizing."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID to post the recommendation to."
          steps:
            - name: get-cpu-metrics
              type: call
              call: "cloudwatch-rs.get-metric-statistics"
              with:
                instance_id: "{{instance_id}}"
                metric_name: "CPUUtilization"
            - name: get-instance-type
              type: call
              call: "ec2-rs.describe-instance"
              with:
                instance_id: "{{instance_id}}"
            - name: post-recommendation
              type: call
              call: "slack-rs.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Rightsizing Report for {{instance_id}} ({{get-instance-type.instance_type}}): Avg CPU {{get-cpu-metrics.average}}%. Consider downsizing if consistently under 20%."
  consumes:
    - namespace: cloudwatch-rs
      type: http
      baseUri: "https://monitoring.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: metrics
          path: "/"
          inputParameters:
            - name: instance_id
              in: query
            - name: metric_name
              in: query
          operations:
            - name: get-metric-statistics
              method: GET
    - namespace: ec2-rs
      type: http
      baseUri: "https://ec2.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ec2_token"
        placement: header
      resources:
        - name: instance
          path: "/"
          inputParameters:
            - name: instance_id
              in: query
          operations:
            - name: describe-instance
              method: GET
    - namespace: slack-rs
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Lists container images in an Amazon ECR repository and returns image tags and push timestamps.

naftiko: "0.5"
info:
  label: "ECR Image List"
  description: "Lists container images in an Amazon ECR repository and returns image tags and push timestamps."
  tags:
    - cloud
    - containers
    - aws
    - ecr
capability:
  exposes:
    - type: mcp
      namespace: ecr-images
      port: 8080
      tools:
        - name: list-images
          description: "List all container images in a given ECR repository. Returns image tags and pushed-at dates."
          inputParameters:
            - name: repository_name
              in: body
              type: string
              description: "The ECR repository name to list images for."
          call: "ecr-api.list-images"
          with:
            repository_name: "{{repository_name}}"
          outputParameters:
            - name: images
              type: array
              mapping: "$.imageIds"
  consumes:
    - namespace: ecr-api
      type: http
      baseUri: "https://api.ecr.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ecr_token"
        placement: header
      resources:
        - name: images
          path: "/"
          inputParameters:
            - name: repository_name
              in: body
          operations:
            - name: list-images
              method: POST

Monitors ECS service CPU utilization via CloudWatch, adjusts the desired task count based on load, and logs the scaling event to DynamoDB.

naftiko: "0.5"
info:
  label: "ECS Auto-Scaling Adjuster"
  description: "Monitors ECS service CPU utilization via CloudWatch, adjusts the desired task count based on load, and logs the scaling event to DynamoDB."
  tags:
    - cloud
    - containers
    - auto-scaling
    - aws
    - ecs
    - cloudwatch
    - dynamodb
capability:
  exposes:
    - type: mcp
      namespace: ecs-scaling
      port: 8080
      tools:
        - name: adjust-scaling
          description: "Monitor ECS service CPU, adjust desired task count if needed, and log the scaling event."
          inputParameters:
            - name: cluster_name
              in: body
              type: string
              description: "The ECS cluster name."
            - name: service_name
              in: body
              type: string
              description: "The ECS service name to scale."
            - name: cpu_threshold
              in: body
              type: number
              description: "CPU percentage threshold that triggers scaling."
            - name: desired_count
              in: body
              type: number
              description: "The new desired task count to set."
          steps:
            - name: get-cpu-metric
              type: call
              call: "cw-ecs.get-metric-data"
              with:
                cluster_name: "{{cluster_name}}"
                service_name: "{{service_name}}"
                metric_name: "CPUUtilization"
            - name: update-service
              type: call
              call: "ecs-scale.update-service"
              with:
                cluster_name: "{{cluster_name}}"
                service_name: "{{service_name}}"
                desired_count: "{{desired_count}}"
            - name: log-event
              type: call
              call: "dynamo-ecs.put-item"
              with:
                table_name: "ecs-scaling-events"
                service_name: "{{service_name}}"
                cpu_avg: "{{get-cpu-metric.average}}"
                new_count: "{{desired_count}}"
  consumes:
    - namespace: cw-ecs
      type: http
      baseUri: "https://monitoring.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: metric
          path: "/"
          inputParameters:
            - name: cluster_name
              in: query
            - name: service_name
              in: query
            - name: metric_name
              in: query
          operations:
            - name: get-metric-data
              method: POST
    - namespace: ecs-scale
      type: http
      baseUri: "https://ecs.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ecs_token"
        placement: header
      resources:
        - name: service
          path: "/"
          operations:
            - name: update-service
              method: POST
    - namespace: dynamo-ecs
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST

Retrieves the current status and running task count for an Amazon ECS service in a cluster.

naftiko: "0.5"
info:
  label: "ECS Service Status"
  description: "Retrieves the current status and running task count for an Amazon ECS service in a cluster."
  tags:
    - cloud
    - containers
    - aws
    - ecs
capability:
  exposes:
    - type: mcp
      namespace: ecs-status
      port: 8080
      tools:
        - name: describe-service
          description: "Get the status, running count, and desired count for an ECS service. Use to verify deployment health."
          inputParameters:
            - name: cluster_name
              in: body
              type: string
              description: "The ECS cluster name."
            - name: service_name
              in: body
              type: string
              description: "The ECS service name to describe."
          call: "ecs-api.describe-service"
          with:
            cluster_name: "{{cluster_name}}"
            service_name: "{{service_name}}"
          outputParameters:
            - name: running_count
              type: number
              mapping: "$.services[0].runningCount"
            - name: status
              type: string
              mapping: "$.services[0].status"
  consumes:
    - namespace: ecs-api
      type: http
      baseUri: "https://ecs.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ecs_token"
        placement: header
      resources:
        - name: service
          path: "/"
          inputParameters:
            - name: cluster_name
              in: body
            - name: service_name
              in: body
          operations:
            - name: describe-service
              method: POST

Checks the current EKS cluster version, compares with available Kubernetes versions, and generates an upgrade plan posted to Confluence and Slack.

naftiko: "0.5"
info:
  label: "EKS Cluster Upgrade Planner"
  description: "Checks the current EKS cluster version, compares with available Kubernetes versions, and generates an upgrade plan posted to Confluence and Slack."
  tags:
    - cloud
    - kubernetes
    - aws
    - eks
    - confluence
    - slack
capability:
  exposes:
    - type: mcp
      namespace: eks-upgrade
      port: 8080
      tools:
        - name: plan-upgrade
          description: "Check EKS cluster version, identify available upgrades, and post an upgrade plan to Confluence and Slack."
          inputParameters:
            - name: cluster_name
              in: body
              type: string
              description: "The EKS cluster name to check."
            - name: confluence_space
              in: body
              type: string
              description: "Confluence space key for the upgrade plan."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for upgrade notifications."
          steps:
            - name: describe-cluster
              type: call
              call: "eks-api.describe-cluster"
              with:
                cluster_name: "{{cluster_name}}"
            - name: create-plan-page
              type: call
              call: "confluence-eks.create-page"
              with:
                space_key: "{{confluence_space}}"
                title: "EKS Upgrade Plan: {{cluster_name}}"
                body: "Current version: {{describe-cluster.version}}. Cluster status: {{describe-cluster.status}}. Review add-on compatibility before upgrading."
            - name: notify-team
              type: call
              call: "slack-eks.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "EKS Upgrade Plan created for {{cluster_name}} (current: v{{describe-cluster.version}}). Confluence: {{create-plan-page.url}}"
  consumes:
    - namespace: eks-api
      type: http
      baseUri: "https://eks.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_eks_token"
        placement: header
      resources:
        - name: cluster
          path: "/clusters/{cluster_name}"
          inputParameters:
            - name: cluster_name
              in: path
          operations:
            - name: describe-cluster
              method: GET
    - namespace: confluence-eks
      type: http
      baseUri: "https://amazon.atlassian.net/wiki/rest/api"
      authentication:
        type: basic
        username: "$secrets.confluence_user"
        password: "$secrets.confluence_token"
      resources:
        - name: page
          path: "/content"
          operations:
            - name: create-page
              method: POST
    - namespace: slack-eks
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks ElastiCache Redis cluster node health and memory utilization via CloudWatch, then posts a health summary to Slack.

naftiko: "0.5"
info:
  label: "ElastiCache Cluster Health Reporter"
  description: "Checks ElastiCache Redis cluster node health and memory utilization via CloudWatch, then posts a health summary to Slack."
  tags:
    - cloud
    - caching
    - monitoring
    - aws
    - elasticache
    - cloudwatch
    - slack
capability:
  exposes:
    - type: mcp
      namespace: elasticache-health
      port: 8080
      tools:
        - name: report-cluster-health
          description: "Check ElastiCache cluster health metrics and post a summary to Slack."
          inputParameters:
            - name: cluster_id
              in: body
              type: string
              description: "The ElastiCache cluster ID to check."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for health reports."
          steps:
            - name: describe-cluster
              type: call
              call: "elasticache-api.describe-cache-cluster"
              with:
                cluster_id: "{{cluster_id}}"
            - name: get-memory-metric
              type: call
              call: "cw-cache.get-metric-data"
              with:
                cluster_id: "{{cluster_id}}"
                metric_name: "DatabaseMemoryUsagePercentage"
            - name: post-health
              type: call
              call: "slack-cache.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "ElastiCache Health: Cluster {{cluster_id}} status: {{describe-cluster.status}}. Memory usage: {{get-memory-metric.average}}%. Nodes: {{describe-cluster.num_cache_nodes}}."
  consumes:
    - namespace: elasticache-api
      type: http
      baseUri: "https://elasticache.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_elasticache_token"
        placement: header
      resources:
        - name: cluster
          path: "/"
          inputParameters:
            - name: cluster_id
              in: query
          operations:
            - name: describe-cache-cluster
              method: GET
    - namespace: cw-cache
      type: http
      baseUri: "https://monitoring.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: metric
          path: "/"
          operations:
            - name: get-metric-data
              method: POST
    - namespace: slack-cache
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When an employee departure is recorded in Workday, revokes GitHub org access, deactivates the Okta account, resolves open Jira tickets assigned to the departing user, and posts a ServiceNow offboarding task.

naftiko: "0.5"
info:
  label: "Employee Offboarding Sequence"
  description: "When an employee departure is recorded in Workday, revokes GitHub org access, deactivates the Okta account, resolves open Jira tickets assigned to the departing user, and posts a ServiceNow offboarding task."
  tags:
    - hr
    - offboarding
    - workday
    - okta
    - github
    - jira
    - servicenow
capability:
  exposes:
    - type: mcp
      namespace: hr-offboarding
      port: 8080
      tools:
        - name: trigger-offboarding
          description: "Given a Workday employee ID and last working date, revoke GitHub org membership, deactivate Okta account, reassign open Jira issues, and create a ServiceNow offboarding task."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the departing employee."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key to query for open issues assigned to the departing user."
          steps:
            - name: get-employee
              type: call
              call: "workday-off.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: remove-github
              type: call
              call: "github-off.remove-org-member"
              with:
                org: "amzn"
                username: "{{get-employee.github_username}}"
            - name: deactivate-okta
              type: call
              call: "okta.deactivate-user"
              with:
                user_id: "{{get-employee.okta_user_id}}"
            - name: create-offboarding-task
              type: call
              call: "servicenow-off.create-incident"
              with:
                short_description: "Offboarding: {{get-employee.full_name}}"
                assignment_group: "IT_Offboarding"
                category: "hr_offboarding"
  consumes:
    - namespace: workday-off
      type: http
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: worker
          path: "/workers/{worker_id}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - namespace: github-off
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-member
          path: "/orgs/{org}/members/{username}"
          inputParameters:
            - name: org
              in: path
            - name: username
              in: path
          operations:
            - name: remove-org-member
              method: DELETE
    - namespace: okta
      type: http
      baseUri: "https://amazon.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: user
          path: "/users/{user_id}/lifecycle/deactivate"
          inputParameters:
            - name: user_id
              in: path
          operations:
            - name: deactivate-user
              method: POST
    - namespace: servicenow-off
      type: http
      baseUri: "https://amazon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incident
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST

Validates EventBridge rules are actively triggering by checking CloudWatch invocation metrics and posts a health report to Slack.

naftiko: "0.5"
info:
  label: "EventBridge Rule Health Checker"
  description: "Validates EventBridge rules are actively triggering by checking CloudWatch invocation metrics and posts a health report to Slack."
  tags:
    - cloud
    - event-driven
    - monitoring
    - aws
    - eventbridge
    - cloudwatch
    - slack
capability:
  exposes:
    - type: mcp
      namespace: eb-health
      port: 8080
      tools:
        - name: check-rule-health
          description: "Check EventBridge rule invocation metrics and report health status to Slack."
          inputParameters:
            - name: rule_name
              in: body
              type: string
              description: "The EventBridge rule name to check."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for health reports."
          steps:
            - name: get-invocation-count
              type: call
              call: "cw-eb.get-metric-data"
              with:
                namespace: "AWS/Events"
                metric_name: "Invocations"
                rule_name: "{{rule_name}}"
            - name: get-failed-count
              type: call
              call: "cw-eb.get-failed-metric"
              with:
                namespace: "AWS/Events"
                metric_name: "FailedInvocations"
                rule_name: "{{rule_name}}"
            - name: post-report
              type: call
              call: "slack-eb.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "EventBridge Rule Health: {{rule_name}} - Invocations: {{get-invocation-count.sum}}, Failed: {{get-failed-count.sum}}."
  consumes:
    - namespace: cw-eb
      type: http
      baseUri: "https://monitoring.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: metric
          path: "/"
          operations:
            - name: get-metric-data
              method: POST
            - name: get-failed-metric
              method: POST
    - namespace: slack-eb
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Reconciles Fulfillment by Amazon inventory levels against seller records, identifies discrepancies, and creates a case in Seller Central support.

naftiko: "0.5"
info:
  label: "FBA Inventory Reconciliation"
  description: "Reconciles Fulfillment by Amazon inventory levels against seller records, identifies discrepancies, and creates a case in Seller Central support."
  tags:
    - ecommerce
    - marketplace
    - fulfillment
    - fba
    - inventory
capability:
  exposes:
    - type: mcp
      namespace: fba-reconcile
      port: 8080
      tools:
        - name: reconcile-inventory
          description: "Compare FBA inventory levels with seller records and create a support case for discrepancies."
          inputParameters:
            - name: seller_id
              in: body
              type: string
              description: "The Amazon seller ID."
            - name: sku
              in: body
              type: string
              description: "The product SKU to reconcile."
            - name: expected_quantity
              in: body
              type: number
              description: "The expected inventory quantity per seller records."
          steps:
            - name: get-fba-inventory
              type: call
              call: "sp-fba.get-inventory-summary"
              with:
                seller_id: "{{seller_id}}"
                sku: "{{sku}}"
            - name: create-case
              type: call
              call: "sp-fba.create-support-case"
              with:
                subject: "FBA Inventory Discrepancy: SKU {{sku}}"
                description: "Expected: {{expected_quantity}}, FBA reports: {{get-fba-inventory.fulfillable_quantity}}. Difference: needs investigation."
  consumes:
    - namespace: sp-fba
      type: http
      baseUri: "https://sellingpartnerapi-na.amazon.com"
      authentication:
        type: bearer
        token: "$secrets.sp_api_token"
      resources:
        - name: inventory
          path: "/fba/inventory/v1/summaries"
          inputParameters:
            - name: seller_id
              in: query
            - name: sku
              in: query
          operations:
            - name: get-inventory-summary
              method: GET
        - name: support
          path: "/messaging/v1/cases"
          operations:
            - name: create-support-case
              method: POST

Schedules Amazon Fresh grocery deliveries by checking available delivery windows, reserving a slot, and sending a confirmation to the customer via SNS.

naftiko: "0.5"
info:
  label: "Fresh Grocery Delivery Scheduler"
  description: "Schedules Amazon Fresh grocery deliveries by checking available delivery windows, reserving a slot, and sending a confirmation to the customer via SNS."
  tags:
    - grocery
    - amazon-fresh
    - delivery
    - logistics
    - sns
capability:
  exposes:
    - type: mcp
      namespace: fresh-delivery
      port: 8080
      tools:
        - name: schedule-delivery
          description: "Check available delivery windows for Amazon Fresh, reserve a slot, and confirm with the customer."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The Amazon Fresh order ID."
            - name: zip_code
              in: body
              type: string
              description: "The delivery ZIP code."
            - name: customer_phone
              in: body
              type: string
              description: "The customer phone number for SMS confirmation."
          steps:
            - name: get-windows
              type: call
              call: "fresh-api.get-delivery-windows"
              with:
                zip_code: "{{zip_code}}"
            - name: reserve-slot
              type: call
              call: "fresh-api.reserve-delivery-slot"
              with:
                order_id: "{{order_id}}"
                slot_id: "{{get-windows.first_available_slot_id}}"
            - name: confirm-customer
              type: call
              call: "sns-fresh.publish"
              with:
                phone_number: "{{customer_phone}}"
                message: "Your Amazon Fresh delivery for order {{order_id}} is scheduled for {{reserve-slot.delivery_time}}. Track at amazon.com/orders."
  consumes:
    - namespace: fresh-api
      type: http
      baseUri: "https://api.amazon.com/fresh/v1"
      authentication:
        type: bearer
        token: "$secrets.amazon_fresh_token"
      resources:
        - name: delivery-windows
          path: "/delivery-windows"
          inputParameters:
            - name: zip_code
              in: query
          operations:
            - name: get-delivery-windows
              method: GET
        - name: delivery-slot
          path: "/orders/{order_id}/delivery-slot"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: reserve-delivery-slot
              method: POST
    - namespace: sns-fresh
      type: http
      baseUri: "https://sns.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sns_token"
        placement: header
      resources:
        - name: sms
          path: "/"
          operations:
            - name: publish
              method: POST

When a critical Dependabot vulnerability alert is raised in a GitHub repository, creates a Jira security ticket, notifies the owning team in Slack, and opens a GitHub issue for tracking.

naftiko: "0.5"
info:
  label: "GitHub Dependabot Alert Remediation"
  description: "When a critical Dependabot vulnerability alert is raised in a GitHub repository, creates a Jira security ticket, notifies the owning team in Slack, and opens a GitHub issue for tracking."
  tags:
    - security
    - devops
    - github
    - jira
    - slack
    - dependabot
capability:
  exposes:
    - type: mcp
      namespace: vuln-ops
      port: 8080
      tools:
        - name: handle-dependabot-alert
          description: "Given a GitHub repo and Dependabot alert number, fetch alert details, create a Jira security remediation ticket, open a GitHub tracking issue, and notify the team Slack channel."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format where the Dependabot alert was raised."
            - name: alert_number
              in: body
              type: integer
              description: "The Dependabot alert number to process."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the security alert notification."
          steps:
            - name: get-alert
              type: call
              call: "github-dep.get-dependabot-alert"
              with:
                repo: "{{repo}}"
                alert_number: "{{alert_number}}"
            - name: create-sec-ticket
              type: call
              call: "jira-dep.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Dependabot: {{get-alert.dependency_name}} {{get-alert.severity}} in {{repo}}"
                description: "CVE: {{get-alert.cve_id}}\nSeverity: {{get-alert.severity}}\nFixed in: {{get-alert.fixed_in}}"
            - name: notify-team
              type: call
              call: "slack-dep.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Dependabot Alert: {{get-alert.severity}} vulnerability in {{get-alert.dependency_name}} ({{repo}}). CVE: {{get-alert.cve_id}}. Jira: {{create-sec-ticket.key}}"
  consumes:
    - namespace: github-dep
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: dependabot-alert
          path: "/repos/{repo}/dependabot/alerts/{alert_number}"
          inputParameters:
            - name: repo
              in: path
            - name: alert_number
              in: path
          operations:
            - name: get-dependabot-alert
              method: GET
    - namespace: jira-dep
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: slack-dep
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a GitHub pull request is opened against a main branch, triggers a Snyk security scan and posts the results as a PR comment. Blocks merge if critical vulnerabilities are detected.

naftiko: "0.5"
info:
  label: "GitHub PR Security Scan Gate"
  description: "When a GitHub pull request is opened against a main branch, triggers a Snyk security scan and posts the results as a PR comment. Blocks merge if critical vulnerabilities are detected."
  tags:
    - devops
    - security
    - github
    - snyk
    - code-quality
capability:
  exposes:
    - type: mcp
      namespace: devops-security
      port: 8080
      tools:
        - name: run-pr-security-scan
          description: "Given a GitHub repo and PR number, trigger a Snyk security scan on the PR branch and post scan results as a GitHub PR review comment. Use when enforcing security gates on pull requests."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format, e.g. amzn/service-catalog."
            - name: pr_number
              in: body
              type: integer
              description: "The pull request number to scan and comment on."
            - name: branch
              in: body
              type: string
              description: "The branch name associated with the pull request."
          steps:
            - name: trigger-scan
              type: call
              call: "snyk.test-project"
              with:
                org: "amazon"
                target_reference: "{{branch}}"
            - name: post-review
              type: call
              call: "github-sec.create-pr-review"
              with:
                repo: "{{repo}}"
                pull_number: "{{pr_number}}"
                body: "Snyk scan complete. Issues found: {{trigger-scan.issue_count}}. Critical: {{trigger-scan.critical_count}}. See full report: {{trigger-scan.report_url}}"
                event: "COMMENT"
  consumes:
    - namespace: snyk
      type: http
      baseUri: "https://api.snyk.io/rest"
      authentication:
        type: bearer
        token: "$secrets.snyk_token"
      resources:
        - name: project-test
          path: "/orgs/{org}/test"
          inputParameters:
            - name: org
              in: path
          operations:
            - name: test-project
              method: POST
    - namespace: github-sec
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: pr-review
          path: "/repos/{repo}/pulls/{pull_number}/reviews"
          inputParameters:
            - name: repo
              in: path
            - name: pull_number
              in: path
          operations:
            - name: create-pr-review
              method: POST

Audits a GitHub repository for branch protection rules, required status checks, and code owner file presence, then posts a compliance report to a Slack channel.

naftiko: "0.5"
info:
  label: "GitHub Repository Compliance Audit"
  description: "Audits a GitHub repository for branch protection rules, required status checks, and code owner file presence, then posts a compliance report to a Slack channel."
  tags:
    - devops
    - compliance
    - github
    - slack
    - security
capability:
  exposes:
    - type: mcp
      namespace: devops-compliance
      port: 8080
      tools:
        - name: audit-repo-compliance
          description: "Given a GitHub repository name, check branch protection rules on the default branch, verify required status checks are configured, and post a compliance status report to Slack."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format to audit, e.g. amzn/service-catalog."
            - name: branch
              in: body
              type: string
              description: "The branch to check protection rules on, typically main or master."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID where the compliance report will be posted."
          steps:
            - name: get-branch-protection
              type: call
              call: "github-compliance.get-branch-protection"
              with:
                repo: "{{repo}}"
                branch: "{{branch}}"
            - name: post-compliance-report
              type: call
              call: "slack-compliance.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Compliance Audit: {{repo}} / {{branch}} | Required reviews: {{get-branch-protection.required_approving_review_count}} | Status checks required: {{get-branch-protection.required_status_checks_count}} | Admin enforced: {{get-branch-protection.enforce_admins}}"
  consumes:
    - namespace: github-compliance
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: branch-protection
          path: "/repos/{repo}/branches/{branch}/protection"
          inputParameters:
            - name: repo
              in: path
            - name: branch
              in: path
          operations:
            - name: get-branch-protection
              method: GET
    - namespace: slack-compliance
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When GitHub Advanced Security detects a secret in a repository, creates a Jira security ticket, notifies the security Slack channel, and revokes the exposed credential via Okta.

naftiko: "0.5"
info:
  label: "GitHub Secret Scanning Alert Handler"
  description: "When GitHub Advanced Security detects a secret in a repository, creates a Jira security ticket, notifies the security Slack channel, and revokes the exposed credential via Okta."
  tags:
    - security
    - devops
    - github
    - jira
    - slack
    - okta
    - secret-scanning
capability:
  exposes:
    - type: mcp
      namespace: security-ops
      port: 8080
      tools:
        - name: handle-secret-alert
          description: "Given a GitHub secret scanning alert ID and repository, fetch alert details, create a Jira security ticket, revoke the associated credential in Okta, and notify the security Slack channel."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format where the secret was detected."
            - name: alert_number
              in: body
              type: integer
              description: "The GitHub secret scanning alert number."
            - name: okta_token_id
              in: body
              type: string
              description: "The Okta API token ID to revoke if it matches the exposed credential."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the security team notification."
          steps:
            - name: get-alert
              type: call
              call: "github-ss.get-secret-alert"
              with:
                repo: "{{repo}}"
                alert_number: "{{alert_number}}"
            - name: create-security-ticket
              type: call
              call: "jira-ss.create-issue"
              with:
                project_key: "SEC"
                issuetype: "Bug"
                summary: "Secret exposed in {{repo}}: {{get-alert.secret_type}}"
                description: "Alert: {{alert_number}}\nSecret type: {{get-alert.secret_type}}\nState: {{get-alert.state}}"
            - name: revoke-token
              type: call
              call: "okta-ss.revoke-token"
              with:
                token_id: "{{okta_token_id}}"
            - name: notify-security
              type: call
              call: "slack-ss.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "SECRET ALERT: {{get-alert.secret_type}} exposed in {{repo}}. Token revoked in Okta. Jira: {{create-security-ticket.key}}"
  consumes:
    - namespace: github-ss
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: secret-alert
          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
    - namespace: jira-ss
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: okta-ss
      type: http
      baseUri: "https://amazon.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: token
          path: "/users/me/tokens/{token_id}"
          inputParameters:
            - name: token_id
              in: path
          operations:
            - name: revoke-token
              method: DELETE
    - namespace: slack-ss
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Detects failed AWS Glue ETL jobs, collects error logs from CloudWatch, and creates a Jira ticket for the data engineering team.

naftiko: "0.5"
info:
  label: "Glue Job Failure Handler"
  description: "Detects failed AWS Glue ETL jobs, collects error logs from CloudWatch, and creates a Jira ticket for the data engineering team."
  tags:
    - cloud
    - etl
    - data-engineering
    - aws
    - glue
    - cloudwatch
    - jira
capability:
  exposes:
    - type: mcp
      namespace: glue-failure
      port: 8080
      tools:
        - name: handle-glue-failure
          description: "Process a Glue job failure by fetching error logs and creating a Jira ticket for investigation."
          inputParameters:
            - name: job_name
              in: body
              type: string
              description: "The AWS Glue job name that failed."
            - name: job_run_id
              in: body
              type: string
              description: "The Glue job run ID."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for data engineering tickets."
          steps:
            - name: get-job-run
              type: call
              call: "glue-api.get-job-run"
              with:
                job_name: "{{job_name}}"
                job_run_id: "{{job_run_id}}"
            - name: get-error-logs
              type: call
              call: "cw-glue.get-log-events"
              with:
                log_group: "/aws-glue/jobs/error"
                log_stream: "{{job_run_id}}"
            - name: create-ticket
              type: call
              call: "jira-glue.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Bug"
                summary: "Glue Job Failure: {{job_name}} (Run: {{job_run_id}})"
                description: "Error: {{get-job-run.error_message}}. Logs: {{get-error-logs.events}}"
  consumes:
    - namespace: glue-api
      type: http
      baseUri: "https://glue.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_glue_token"
        placement: header
      resources:
        - name: job-run
          path: "/"
          operations:
            - name: get-job-run
              method: POST
    - namespace: cw-glue
      type: http
      baseUri: "https://logs.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: log-events
          path: "/"
          operations:
            - name: get-log-events
              method: POST
    - namespace: jira-glue
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Retrieves GuardDuty security findings, creates an incident in ServiceNow, and notifies the security operations team via Slack.

naftiko: "0.5"
info:
  label: "GuardDuty Finding Incident Creator"
  description: "Retrieves GuardDuty security findings, creates an incident in ServiceNow, and notifies the security operations team via Slack."
  tags:
    - cloud
    - security
    - incident-response
    - aws
    - guardduty
    - servicenow
    - slack
capability:
  exposes:
    - type: mcp
      namespace: guardduty-incident
      port: 8080
      tools:
        - name: process-finding
          description: "Fetch a GuardDuty finding, create a ServiceNow incident for it, and alert the security team on Slack."
          inputParameters:
            - name: detector_id
              in: body
              type: string
              description: "The GuardDuty detector ID."
            - name: finding_id
              in: body
              type: string
              description: "The GuardDuty finding ID to process."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for security operations alerts."
          steps:
            - name: get-finding
              type: call
              call: "guardduty-api.get-findings"
              with:
                detector_id: "{{detector_id}}"
                finding_id: "{{finding_id}}"
            - name: create-incident
              type: call
              call: "servicenow-gd.create-incident"
              with:
                short_description: "GuardDuty: {{get-finding.type}} - Severity {{get-finding.severity}}"
                description: "Finding: {{get-finding.description}}. Resource: {{get-finding.resource}}."
                urgency: "2"
            - name: alert-security
              type: call
              call: "slack-gd.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "GuardDuty Alert: {{get-finding.type}} (Severity: {{get-finding.severity}}). ServiceNow Incident: {{create-incident.number}}."
  consumes:
    - namespace: guardduty-api
      type: http
      baseUri: "https://guardduty.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_guardduty_token"
        placement: header
      resources:
        - name: findings
          path: "/detector/{detector_id}/findings/get"
          inputParameters:
            - name: detector_id
              in: path
          operations:
            - name: get-findings
              method: POST
    - namespace: servicenow-gd
      type: http
      baseUri: "https://amazon.service-now.com/api/now/table"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incident
          path: "/incident"
          operations:
            - name: create-incident
              method: POST
    - namespace: slack-gd
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Audits IAM user access keys for age, deactivates keys older than 90 days, and sends a compliance report via SES.

naftiko: "0.5"
info:
  label: "IAM Access Key Rotation Enforcer"
  description: "Audits IAM user access keys for age, deactivates keys older than 90 days, and sends a compliance report via SES."
  tags:
    - cloud
    - security
    - compliance
    - aws
    - iam
    - ses
capability:
  exposes:
    - type: mcp
      namespace: iam-key-rotation
      port: 8080
      tools:
        - name: enforce-key-rotation
          description: "Audit IAM access keys, deactivate stale keys older than the threshold, and email a compliance report."
          inputParameters:
            - name: username
              in: body
              type: string
              description: "The IAM username to audit access keys for."
            - name: max_age_days
              in: body
              type: number
              description: "Maximum allowed age in days before a key is deactivated."
            - name: report_email
              in: body
              type: string
              description: "Email address to send the compliance report to."
          steps:
            - name: list-keys
              type: call
              call: "iam-keys.list-access-keys"
              with:
                username: "{{username}}"
            - name: deactivate-old-key
              type: call
              call: "iam-keys.update-access-key"
              with:
                username: "{{username}}"
                access_key_id: "{{list-keys.oldest_key_id}}"
                status: "Inactive"
            - name: send-report
              type: call
              call: "ses-iam.send-email"
              with:
                to: "{{report_email}}"
                subject: "IAM Key Rotation Report: {{username}}"
                body: "User {{username}}: Key {{list-keys.oldest_key_id}} (age: {{list-keys.oldest_key_age}} days) has been deactivated."
  consumes:
    - namespace: iam-keys
      type: http
      baseUri: "https://iam.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_iam_token"
        placement: header
      resources:
        - name: access-keys
          path: "/"
          inputParameters:
            - name: username
              in: query
          operations:
            - name: list-access-keys
              method: GET
        - name: update-key
          path: "/"
          inputParameters:
            - name: username
              in: query
            - name: access_key_id
              in: query
            - name: status
              in: query
          operations:
            - name: update-access-key
              method: POST
    - namespace: ses-iam
      type: http
      baseUri: "https://email.us-east-1.amazonaws.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ses_token"
        placement: header
      resources:
        - name: email
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Fetches Amazon Inspector vulnerability findings for EC2 instances, generates a risk summary, and creates a Jira security ticket.

naftiko: "0.5"
info:
  label: "Inspector Vulnerability Report"
  description: "Fetches Amazon Inspector vulnerability findings for EC2 instances, generates a risk summary, and creates a Jira security ticket."
  tags:
    - cloud
    - security
    - vulnerability-management
    - aws
    - inspector
    - jira
capability:
  exposes:
    - type: mcp
      namespace: inspector-report
      port: 8080
      tools:
        - name: generate-vuln-report
          description: "Fetch Inspector findings, summarize vulnerabilities by severity, and create a Jira ticket for remediation."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The AWS account ID to scan findings for."
            - name: jira_project_key
              in: body
              type: string
              description: "Jira project key for security tickets."
          steps:
            - name: list-findings
              type: call
              call: "inspector-api.list-findings"
              with:
                account_id: "{{account_id}}"
            - name: create-ticket
              type: call
              call: "jira-inspector.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Bug"
                summary: "Inspector Findings: {{list-findings.critical_count}} critical, {{list-findings.high_count}} high vulnerabilities"
                description: "Account {{account_id}} has {{list-findings.total_count}} findings. Critical: {{list-findings.critical_count}}, High: {{list-findings.high_count}}. Remediation required."
  consumes:
    - namespace: inspector-api
      type: http
      baseUri: "https://inspector2.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_inspector_token"
        placement: header
      resources:
        - name: findings
          path: "/findings/list"
          operations:
            - name: list-findings
              method: POST
    - namespace: jira-inspector
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Fetches a newly created Jira issue, sends the description to the Anthropic Claude API for priority triage and summarization, and updates the Jira issue with the AI-generated priority label and summary.

naftiko: "0.5"
info:
  label: "Jira Issue Triage with AI Summarization"
  description: "Fetches a newly created Jira issue, sends the description to the Anthropic Claude API for priority triage and summarization, and updates the Jira issue with the AI-generated priority label and summary."
  tags:
    - itsm
    - ai
    - triage
    - jira
    - anthropic
capability:
  exposes:
    - type: mcp
      namespace: itsm-ai
      port: 8080
      tools:
        - name: triage-issue
          description: "Given a Jira issue key, fetch its description, send it to the Anthropic Claude API for triage analysis, and update the Jira issue with the recommended priority and AI-generated summary."
          inputParameters:
            - name: issue_key
              in: body
              type: string
              description: "The Jira issue key to triage, e.g. ENG-4201."
          steps:
            - name: get-issue
              type: call
              call: "jira-triage.get-issue"
              with:
                issue_key: "{{issue_key}}"
            - name: ai-triage
              type: call
              call: "anthropic.create-message"
              with:
                model: "claude-opus-4-5"
                max_tokens: 512
                system: "You are a software engineering triage assistant. Respond with a JSON object containing 'priority' (P1/P2/P3/P4) and 'summary' (one sentence)."
                user_message: "Triage this issue: {{get-issue.summary}}\n\n{{get-issue.description}}"
            - name: update-issue
              type: call
              call: "jira-triage.update-issue"
              with:
                issue_key: "{{issue_key}}"
                priority: "{{ai-triage.priority}}"
                description: "AI Triage Summary: {{ai-triage.summary}}\n\nOriginal: {{get-issue.description}}"
  consumes:
    - namespace: jira-triage
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue/{issue_key}"
          inputParameters:
            - name: issue_key
              in: path
          operations:
            - name: get-issue
              method: GET
            - name: update-issue
              method: PUT
    - namespace: anthropic
      type: http
      baseUri: "https://api.anthropic.com/v1"
      authentication:
        type: apikey
        key: "x-api-key"
        value: "$secrets.anthropic_api_key"
        placement: header
      resources:
        - name: message
          path: "/messages"
          operations:
            - name: create-message
              method: POST

Fetches the completed sprint data from Jira, calculates story point velocity, and publishes the sprint review digest to the engineering Slack channel.

naftiko: "0.5"
info:
  label: "Jira Sprint Velocity Report"
  description: "Fetches the completed sprint data from Jira, calculates story point velocity, and publishes the sprint review digest to the engineering Slack channel."
  tags:
    - devops
    - reporting
    - jira
    - slack
    - agile
capability:
  exposes:
    - type: mcp
      namespace: agile-reporting
      port: 8080
      tools:
        - name: publish-sprint-velocity
          description: "Given a Jira board ID and sprint ID, fetch completed issue story points, calculate velocity, and post the sprint velocity digest to the engineering Slack channel."
          inputParameters:
            - name: board_id
              in: body
              type: integer
              description: "The Jira Agile board ID to query sprint data from."
            - name: sprint_id
              in: body
              type: integer
              description: "The sprint ID to report velocity for."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the sprint velocity digest."
          steps:
            - name: get-sprint-issues
              type: call
              call: "jira-agile.get-sprint-issues"
              with:
                board_id: "{{board_id}}"
                sprint_id: "{{sprint_id}}"
            - name: post-velocity
              type: call
              call: "slack-agile.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Sprint {{sprint_id}} Velocity: {{get-sprint-issues.completed_points}} story points completed out of {{get-sprint-issues.committed_points}} committed ({{get-sprint-issues.completion_pct}}%)."
  consumes:
    - namespace: jira-agile
      type: http
      baseUri: "https://amazon.atlassian.net/rest/agile/1.0"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: sprint-issues
          path: "/board/{board_id}/sprint/{sprint_id}/issue"
          inputParameters:
            - name: board_id
              in: path
            - name: sprint_id
              in: path
          operations:
            - name: get-sprint-issues
              method: GET
    - namespace: slack-agile
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors a Kinesis data stream for iterator age and throughput, logs health metrics to CloudWatch, and alerts via PagerDuty if thresholds are breached.

naftiko: "0.5"
info:
  label: "Kinesis Data Pipeline Health Check"
  description: "Monitors a Kinesis data stream for iterator age and throughput, logs health metrics to CloudWatch, and alerts via PagerDuty if thresholds are breached."
  tags:
    - cloud
    - streaming
    - monitoring
    - aws
    - kinesis
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: kinesis-health
      port: 8080
      tools:
        - name: check-pipeline-health
          description: "Monitor Kinesis stream health by checking iterator age and throughput. Log to CloudWatch and alert PagerDuty if unhealthy."
          inputParameters:
            - name: stream_name
              in: body
              type: string
              description: "The Kinesis stream name to monitor."
            - name: max_iterator_age_ms
              in: body
              type: number
              description: "Maximum acceptable iterator age in milliseconds."
          steps:
            - name: get-stream-metrics
              type: call
              call: "cw-kinesis.get-metric-data"
              with:
                stream_name: "{{stream_name}}"
                metric_name: "GetRecords.IteratorAgeMilliseconds"
            - name: log-health
              type: call
              call: "cw-kinesis.put-metric-data"
              with:
                namespace: "Custom/KinesisHealth"
                metric_name: "PipelineHealthScore"
                value: "{{get-stream-metrics.average}}"
            - name: trigger-alert
              type: call
              call: "pagerduty-kinesis.create-incident"
              with:
                service_id: "KINESIS_SVC"
                title: "Kinesis stream {{stream_name}} iterator age {{get-stream-metrics.average}}ms exceeds {{max_iterator_age_ms}}ms"
  consumes:
    - namespace: cw-kinesis
      type: http
      baseUri: "https://monitoring.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: metric-data
          path: "/"
          inputParameters:
            - name: stream_name
              in: query
            - name: metric_name
              in: query
          operations:
            - name: get-metric-data
              method: POST
        - name: put-metric
          path: "/"
          operations:
            - name: put-metric-data
              method: POST
    - namespace: pagerduty-kinesis
      type: http
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incident
          path: "/incidents"
          operations:
            - name: create-incident
              method: POST

Describes a Kinesis data stream and returns its shard count, retention period, and status.

naftiko: "0.5"
info:
  label: "Kinesis Stream Description"
  description: "Describes a Kinesis data stream and returns its shard count, retention period, and status."
  tags:
    - cloud
    - streaming
    - aws
    - kinesis
capability:
  exposes:
    - type: mcp
      namespace: kinesis-desc
      port: 8080
      tools:
        - name: describe-stream
          description: "Describe a Kinesis data stream to get shard count, retention period, and current status."
          inputParameters:
            - name: stream_name
              in: body
              type: string
              description: "The name of the Kinesis stream to describe."
          call: "kinesis-api.describe-stream"
          with:
            stream_name: "{{stream_name}}"
          outputParameters:
            - name: shard_count
              type: number
              mapping: "$.StreamDescription.Shards.length"
            - name: status
              type: string
              mapping: "$.StreamDescription.StreamStatus"
  consumes:
    - namespace: kinesis-api
      type: http
      baseUri: "https://kinesis.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_kinesis_token"
        placement: header
      resources:
        - name: stream
          path: "/"
          inputParameters:
            - name: stream_name
              in: body
          operations:
            - name: describe-stream
              method: POST

Deploys a new Lambda function version, runs a smoke test, and rolls back to the previous version if the test fails, notifying the team via Slack.

naftiko: "0.5"
info:
  label: "Lambda Deployment with Rollback"
  description: "Deploys a new Lambda function version, runs a smoke test, and rolls back to the previous version if the test fails, notifying the team via Slack."
  tags:
    - cloud
    - serverless
    - deployment
    - aws
    - lambda
    - slack
capability:
  exposes:
    - type: mcp
      namespace: lambda-deploy
      port: 8080
      tools:
        - name: deploy-with-rollback
          description: "Deploy a new Lambda version from S3, invoke a smoke test, and roll back if it fails. Posts deployment status to Slack."
          inputParameters:
            - name: function_name
              in: body
              type: string
              description: "The Lambda function name to deploy."
            - name: s3_bucket
              in: body
              type: string
              description: "The S3 bucket containing the deployment package."
            - name: s3_key
              in: body
              type: string
              description: "The S3 key for the deployment package zip."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel for deployment notifications."
          steps:
            - name: update-function
              type: call
              call: "lambda-dep.update-function-code"
              with:
                function_name: "{{function_name}}"
                s3_bucket: "{{s3_bucket}}"
                s3_key: "{{s3_key}}"
            - name: invoke-smoke-test
              type: call
              call: "lambda-dep.invoke-function"
              with:
                function_name: "{{function_name}}"
                payload: "{\"test\": true}"
            - name: notify-team
              type: call
              call: "slack-dep.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Lambda deployment for {{function_name}}: version {{update-function.version}} deployed. Smoke test status: {{invoke-smoke-test.status_code}}."
  consumes:
    - namespace: lambda-dep
      type: http
      baseUri: "https://lambda.us-east-1.amazonaws.com/2015-03-31"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_lambda_token"
        placement: header
      resources:
        - name: function-code
          path: "/functions/{function_name}/code"
          inputParameters:
            - name: function_name
              in: path
          operations:
            - name: update-function-code
              method: PUT
        - name: invocation
          path: "/functions/{function_name}/invocations"
          inputParameters:
            - name: function_name
              in: path
            - name: payload
              in: body
          operations:
            - name: invoke-function
              method: POST
    - namespace: slack-dep
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Lists all Lambda functions in a given AWS region and returns their names, runtimes, and memory configurations.

naftiko: "0.5"
info:
  label: "Lambda Function List"
  description: "Lists all Lambda functions in a given AWS region and returns their names, runtimes, and memory configurations."
  tags:
    - cloud
    - serverless
    - aws
    - lambda
capability:
  exposes:
    - type: mcp
      namespace: lambda-list
      port: 8080
      tools:
        - name: list-functions
          description: "List all Lambda functions in the specified AWS region. Returns function names, runtimes, and memory sizes."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "The AWS region to list Lambda functions for, e.g. us-west-2."
          call: "lambda-api.list-functions"
          with:
            region: "{{region}}"
          outputParameters:
            - name: functions
              type: array
              mapping: "$.Functions"
  consumes:
    - namespace: lambda-api
      type: http
      baseUri: "https://lambda.us-east-1.amazonaws.com/2015-03-31"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_lambda_token"
        placement: header
      resources:
        - name: functions
          path: "/functions"
          inputParameters:
            - name: region
              in: query
          operations:
            - name: list-functions
              method: GET

Optimizes last-mile delivery routes for Amazon logistics drivers by fetching pending deliveries, calculating optimal routes via Amazon Location Service, and updating driver assignments.

naftiko: "0.5"
info:
  label: "Last Mile Delivery Route Optimizer"
  description: "Optimizes last-mile delivery routes for Amazon logistics drivers by fetching pending deliveries, calculating optimal routes via Amazon Location Service, and updating driver assignments."
  tags:
    - logistics
    - delivery
    - routing
    - aws
    - location-service
capability:
  exposes:
    - type: mcp
      namespace: route-optimizer
      port: 8080
      tools:
        - name: optimize-route
          description: "Fetch pending deliveries for a driver, calculate the optimal route, and update driver assignments."
          inputParameters:
            - name: driver_id
              in: body
              type: string
              description: "The delivery driver ID."
            - name: warehouse_id
              in: body
              type: string
              description: "The origin warehouse ID."
          steps:
            - name: get-pending-deliveries
              type: call
              call: "logistics-route.get-driver-deliveries"
              with:
                driver_id: "{{driver_id}}"
                warehouse_id: "{{warehouse_id}}"
            - name: calculate-route
              type: call
              call: "location-api.calculate-route-matrix"
              with:
                departure_position: "{{get-pending-deliveries.warehouse_coords}}"
                destination_positions: "{{get-pending-deliveries.delivery_coords}}"
            - name: update-assignments
              type: call
              call: "logistics-route.update-route-plan"
              with:
                driver_id: "{{driver_id}}"
                optimized_order: "{{calculate-route.optimized_sequence}}"
                estimated_duration: "{{calculate-route.total_duration}}"
  consumes:
    - namespace: logistics-route
      type: http
      baseUri: "https://api.amazon.com/logistics/v1"
      authentication:
        type: bearer
        token: "$secrets.amazon_logistics_token"
      resources:
        - name: driver-deliveries
          path: "/drivers/{driver_id}/deliveries"
          inputParameters:
            - name: driver_id
              in: path
            - name: warehouse_id
              in: query
          operations:
            - name: get-driver-deliveries
              method: GET
        - name: route-plan
          path: "/drivers/{driver_id}/route-plan"
          inputParameters:
            - name: driver_id
              in: path
          operations:
            - name: update-route-plan
              method: PUT
    - namespace: location-api
      type: http
      baseUri: "https://routes.geo.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_location_token"
        placement: header
      resources:
        - name: route-matrix
          path: "/routes/v0/calculators/AmazonLogistics/calculate/route-matrix"
          operations:
            - name: calculate-route-matrix
              method: POST

Fetches an open Workday job requisition and publishes it as a LinkedIn job posting, then creates a Jira recruiting task to track the open role.

naftiko: "0.5"
info:
  label: "LinkedIn Job Posting Publisher"
  description: "Fetches an open Workday job requisition and publishes it as a LinkedIn job posting, then creates a Jira recruiting task to track the open role."
  tags:
    - hr
    - recruiting
    - workday
    - linkedin
    - jira
capability:
  exposes:
    - type: mcp
      namespace: recruiting-ops
      port: 8080
      tools:
        - name: publish-job-to-linkedin
          description: "Given a Workday job requisition ID, fetch role details from Workday, publish the posting to LinkedIn, and create a Jira recruiting task to track candidate pipeline."
          inputParameters:
            - name: requisition_id
              in: body
              type: string
              description: "The Workday job requisition ID to publish, e.g. JR-00542."
            - name: linkedin_organization_id
              in: body
              type: string
              description: "The LinkedIn organization URN ID to post the job under."
          steps:
            - name: get-requisition
              type: call
              call: "workday-rec.get-requisition"
              with:
                requisition_id: "{{requisition_id}}"
            - name: create-linkedin-post
              type: call
              call: "linkedin.create-job-posting"
              with:
                organization_id: "{{linkedin_organization_id}}"
                title: "{{get-requisition.job_title}}"
                description: "{{get-requisition.job_description}}"
                location: "{{get-requisition.location}}"
            - name: create-recruiting-task
              type: call
              call: "jira-rec.create-issue"
              with:
                project_key: "RECRUIT"
                issuetype: "Task"
                summary: "Open Role: {{get-requisition.job_title}} ({{requisition_id}})"
                description: "LinkedIn posting ID: {{create-linkedin-post.posting_id}}"
  consumes:
    - namespace: workday-rec
      type: http
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: requisition
          path: "/jobRequisitions/{requisition_id}"
          inputParameters:
            - name: requisition_id
              in: path
          operations:
            - name: get-requisition
              method: GET
    - namespace: linkedin
      type: http
      baseUri: "https://api.linkedin.com/v2"
      authentication:
        type: bearer
        token: "$secrets.linkedin_token"
      resources:
        - name: job-posting
          path: "/jobs"
          operations:
            - name: create-job-posting
              method: POST
    - namespace: jira-rec
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Processes a customer return request from the Selling Partner API, initiates a refund, and notifies the seller via email through SES.

naftiko: "0.5"
info:
  label: "Marketplace Return Processor"
  description: "Processes a customer return request from the Selling Partner API, initiates a refund, and notifies the seller via email through SES."
  tags:
    - ecommerce
    - marketplace
    - returns
    - seller-central
    - ses
capability:
  exposes:
    - type: mcp
      namespace: return-process
      port: 8080
      tools:
        - name: process-return
          description: "Process a marketplace return request, initiate the refund, and notify the seller via email."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The order ID for the return request."
            - name: return_reason
              in: body
              type: string
              description: "The customer-provided return reason."
            - name: seller_email
              in: body
              type: string
              description: "The seller email address for return notifications."
          steps:
            - name: get-order-details
              type: call
              call: "sp-returns.get-order"
              with:
                order_id: "{{order_id}}"
            - name: create-refund
              type: call
              call: "sp-returns.create-refund"
              with:
                order_id: "{{order_id}}"
                amount: "{{get-order-details.order_total}}"
            - name: notify-seller
              type: call
              call: "ses-returns.send-email"
              with:
                to: "{{seller_email}}"
                subject: "Return Processed: Order {{order_id}}"
                body: "A return has been processed for order {{order_id}}. Reason: {{return_reason}}. Refund amount: ${{get-order-details.order_total}}. Refund ID: {{create-refund.refund_id}}."
  consumes:
    - namespace: sp-returns
      type: http
      baseUri: "https://sellingpartnerapi-na.amazon.com"
      authentication:
        type: bearer
        token: "$secrets.sp_api_token"
      resources:
        - name: order
          path: "/orders/v0/orders/{order_id}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET
        - name: refund
          path: "/orders/v0/orders/{order_id}/refund"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: create-refund
              method: POST
    - namespace: ses-returns
      type: http
      baseUri: "https://email.us-east-1.amazonaws.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ses_token"
        placement: header
      resources:
        - name: email
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Generates personalized music playlist recommendations using Amazon Personalize, stores recommendations in DynamoDB, and notifies users via SNS push notification.

naftiko: "0.5"
info:
  label: "Music Playlist Recommendation Notifier"
  description: "Generates personalized music playlist recommendations using Amazon Personalize, stores recommendations in DynamoDB, and notifies users via SNS push notification."
  tags:
    - media
    - music
    - personalization
    - aws
    - personalize
    - dynamodb
    - sns
capability:
  exposes:
    - type: mcp
      namespace: music-recommend
      port: 8080
      tools:
        - name: recommend-and-notify
          description: "Generate music recommendations with Personalize, store them, and push-notify the user."
          inputParameters:
            - name: user_id
              in: body
              type: string
              description: "The Amazon Music user ID."
            - name: campaign_arn
              in: body
              type: string
              description: "The Personalize campaign ARN for recommendations."
            - name: sns_topic_arn
              in: body
              type: string
              description: "SNS topic ARN for push notifications."
          steps:
            - name: get-recommendations
              type: call
              call: "personalize-api.get-recommendations"
              with:
                campaign_arn: "{{campaign_arn}}"
                user_id: "{{user_id}}"
            - name: store-recommendations
              type: call
              call: "dynamo-music.put-item"
              with:
                table_name: "music-recommendations"
                user_id: "{{user_id}}"
                items: "{{get-recommendations.item_list}}"
            - name: notify-user
              type: call
              call: "sns-music.publish"
              with:
                topic_arn: "{{sns_topic_arn}}"
                message: "New playlist recommendations are ready for you! Check your Amazon Music app."
  consumes:
    - namespace: personalize-api
      type: http
      baseUri: "https://personalize-runtime.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_personalize_token"
        placement: header
      resources:
        - name: recommendations
          path: "/recommendations"
          operations:
            - name: get-recommendations
              method: POST
    - namespace: dynamo-music
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST
    - namespace: sns-music
      type: http
      baseUri: "https://sns.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sns_token"
        placement: header
      resources:
        - name: publish
          path: "/"
          operations:
            - name: publish
              method: POST

When a new hire record is created in Workday, opens a ServiceNow onboarding ticket, provisions a GitHub org membership, and sends a Slack welcome message to the team channel.

naftiko: "0.5"
info:
  label: "New Hire Onboarding Orchestrator"
  description: "When a new hire record is created in Workday, opens a ServiceNow onboarding ticket, provisions a GitHub org membership, and sends a Slack welcome message to the team channel."
  tags:
    - hr
    - onboarding
    - workday
    - servicenow
    - github
    - slack
capability:
  exposes:
    - type: mcp
      namespace: hr-onboarding
      port: 8080
      tools:
        - name: trigger-onboarding
          description: "Given a Workday employee ID and start date, orchestrate the full onboarding sequence: fetch worker details from Workday, open a ServiceNow onboarding ticket, add the employee to the GitHub org, and send a Slack welcome message."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID for the new hire, e.g. WD-100234."
            - name: start_date
              in: body
              type: string
              description: "The hire's start date in YYYY-MM-DD format."
            - name: github_team_slug
              in: body
              type: string
              description: "The GitHub team slug to add the new hire to, e.g. platform-eng."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID where the welcome message will be posted."
          steps:
            - name: get-employee
              type: call
              call: "workday.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: open-ticket
              type: call
              call: "servicenow.create-incident"
              with:
                short_description: "New hire onboarding: {{get-employee.full_name}}"
                assignment_group: "IT_Onboarding"
                category: "hr_onboarding"
            - name: add-github-member
              type: call
              call: "github.add-org-member"
              with:
                org: "amzn"
                username: "{{get-employee.github_username}}"
                team_slug: "{{github_team_slug}}"
            - name: send-welcome
              type: call
              call: "slack.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Welcome to Amazon, {{get-employee.first_name}}! Onboarding ticket: {{open-ticket.number}}"
  consumes:
    - namespace: workday
      type: http
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: worker
          path: "/workers/{worker_id}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - namespace: servicenow
      type: http
      baseUri: "https://amazon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incident
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - namespace: github
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: org-member
          path: "/orgs/{org}/teams/{team_slug}/memberships/{username}"
          inputParameters:
            - name: org
              in: path
            - name: team_slug
              in: path
            - name: username
              in: path
          operations:
            - name: add-org-member
              method: PUT
    - namespace: slack
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches all users in a specified Okta group, checks each user's last login date against a stale-access threshold, and posts an access review report to the security Slack channel.

naftiko: "0.5"
info:
  label: "Okta Access Review Report"
  description: "Fetches all users in a specified Okta group, checks each user's last login date against a stale-access threshold, and posts an access review report to the security Slack channel."
  tags:
    - identity
    - security
    - okta
    - slack
    - access-review
capability:
  exposes:
    - type: mcp
      namespace: identity-review
      port: 8080
      tools:
        - name: run-access-review
          description: "Given an Okta group ID and a stale-threshold in days, list group members, filter for users whose last login exceeds the threshold, and post the stale-access list to Slack."
          inputParameters:
            - name: okta_group_id
              in: body
              type: string
              description: "The Okta group ID to review member access for."
            - name: stale_threshold_days
              in: body
              type: integer
              description: "Number of days without login after which an account is considered stale."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the access review report."
          steps:
            - name: get-group-members
              type: call
              call: "okta-review.get-group-users"
              with:
                group_id: "{{okta_group_id}}"
            - name: post-review-report
              type: call
              call: "slack-review.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Access Review for Okta group {{okta_group_id}}: {{get-group-members.total}} members, {{get-group-members.stale_count}} accounts inactive for more than {{stale_threshold_days}} days."
  consumes:
    - namespace: okta-review
      type: http
      baseUri: "https://amazon.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-users
          path: "/groups/{group_id}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: get-group-users
              method: GET
    - namespace: slack-review
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Audits all Okta users in a specified group to identify those without MFA enrolled, posts a remediation report to the security Slack channel, and creates a Jira compliance task.

naftiko: "0.5"
info:
  label: "Okta MFA Enforcement Audit"
  description: "Audits all Okta users in a specified group to identify those without MFA enrolled, posts a remediation report to the security Slack channel, and creates a Jira compliance task."
  tags:
    - security
    - identity
    - okta
    - compliance
    - slack
    - jira
capability:
  exposes:
    - type: mcp
      namespace: mfa-audit
      port: 8080
      tools:
        - name: audit-mfa-enrollment
          description: "Given an Okta group ID, list all users and check MFA enrollment status. Post a list of non-compliant users to the security Slack channel and create a Jira compliance task."
          inputParameters:
            - name: okta_group_id
              in: body
              type: string
              description: "The Okta group ID to audit for MFA enrollment compliance."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the MFA compliance report."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key for the compliance tracking task."
          steps:
            - name: get-group-users
              type: call
              call: "okta-mfa.get-group-users"
              with:
                group_id: "{{okta_group_id}}"
            - name: create-compliance-task
              type: call
              call: "jira-mfa.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Task"
                summary: "MFA audit: {{get-group-users.non_mfa_count}} users without MFA in group {{okta_group_id}}"
                description: "Non-compliant users: {{get-group-users.non_mfa_count}} out of {{get-group-users.total}}"
            - name: post-mfa-report
              type: call
              call: "slack-mfa.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "MFA Audit: {{get-group-users.non_mfa_count}} / {{get-group-users.total}} users in group {{okta_group_id}} lack MFA. Jira: {{create-compliance-task.key}}"
  consumes:
    - namespace: okta-mfa
      type: http
      baseUri: "https://amazon.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-users
          path: "/groups/{group_id}/users"
          inputParameters:
            - name: group_id
              in: path
          operations:
            - name: get-group-users
              method: GET
    - namespace: jira-mfa
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: slack-mfa
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Retrieves order details from the Selling Partner API, checks shipment status, and updates a DynamoDB tracking table with the latest fulfillment state.

naftiko: "0.5"
info:
  label: "Order Fulfillment Tracker"
  description: "Retrieves order details from the Selling Partner API, checks shipment status, and updates a DynamoDB tracking table with the latest fulfillment state."
  tags:
    - ecommerce
    - logistics
    - fulfillment
    - marketplace
    - dynamodb
capability:
  exposes:
    - type: mcp
      namespace: fulfillment-track
      port: 8080
      tools:
        - name: track-order-fulfillment
          description: "Track the fulfillment status of an Amazon marketplace order. Fetches order and shipment data, then updates the tracking database."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The Amazon marketplace order ID to track."
          steps:
            - name: get-order
              type: call
              call: "sp-fulfill.get-order"
              with:
                order_id: "{{order_id}}"
            - name: get-shipment
              type: call
              call: "sp-fulfill.get-shipment"
              with:
                order_id: "{{order_id}}"
            - name: update-tracking
              type: call
              call: "dynamo-fulfill.put-item"
              with:
                table_name: "order-fulfillment-tracking"
                order_id: "{{order_id}}"
                order_status: "{{get-order.status}}"
                shipment_status: "{{get-shipment.tracking_status}}"
  consumes:
    - namespace: sp-fulfill
      type: http
      baseUri: "https://sellingpartnerapi-na.amazon.com"
      authentication:
        type: bearer
        token: "$secrets.sp_api_token"
      resources:
        - name: order
          path: "/orders/v0/orders/{order_id}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET
        - name: shipment
          path: "/orders/v0/orders/{order_id}/shipment"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-shipment
              method: GET
    - namespace: dynamo-fulfill
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST

Looks up who is currently on-call in PagerDuty for a given escalation policy and returns the on-call engineer's name and contact details.

naftiko: "0.5"
info:
  label: "PagerDuty On-Call Schedule Lookup"
  description: "Looks up who is currently on-call in PagerDuty for a given escalation policy and returns the on-call engineer's name and contact details."
  tags:
    - itsm
    - on-call
    - pagerduty
capability:
  exposes:
    - type: mcp
      namespace: oncall-lookup
      port: 8080
      tools:
        - name: get-oncall-engineer
          description: "Given a PagerDuty escalation policy ID, return the name and contact details of the currently on-call engineer. Use when routing incidents or determining who to notify for a given service."
          inputParameters:
            - name: escalation_policy_id
              in: body
              type: string
              description: "The PagerDuty escalation policy ID to look up the current on-call user for."
          call: "pagerduty-lookup.get-oncall"
          with:
            escalation_policy_id: "{{escalation_policy_id}}"
          outputParameters:
            - name: oncall_name
              type: string
              mapping: "$.oncalls[0].user.summary"
            - name: oncall_email
              type: string
              mapping: "$.oncalls[0].user.email"
  consumes:
    - namespace: pagerduty-lookup
      type: http
      baseUri: "https://api.pagerduty.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: oncall
          path: "/oncalls"
          inputParameters:
            - name: escalation_policy_id
              in: query
          operations:
            - name: get-oncall
              method: GET

Detects Prime delivery delays by checking shipment tracking, creates a support ticket in ServiceNow, and sends the customer a proactive notification via SES.

naftiko: "0.5"
info:
  label: "Prime Delivery Delay Escalation"
  description: "Detects Prime delivery delays by checking shipment tracking, creates a support ticket in ServiceNow, and sends the customer a proactive notification via SES."
  tags:
    - ecommerce
    - prime
    - logistics
    - customer-service
    - servicenow
    - ses
capability:
  exposes:
    - type: mcp
      namespace: prime-delay
      port: 8080
      tools:
        - name: escalate-delay
          description: "Detect a Prime delivery delay, create a ServiceNow ticket, and proactively notify the customer via email."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The order ID with a potential delivery delay."
            - name: customer_email
              in: body
              type: string
              description: "The customer email for proactive notification."
          steps:
            - name: check-shipment
              type: call
              call: "logistics-delay.get-shipment-tracking"
              with:
                order_id: "{{order_id}}"
            - name: create-ticket
              type: call
              call: "servicenow-delay.create-incident"
              with:
                short_description: "Prime Delivery Delay: Order {{order_id}}"
                description: "Shipment {{check-shipment.tracking_id}} delayed. Current status: {{check-shipment.status}}. Expected: {{check-shipment.expected_date}}."
            - name: notify-customer
              type: call
              call: "ses-delay.send-email"
              with:
                to: "{{customer_email}}"
                subject: "Update on your Amazon order {{order_id}}"
                body: "We noticed a delay with your order. Current status: {{check-shipment.status}}. New estimated delivery: {{check-shipment.revised_date}}. We apologize for the inconvenience."
  consumes:
    - namespace: logistics-delay
      type: http
      baseUri: "https://api.amazon.com/logistics/v1"
      authentication:
        type: bearer
        token: "$secrets.amazon_logistics_token"
      resources:
        - name: tracking
          path: "/orders/{order_id}/tracking"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-shipment-tracking
              method: GET
    - namespace: servicenow-delay
      type: http
      baseUri: "https://amazon.service-now.com/api/now/table"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_password"
      resources:
        - name: incident
          path: "/incident"
          operations:
            - name: create-incident
              method: POST
    - namespace: ses-delay
      type: http
      baseUri: "https://email.us-east-1.amazonaws.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ses_token"
        placement: header
      resources:
        - name: email
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Checks the Prime membership status for a customer account and returns subscription tier and renewal date.

naftiko: "0.5"
info:
  label: "Prime Membership Status Lookup"
  description: "Checks the Prime membership status for a customer account and returns subscription tier and renewal date."
  tags:
    - ecommerce
    - prime
    - customer
capability:
  exposes:
    - type: mcp
      namespace: prime-membership
      port: 8080
      tools:
        - name: get-membership-status
          description: "Look up the Prime membership status for a given customer ID. Returns tier, renewal date, and benefit details."
          inputParameters:
            - name: customer_id
              in: body
              type: string
              description: "The Amazon customer ID to look up Prime status for."
          call: "prime-api.get-membership"
          with:
            customer_id: "{{customer_id}}"
          outputParameters:
            - name: tier
              type: string
              mapping: "$.membership.tier"
            - name: renewal_date
              type: string
              mapping: "$.membership.renewalDate"
  consumes:
    - namespace: prime-api
      type: http
      baseUri: "https://api.amazon.com/prime/v1"
      authentication:
        type: bearer
        token: "$secrets.amazon_prime_token"
      resources:
        - name: membership
          path: "/memberships/{customer_id}"
          inputParameters:
            - name: customer_id
              in: path
          operations:
            - name: get-membership
              method: GET

Fetches viewership analytics for Prime Video content, generates a performance summary, and distributes it to stakeholders via email through SES.

naftiko: "0.5"
info:
  label: "Prime Video Content Performance Report"
  description: "Fetches viewership analytics for Prime Video content, generates a performance summary, and distributes it to stakeholders via email through SES."
  tags:
    - media
    - prime-video
    - analytics
    - studios
    - ses
capability:
  exposes:
    - type: mcp
      namespace: pv-performance
      port: 8080
      tools:
        - name: generate-content-report
          description: "Generate a viewership performance report for Prime Video content and email it to stakeholders via SES."
          inputParameters:
            - name: content_id
              in: body
              type: string
              description: "The Prime Video content ID (ASIN) to analyze."
            - name: recipient_email
              in: body
              type: string
              description: "The email address to send the report to."
          steps:
            - name: get-viewership
              type: call
              call: "pv-analytics.get-viewership"
              with:
                content_id: "{{content_id}}"
            - name: get-content-metadata
              type: call
              call: "pv-analytics.get-content-info"
              with:
                content_id: "{{content_id}}"
            - name: send-report
              type: call
              call: "ses-report.send-email"
              with:
                to: "{{recipient_email}}"
                subject: "Performance Report: {{get-content-metadata.title}}"
                body: "Title: {{get-content-metadata.title}}\nTotal Views: {{get-viewership.total_views}}\nCompletion Rate: {{get-viewership.completion_rate}}%\nAvg Watch Time: {{get-viewership.avg_watch_minutes}} min"
  consumes:
    - namespace: pv-analytics
      type: http
      baseUri: "https://api.amazonvideo.com/analytics/v1"
      authentication:
        type: bearer
        token: "$secrets.prime_video_analytics_token"
      resources:
        - name: viewership
          path: "/content/{content_id}/viewership"
          inputParameters:
            - name: content_id
              in: path
          operations:
            - name: get-viewership
              method: GET
        - name: content-info
          path: "/content/{content_id}"
          inputParameters:
            - name: content_id
              in: path
          operations:
            - name: get-content-info
              method: GET
    - namespace: ses-report
      type: http
      baseUri: "https://email.us-east-1.amazonaws.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ses_token"
        placement: header
      resources:
        - name: email
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Searches the Amazon product catalog by keyword and returns matching product listings with prices and ratings.

naftiko: "0.5"
info:
  label: "Product Catalog Search"
  description: "Searches the Amazon product catalog by keyword and returns matching product listings with prices and ratings."
  tags:
    - ecommerce
    - catalog
    - search
capability:
  exposes:
    - type: mcp
      namespace: catalog-search
      port: 8080
      tools:
        - name: search-products
          description: "Search the Amazon product catalog by keyword. Returns product titles, ASINs, prices, and ratings."
          inputParameters:
            - name: keywords
              in: body
              type: string
              description: "The search keywords for product lookup."
            - name: category
              in: body
              type: string
              description: "The product category to filter by, e.g. Electronics."
          call: "catalog-api.search-items"
          with:
            keywords: "{{keywords}}"
            category: "{{category}}"
          outputParameters:
            - name: items
              type: array
              mapping: "$.SearchResult.Items"
  consumes:
    - namespace: catalog-api
      type: http
      baseUri: "https://webservices.amazon.com/paapi5"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.amazon_paapi_token"
        placement: header
      resources:
        - name: items
          path: "/searchitems"
          inputParameters:
            - name: keywords
              in: body
            - name: category
              in: body
          operations:
            - name: search-items
              method: POST

Orchestrates a production deployment by triggering a GitHub Actions workflow, creating a Datadog deployment marker, and posting a status notification to the Slack deployments channel.

naftiko: "0.5"
info:
  label: "Production Deployment Rollout"
  description: "Orchestrates a production deployment by triggering a GitHub Actions workflow, creating a Datadog deployment marker, and posting a status notification to the Slack deployments channel."
  tags:
    - devops
    - deployment
    - github
    - datadog
    - slack
capability:
  exposes:
    - type: mcp
      namespace: devops-deploy
      port: 8080
      tools:
        - name: trigger-production-deploy
          description: "Given a service name, version tag, and target environment, trigger a GitHub Actions deployment workflow, register a Datadog deployment marker, and notify the Slack deployments channel."
          inputParameters:
            - name: repo
              in: body
              type: string
              description: "The GitHub repository in owner/repo format to deploy from."
            - name: version_tag
              in: body
              type: string
              description: "The git tag or commit SHA to deploy, e.g. v2.4.1."
            - name: environment
              in: body
              type: string
              description: "The target deployment environment: production, staging, or canary."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID to post deployment status to."
          steps:
            - name: trigger-workflow
              type: call
              call: "github-deploy.trigger-workflow"
              with:
                repo: "{{repo}}"
                ref: "{{version_tag}}"
                workflow_id: "deploy.yml"
                inputs: "{\"environment\":\"{{environment}}\"}"
            - name: mark-deployment
              type: call
              call: "datadog-deploy.create-event"
              with:
                title: "Deployment: {{repo}} {{version_tag}} to {{environment}}"
                text: "Workflow run triggered via Naftiko."
                alert_type: "info"
            - name: notify-channel
              type: call
              call: "slack-deploy.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Deployment started: {{repo}} @ {{version_tag}} to {{environment}}."
  consumes:
    - namespace: github-deploy
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: workflow-dispatch
          path: "/repos/{repo}/actions/workflows/{workflow_id}/dispatches"
          inputParameters:
            - name: repo
              in: path
            - name: workflow_id
              in: path
          operations:
            - name: trigger-workflow
              method: POST
    - namespace: datadog-deploy
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: event
          path: "/events"
          operations:
            - name: create-event
              method: POST
    - namespace: slack-deploy
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Creates an on-demand RDS database snapshot, checks its completion status, and notifies the DBA team via Slack when ready.

naftiko: "0.5"
info:
  label: "RDS Snapshot and Notify"
  description: "Creates an on-demand RDS database snapshot, checks its completion status, and notifies the DBA team via Slack when ready."
  tags:
    - cloud
    - database
    - backup
    - aws
    - rds
    - slack
capability:
  exposes:
    - type: mcp
      namespace: rds-backup
      port: 8080
      tools:
        - name: snapshot-and-notify
          description: "Create an RDS snapshot, verify its status, and notify the DBA team when complete."
          inputParameters:
            - name: db_instance_id
              in: body
              type: string
              description: "The RDS database instance identifier."
            - name: snapshot_id
              in: body
              type: string
              description: "The desired snapshot identifier."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for DBA notifications."
          steps:
            - name: create-snapshot
              type: call
              call: "rds-api.create-db-snapshot"
              with:
                db_instance_id: "{{db_instance_id}}"
                snapshot_id: "{{snapshot_id}}"
            - name: check-status
              type: call
              call: "rds-api.describe-db-snapshot"
              with:
                snapshot_id: "{{snapshot_id}}"
            - name: notify-team
              type: call
              call: "slack-rds.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "RDS Snapshot {{snapshot_id}} for {{db_instance_id}}: Status {{check-status.status}}. Created at {{check-status.created_at}}."
  consumes:
    - namespace: rds-api
      type: http
      baseUri: "https://rds.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_rds_token"
        placement: header
      resources:
        - name: snapshot
          path: "/"
          operations:
            - name: create-db-snapshot
              method: POST
            - name: describe-db-snapshot
              method: GET
    - namespace: slack-rds
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Returns the current status, node count, and storage utilization for an Amazon Redshift cluster.

naftiko: "0.5"
info:
  label: "Redshift Cluster Status"
  description: "Returns the current status, node count, and storage utilization for an Amazon Redshift cluster."
  tags:
    - cloud
    - data-warehouse
    - aws
    - redshift
capability:
  exposes:
    - type: mcp
      namespace: redshift-status
      port: 8080
      tools:
        - name: describe-cluster
          description: "Get the status, node count, and configuration for a Redshift cluster."
          inputParameters:
            - name: cluster_identifier
              in: body
              type: string
              description: "The Redshift cluster identifier to describe."
          call: "redshift-api.describe-cluster"
          with:
            cluster_identifier: "{{cluster_identifier}}"
          outputParameters:
            - name: status
              type: string
              mapping: "$.Clusters[0].ClusterStatus"
            - name: node_count
              type: number
              mapping: "$.Clusters[0].NumberOfNodes"
  consumes:
    - namespace: redshift-api
      type: http
      baseUri: "https://redshift.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_redshift_token"
        placement: header
      resources:
        - name: cluster
          path: "/"
          inputParameters:
            - name: cluster_identifier
              in: query
          operations:
            - name: describe-cluster
              method: GET

Checks Redshift query execution status, validates row counts against expected thresholds, and posts ETL health reports to a Slack channel.

naftiko: "0.5"
info:
  label: "Redshift ETL Pipeline Monitor"
  description: "Checks Redshift query execution status, validates row counts against expected thresholds, and posts ETL health reports to a Slack channel."
  tags:
    - cloud
    - data-warehouse
    - etl
    - aws
    - redshift
    - slack
capability:
  exposes:
    - type: mcp
      namespace: redshift-etl
      port: 8080
      tools:
        - name: monitor-etl-pipeline
          description: "Check the status of a Redshift ETL query, validate output row counts, and report pipeline health to Slack."
          inputParameters:
            - name: query_id
              in: body
              type: string
              description: "The Redshift query execution ID to monitor."
            - name: expected_row_count
              in: body
              type: number
              description: "The minimum expected row count for validation."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel for ETL health reports."
          steps:
            - name: get-query-status
              type: call
              call: "redshift-etl-api.describe-statement"
              with:
                query_id: "{{query_id}}"
            - name: get-row-count
              type: call
              call: "redshift-etl-api.get-statement-result"
              with:
                query_id: "{{query_id}}"
            - name: post-report
              type: call
              call: "slack-etl.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "ETL Pipeline Report: Query {{query_id}} status: {{get-query-status.status}}. Rows loaded: {{get-row-count.total_rows}} (expected: {{expected_row_count}})."
  consumes:
    - namespace: redshift-etl-api
      type: http
      baseUri: "https://redshift-data.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_redshift_data_token"
        placement: header
      resources:
        - name: statement
          path: "/"
          inputParameters:
            - name: query_id
              in: body
          operations:
            - name: describe-statement
              method: POST
            - name: get-statement-result
              method: POST
    - namespace: slack-etl
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When an employee's role changes in Workday, updates their Okta group memberships to reflect the new role's permissions and notifies the manager via Slack.

naftiko: "0.5"
info:
  label: "Role Change Provisioning"
  description: "When an employee's role changes in Workday, updates their Okta group memberships to reflect the new role's permissions and notifies the manager via Slack."
  tags:
    - hr
    - role-change
    - workday
    - okta
    - slack
    - identity
capability:
  exposes:
    - type: mcp
      namespace: hr-role-change
      port: 8080
      tools:
        - name: sync-role-permissions
          description: "Given a Workday employee ID and new role ID, update the employee's Okta group memberships to match the new role and notify their manager in Slack."
          inputParameters:
            - name: workday_employee_id
              in: body
              type: string
              description: "The Workday worker ID of the employee whose role has changed."
            - name: new_okta_group_id
              in: body
              type: string
              description: "The Okta group ID corresponding to the new role's permission set."
            - name: manager_slack_id
              in: body
              type: string
              description: "The Slack user ID of the employee's manager for notification."
          steps:
            - name: get-employee
              type: call
              call: "workday-rc.get-worker"
              with:
                worker_id: "{{workday_employee_id}}"
            - name: add-okta-group
              type: call
              call: "okta-rc.add-user-to-group"
              with:
                group_id: "{{new_okta_group_id}}"
                user_id: "{{get-employee.okta_user_id}}"
            - name: notify-manager
              type: call
              call: "slack-rc.post-message"
              with:
                channel: "{{manager_slack_id}}"
                text: "Role update complete for {{get-employee.full_name}}. Okta permissions updated for group {{new_okta_group_id}}."
  consumes:
    - namespace: workday-rc
      type: http
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: worker
          path: "/workers/{worker_id}"
          inputParameters:
            - name: worker_id
              in: path
          operations:
            - name: get-worker
              method: GET
    - namespace: okta-rc
      type: http
      baseUri: "https://amazon.okta.com/api/v1"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.okta_api_token"
        placement: header
      resources:
        - name: group-member
          path: "/groups/{group_id}/users/{user_id}"
          inputParameters:
            - name: group_id
              in: path
            - name: user_id
              in: path
          operations:
            - name: add-user-to-group
              method: PUT
    - namespace: slack-rc
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Lists DNS resource record sets for a given Route 53 hosted zone and returns matching records.

naftiko: "0.5"
info:
  label: "Route 53 DNS Record Lookup"
  description: "Lists DNS resource record sets for a given Route 53 hosted zone and returns matching records."
  tags:
    - cloud
    - networking
    - aws
    - dns
capability:
  exposes:
    - type: mcp
      namespace: route53-dns
      port: 8080
      tools:
        - name: list-records
          description: "List all DNS records in a Route 53 hosted zone. Use to audit or verify DNS configurations."
          inputParameters:
            - name: hosted_zone_id
              in: body
              type: string
              description: "The Route 53 hosted zone ID to list records for."
          call: "route53-api.list-record-sets"
          with:
            hosted_zone_id: "{{hosted_zone_id}}"
          outputParameters:
            - name: records
              type: array
              mapping: "$.ResourceRecordSets"
  consumes:
    - namespace: route53-api
      type: http
      baseUri: "https://route53.amazonaws.com/2013-04-01"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_route53_token"
        placement: header
      resources:
        - name: record-sets
          path: "/hostedzone/{hosted_zone_id}/rrset"
          inputParameters:
            - name: hosted_zone_id
              in: path
          operations:
            - name: list-record-sets
              method: GET

Scans S3 buckets for public access misconfigurations, logs findings to DynamoDB, and alerts the security team via SNS.

naftiko: "0.5"
info:
  label: "S3 Bucket Compliance Scanner"
  description: "Scans S3 buckets for public access misconfigurations, logs findings to DynamoDB, and alerts the security team via SNS."
  tags:
    - cloud
    - security
    - compliance
    - aws
    - s3
    - dynamodb
    - sns
capability:
  exposes:
    - type: mcp
      namespace: s3-compliance
      port: 8080
      tools:
        - name: scan-bucket-access
          description: "Scan an S3 bucket for public access settings, record findings in DynamoDB, and alert via SNS if misconfigured."
          inputParameters:
            - name: bucket_name
              in: body
              type: string
              description: "The S3 bucket name to scan for public access."
            - name: sns_topic_arn
              in: body
              type: string
              description: "The SNS topic ARN for security alerts."
          steps:
            - name: check-public-access
              type: call
              call: "s3-scan.get-public-access-block"
              with:
                bucket_name: "{{bucket_name}}"
            - name: log-finding
              type: call
              call: "dynamo-scan.put-item"
              with:
                table_name: "s3-compliance-findings"
                bucket_name: "{{bucket_name}}"
                public_access: "{{check-public-access.public_access_block}}"
            - name: send-alert
              type: call
              call: "sns-scan.publish"
              with:
                topic_arn: "{{sns_topic_arn}}"
                message: "S3 Compliance Finding: {{bucket_name}} public access config: {{check-public-access.public_access_block}}"
  consumes:
    - namespace: s3-scan
      type: http
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_s3_token"
        placement: header
      resources:
        - name: public-access
          path: "/{bucket_name}?publicAccessBlock"
          inputParameters:
            - name: bucket_name
              in: path
          operations:
            - name: get-public-access-block
              method: GET
    - namespace: dynamo-scan
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST
    - namespace: sns-scan
      type: http
      baseUri: "https://sns.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sns_token"
        placement: header
      resources:
        - name: publish
          path: "/"
          operations:
            - name: publish
              method: POST

Lists all S3 buckets in the AWS account and returns their names, creation dates, and regions.

naftiko: "0.5"
info:
  label: "S3 Bucket Listing"
  description: "Lists all S3 buckets in the AWS account and returns their names, creation dates, and regions."
  tags:
    - cloud
    - storage
    - aws
    - s3
capability:
  exposes:
    - type: mcp
      namespace: s3-listing
      port: 8080
      tools:
        - name: list-buckets
          description: "List all S3 buckets in the AWS account. Returns bucket names, creation dates, and region information."
          inputParameters:
            - name: region
              in: body
              type: string
              description: "The AWS region to filter buckets by, e.g. us-east-1."
          call: "s3-api.list-buckets"
          with:
            region: "{{region}}"
          outputParameters:
            - name: bucket_count
              type: number
              mapping: "$.Buckets.length"
            - name: buckets
              type: array
              mapping: "$.Buckets"
  consumes:
    - namespace: s3-api
      type: http
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_s3_token"
        placement: header
      resources:
        - name: buckets
          path: "/"
          inputParameters:
            - name: region
              in: query
          operations:
            - name: list-buckets
              method: GET

Deploys a SageMaker model to an endpoint, runs a validation inference, and records the deployment in DynamoDB for tracking.

naftiko: "0.5"
info:
  label: "SageMaker Model Deployment Pipeline"
  description: "Deploys a SageMaker model to an endpoint, runs a validation inference, and records the deployment in DynamoDB for tracking."
  tags:
    - cloud
    - machine-learning
    - deployment
    - aws
    - sagemaker
    - dynamodb
capability:
  exposes:
    - type: mcp
      namespace: sagemaker-deploy
      port: 8080
      tools:
        - name: deploy-model
          description: "Deploy a SageMaker model to an endpoint, validate with a test inference, and log the deployment."
          inputParameters:
            - name: model_name
              in: body
              type: string
              description: "The SageMaker model name to deploy."
            - name: endpoint_name
              in: body
              type: string
              description: "The target SageMaker endpoint name."
            - name: instance_type
              in: body
              type: string
              description: "The instance type for the endpoint, e.g. ml.m5.large."
          steps:
            - name: create-endpoint-config
              type: call
              call: "sagemaker-api.create-endpoint-config"
              with:
                model_name: "{{model_name}}"
                endpoint_name: "{{endpoint_name}}"
                instance_type: "{{instance_type}}"
            - name: update-endpoint
              type: call
              call: "sagemaker-api.update-endpoint"
              with:
                endpoint_name: "{{endpoint_name}}"
                config_name: "{{create-endpoint-config.config_name}}"
            - name: log-deployment
              type: call
              call: "dynamo-ml.put-item"
              with:
                table_name: "ml-deployments"
                model_name: "{{model_name}}"
                endpoint_name: "{{endpoint_name}}"
                status: "{{update-endpoint.status}}"
  consumes:
    - namespace: sagemaker-api
      type: http
      baseUri: "https://api.sagemaker.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sagemaker_token"
        placement: header
      resources:
        - name: endpoint-config
          path: "/"
          operations:
            - name: create-endpoint-config
              method: POST
        - name: endpoint
          path: "/"
          operations:
            - name: update-endpoint
              method: POST
    - namespace: dynamo-ml
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST

When a Salesforce support case is escalated to priority 1, creates a linked ServiceNow incident and pages the on-call support engineer via PagerDuty.

naftiko: "0.5"
info:
  label: "Salesforce Case Escalation to ServiceNow"
  description: "When a Salesforce support case is escalated to priority 1, creates a linked ServiceNow incident and pages the on-call support engineer via PagerDuty."
  tags:
    - customer-support
    - crm
    - salesforce
    - servicenow
    - pagerduty
    - escalation
capability:
  exposes:
    - type: mcp
      namespace: support-escalation
      port: 8080
      tools:
        - name: escalate-case-to-p1
          description: "Given a Salesforce case ID and PagerDuty service key, fetch the case details, open a linked ServiceNow incident, and page the on-call support engineer."
          inputParameters:
            - name: case_id
              in: body
              type: string
              description: "The Salesforce case ID to escalate, e.g. 5005g00000ABC."
            - name: pagerduty_service_key
              in: body
              type: string
              description: "The PagerDuty service integration key for routing the escalation page."
          steps:
            - name: get-case
              type: call
              call: "salesforce-esc.get-case"
              with:
                case_id: "{{case_id}}"
            - name: create-incident
              type: call
              call: "servicenow-esc.create-incident"
              with:
                short_description: "P1 Escalation: {{get-case.subject}}"
                description: "Salesforce Case: {{case_id}}\nAccount: {{get-case.account_name}}\nDescription: {{get-case.description}}"
                urgency: "1"
                impact: "1"
            - name: page-oncall
              type: call
              call: "pagerduty-esc.create-incident"
              with:
                service_key: "{{pagerduty_service_key}}"
                description: "P1 support escalation: {{get-case.subject}}"
                incident_key: "sf-{{case_id}}"
  consumes:
    - namespace: salesforce-esc
      type: http
      baseUri: "https://amazon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: case
          path: "/sobjects/Case/{case_id}"
          inputParameters:
            - name: case_id
              in: path
          operations:
            - name: get-case
              method: GET
    - namespace: servicenow-esc
      type: http
      baseUri: "https://amazon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: incident
          path: "/table/incident"
          operations:
            - name: create-incident
              method: POST
    - namespace: pagerduty-esc
      type: http
      baseUri: "https://events.pagerduty.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.pagerduty_token"
        placement: header
      resources:
        - name: incident
          path: "/enqueue"
          operations:
            - name: create-incident
              method: POST

Queries Datadog for a customer's service usage metrics, calculates a health score, and updates the corresponding Salesforce account record with the latest health indicator.

naftiko: "0.5"
info:
  label: "Salesforce Customer Health Score Update"
  description: "Queries Datadog for a customer's service usage metrics, calculates a health score, and updates the corresponding Salesforce account record with the latest health indicator."
  tags:
    - crm
    - customer-success
    - salesforce
    - datadog
    - health-score
capability:
  exposes:
    - type: mcp
      namespace: cs-ops
      port: 8080
      tools:
        - name: update-customer-health-score
          description: "Given a Salesforce account ID and the customer's Datadog service tag, fetch usage and error metrics from Datadog and update the Salesforce account's health score field."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID for the customer to update, e.g. 0015g00001XYZ."
            - name: datadog_service_tag
              in: body
              type: string
              description: "The Datadog service tag used to identify the customer's usage metrics."
          steps:
            - name: get-metrics
              type: call
              call: "datadog-cs.query-metrics"
              with:
                query: "avg:trace.web.request.hits{service:{{datadog_service_tag}}}.rollup(sum, 86400)"
            - name: update-account
              type: call
              call: "salesforce-cs.update-account"
              with:
                account_id: "{{account_id}}"
                health_score: "{{get-metrics.value}}"
  consumes:
    - namespace: datadog-cs
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/query"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: query-metrics
              method: GET
    - namespace: salesforce-cs
      type: http
      baseUri: "https://amazon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: account
          path: "/sobjects/Account/{account_id}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: update-account
              method: PATCH

Enriches an inbound Salesforce lead with ZoomInfo company and contact data, updates the lead record, and assigns it to the appropriate Salesforce queue.

naftiko: "0.5"
info:
  label: "Salesforce Lead Enrichment"
  description: "Enriches an inbound Salesforce lead with ZoomInfo company and contact data, updates the lead record, and assigns it to the appropriate Salesforce queue."
  tags:
    - sales
    - crm
    - lead-enrichment
    - salesforce
    - zoominfo
capability:
  exposes:
    - type: mcp
      namespace: sales-enrichment
      port: 8080
      tools:
        - name: enrich-lead
          description: "Given a Salesforce lead ID, look up the contact in ZoomInfo, update the Salesforce lead record with enriched firmographic data, and assign it to the correct sales queue."
          inputParameters:
            - name: lead_id
              in: body
              type: string
              description: "The Salesforce lead ID to enrich, e.g. 00Q5g00001ABC."
            - name: queue_id
              in: body
              type: string
              description: "The Salesforce queue ID to assign the enriched lead to."
          steps:
            - name: get-lead
              type: call
              call: "salesforce-enrich.get-lead"
              with:
                lead_id: "{{lead_id}}"
            - name: lookup-zoominfo
              type: call
              call: "zoominfo.search-contact"
              with:
                email: "{{get-lead.email}}"
                company_name: "{{get-lead.company}}"
            - name: update-lead
              type: call
              call: "salesforce-enrich.update-lead"
              with:
                lead_id: "{{lead_id}}"
                annual_revenue: "{{lookup-zoominfo.revenue}}"
                employee_count: "{{lookup-zoominfo.employee_count}}"
                industry: "{{lookup-zoominfo.industry}}"
                owner_id: "{{queue_id}}"
  consumes:
    - namespace: salesforce-enrich
      type: http
      baseUri: "https://amazon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: lead
          path: "/sobjects/Lead/{lead_id}"
          inputParameters:
            - name: lead_id
              in: path
          operations:
            - name: get-lead
              method: GET
            - name: update-lead
              method: PATCH
    - namespace: zoominfo
      type: http
      baseUri: "https://api.zoominfo.com/search"
      authentication:
        type: bearer
        token: "$secrets.zoominfo_token"
      resources:
        - name: contact
          path: "/contact"
          operations:
            - name: search-contact
              method: POST

When a Salesforce opportunity moves to Closed Won, creates a Jira epic for the delivery team and posts a handoff notification to the sales Slack channel.

naftiko: "0.5"
info:
  label: "Salesforce Opportunity Sync to Jira"
  description: "When a Salesforce opportunity moves to Closed Won, creates a Jira epic for the delivery team and posts a handoff notification to the sales Slack channel."
  tags:
    - sales
    - crm
    - salesforce
    - jira
    - slack
    - opportunity
capability:
  exposes:
    - type: mcp
      namespace: sales-ops
      port: 8080
      tools:
        - name: sync-opportunity-to-delivery
          description: "Given a Salesforce opportunity ID, fetch opportunity details, create a Jira epic for the delivery team, and post a handoff message in Slack. Invoke when an opportunity is marked Closed Won."
          inputParameters:
            - name: opportunity_id
              in: body
              type: string
              description: "The Salesforce opportunity ID for the closed-won deal, e.g. 0065g00000XYZ."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key where the delivery epic should be created."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID to post the sales-to-delivery handoff message."
          steps:
            - name: get-opportunity
              type: call
              call: "salesforce.get-opportunity"
              with:
                opportunity_id: "{{opportunity_id}}"
            - name: create-epic
              type: call
              call: "jira-sales.create-issue"
              with:
                project_key: "{{jira_project_key}}"
                issuetype: "Epic"
                summary: "Delivery: {{get-opportunity.name}}"
                description: "Account: {{get-opportunity.account_name}}\nValue: {{get-opportunity.amount}}\nClose Date: {{get-opportunity.close_date}}"
            - name: post-handoff
              type: call
              call: "slack-sales.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Closed Won: {{get-opportunity.name}} ({{get-opportunity.amount}}). Delivery epic created: {{create-epic.key}}"
  consumes:
    - namespace: salesforce
      type: http
      baseUri: "https://amazon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: opportunity
          path: "/sobjects/Opportunity/{opportunity_id}"
          inputParameters:
            - name: opportunity_id
              in: path
          operations:
            - name: get-opportunity
              method: GET
    - namespace: jira-sales
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: slack-sales
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

When a Salesforce subscription account is within 90 days of renewal, automatically creates a renewal opportunity, sets the close date, and assigns it to the account owner.

naftiko: "0.5"
info:
  label: "Salesforce Renewal Opportunity Creator"
  description: "When a Salesforce subscription account is within 90 days of renewal, automatically creates a renewal opportunity, sets the close date, and assigns it to the account owner."
  tags:
    - sales
    - crm
    - salesforce
    - renewal
capability:
  exposes:
    - type: mcp
      namespace: sales-renewal
      port: 8080
      tools:
        - name: create-renewal-opportunity
          description: "Given a Salesforce account ID and contract end date, create a renewal opportunity record on the account with a 90-day close target and assign it to the account owner."
          inputParameters:
            - name: account_id
              in: body
              type: string
              description: "The Salesforce account ID of the customer approaching renewal."
            - name: contract_end_date
              in: body
              type: string
              description: "The contract end date in YYYY-MM-DD format used to set the renewal opportunity close date."
            - name: renewal_amount
              in: body
              type: number
              description: "The expected renewal contract value in USD."
          steps:
            - name: get-account
              type: call
              call: "salesforce-renewal.get-account"
              with:
                account_id: "{{account_id}}"
            - name: create-opportunity
              type: call
              call: "salesforce-renewal.create-opportunity"
              with:
                account_id: "{{account_id}}"
                name: "Renewal: {{get-account.name}}"
                close_date: "{{contract_end_date}}"
                stage_name: "Renewal"
                amount: "{{renewal_amount}}"
                owner_id: "{{get-account.owner_id}}"
  consumes:
    - namespace: salesforce-renewal
      type: http
      baseUri: "https://amazon.my.salesforce.com/services/data/v58.0"
      authentication:
        type: bearer
        token: "$secrets.salesforce_token"
      resources:
        - name: account
          path: "/sobjects/Account/{account_id}"
          inputParameters:
            - name: account_id
              in: path
          operations:
            - name: get-account
              method: GET
        - name: opportunity
          path: "/sobjects/Opportunity"
          operations:
            - name: create-opportunity
              method: POST

Retrieves the current value of a secret stored in AWS Secrets Manager by secret name or ARN.

naftiko: "0.5"
info:
  label: "Secrets Manager Secret Retrieve"
  description: "Retrieves the current value of a secret stored in AWS Secrets Manager by secret name or ARN."
  tags:
    - cloud
    - security
    - aws
    - secrets-manager
capability:
  exposes:
    - type: mcp
      namespace: secrets-mgr
      port: 8080
      tools:
        - name: get-secret-value
          description: "Retrieve the current value of a secret from AWS Secrets Manager. Returns the secret string or binary."
          inputParameters:
            - name: secret_id
              in: body
              type: string
              description: "The secret name or ARN to retrieve."
          call: "secrets-api.get-secret-value"
          with:
            secret_id: "{{secret_id}}"
          outputParameters:
            - name: secret_string
              type: string
              mapping: "$.SecretString"
  consumes:
    - namespace: secrets-api
      type: http
      baseUri: "https://secretsmanager.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_secrets_token"
        placement: header
      resources:
        - name: secret
          path: "/"
          inputParameters:
            - name: secret_id
              in: body
          operations:
            - name: get-secret-value
              method: POST

Retrieves order details from Amazon Seller Central by order ID for marketplace seller operations.

naftiko: "0.5"
info:
  label: "Seller Central Order Lookup"
  description: "Retrieves order details from Amazon Seller Central by order ID for marketplace seller operations."
  tags:
    - ecommerce
    - marketplace
    - seller-central
capability:
  exposes:
    - type: mcp
      namespace: seller-orders
      port: 8080
      tools:
        - name: get-order
          description: "Look up a specific order from Amazon Seller Central by order ID. Returns buyer info, items, and status."
          inputParameters:
            - name: order_id
              in: body
              type: string
              description: "The Amazon Marketplace order ID to retrieve."
          call: "sp-api.get-order"
          with:
            order_id: "{{order_id}}"
          outputParameters:
            - name: order_status
              type: string
              mapping: "$.payload.OrderStatus"
            - name: order_total
              type: number
              mapping: "$.payload.OrderTotal.Amount"
  consumes:
    - namespace: sp-api
      type: http
      baseUri: "https://sellingpartnerapi-na.amazon.com"
      authentication:
        type: bearer
        token: "$secrets.sp_api_token"
      resources:
        - name: order
          path: "/orders/v0/orders/{order_id}"
          inputParameters:
            - name: order_id
              in: path
          operations:
            - name: get-order
              method: GET

Analyzes a product listing on Amazon Marketplace for SEO quality, fetches competitor pricing, and suggests optimized title and keywords to a Slack channel.

naftiko: "0.5"
info:
  label: "Seller Product Listing Optimizer"
  description: "Analyzes a product listing on Amazon Marketplace for SEO quality, fetches competitor pricing, and suggests optimized title and keywords to a Slack channel."
  tags:
    - ecommerce
    - marketplace
    - seo
    - seller-central
    - slack
capability:
  exposes:
    - type: mcp
      namespace: listing-optimizer
      port: 8080
      tools:
        - name: optimize-listing
          description: "Analyze a marketplace product listing, compare with competitor pricing, and post optimization suggestions to Slack."
          inputParameters:
            - name: asin
              in: body
              type: string
              description: "The ASIN of the product listing to optimize."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel to post optimization suggestions."
          steps:
            - name: get-listing
              type: call
              call: "sp-listing.get-listing"
              with:
                asin: "{{asin}}"
            - name: get-competitive-pricing
              type: call
              call: "sp-listing.get-competitive-pricing"
              with:
                asin: "{{asin}}"
            - name: post-suggestions
              type: call
              call: "slack-listing.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Listing Optimization for ASIN {{asin}}:\nCurrent title: {{get-listing.title}}\nYour price: {{get-listing.price}}\nLowest competitor: {{get-competitive-pricing.lowest_price}}\nSuggestion: Review keywords and consider competitive repricing."
  consumes:
    - namespace: sp-listing
      type: http
      baseUri: "https://sellingpartnerapi-na.amazon.com"
      authentication:
        type: bearer
        token: "$secrets.sp_api_token"
      resources:
        - name: listing
          path: "/listings/2021-08-01/items/ATVPDKIKX0DER/{asin}"
          inputParameters:
            - name: asin
              in: path
          operations:
            - name: get-listing
              method: GET
        - name: competitive-pricing
          path: "/products/pricing/v0/competitivePrice"
          inputParameters:
            - name: asin
              in: query
          operations:
            - name: get-competitive-pricing
              method: GET
    - namespace: slack-listing
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Fetches a pending ServiceNow change request, checks Datadog service health for the affected service, and automatically approves or escalates the change based on current system stability.

naftiko: "0.5"
info:
  label: "ServiceNow Change Request Approval Gate"
  description: "Fetches a pending ServiceNow change request, checks Datadog service health for the affected service, and automatically approves or escalates the change based on current system stability."
  tags:
    - itsm
    - change-management
    - servicenow
    - datadog
    - approval
capability:
  exposes:
    - type: mcp
      namespace: itsm-change
      port: 8080
      tools:
        - name: evaluate-change-request
          description: "Given a ServiceNow change request number and Datadog service name, check current service health metrics and either approve the change or escalate it with a health report attached."
          inputParameters:
            - name: change_number
              in: body
              type: string
              description: "The ServiceNow change request number, e.g. CHG0012345."
            - name: service_name
              in: body
              type: string
              description: "The Datadog service name to check health for before approving the change."
          steps:
            - name: get-change
              type: call
              call: "servicenow-chg.get-change"
              with:
                number: "{{change_number}}"
            - name: check-health
              type: call
              call: "datadog-chg.query-metrics"
              with:
                query: "avg:trace.web.request.errors{service:{{service_name}}}.rollup(avg, 300)"
            - name: update-change
              type: call
              call: "servicenow-chg.update-change"
              with:
                sys_id: "{{get-change.sys_id}}"
                work_notes: "Automated health check: error rate = {{check-health.value}}. Change proceed status updated."
  consumes:
    - namespace: servicenow-chg
      type: http
      baseUri: "https://amazon.service-now.com/api/now"
      authentication:
        type: basic
        username: "$secrets.servicenow_user"
        password: "$secrets.servicenow_pass"
      resources:
        - name: change
          path: "/table/change_request"
          inputParameters:
            - name: number
              in: query
          operations:
            - name: get-change
              method: GET
            - name: update-change
              method: PATCH
    - namespace: datadog-chg
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/query"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: query-metrics
              method: GET

Checks SES account sending statistics for bounce and complaint rates, logs metrics to CloudWatch, and alerts via SNS if rates exceed thresholds.

naftiko: "0.5"
info:
  label: "SES Bounce Rate Monitor"
  description: "Checks SES account sending statistics for bounce and complaint rates, logs metrics to CloudWatch, and alerts via SNS if rates exceed thresholds."
  tags:
    - cloud
    - email
    - monitoring
    - aws
    - ses
    - cloudwatch
    - sns
capability:
  exposes:
    - type: mcp
      namespace: ses-monitor
      port: 8080
      tools:
        - name: monitor-bounce-rate
          description: "Check SES bounce and complaint rates, log to CloudWatch, and alert via SNS if thresholds are exceeded."
          inputParameters:
            - name: bounce_threshold
              in: body
              type: number
              description: "Maximum acceptable bounce rate percentage."
            - name: sns_topic_arn
              in: body
              type: string
              description: "SNS topic ARN for email health alerts."
          steps:
            - name: get-send-stats
              type: call
              call: "ses-stats.get-account-stats"
              with: {}
            - name: log-metrics
              type: call
              call: "cw-ses.put-metric-data"
              with:
                namespace: "Custom/SESHealth"
                metric_name: "BounceRate"
                value: "{{get-send-stats.bounce_rate}}"
            - name: send-alert
              type: call
              call: "sns-ses.publish"
              with:
                topic_arn: "{{sns_topic_arn}}"
                message: "SES Bounce Rate Alert: Current rate {{get-send-stats.bounce_rate}}% exceeds threshold {{bounce_threshold}}%."
  consumes:
    - namespace: ses-stats
      type: http
      baseUri: "https://email.us-east-1.amazonaws.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ses_token"
        placement: header
      resources:
        - name: account
          path: "/email/account"
          operations:
            - name: get-account-stats
              method: GET
    - namespace: cw-ses
      type: http
      baseUri: "https://monitoring.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: metric
          path: "/"
          operations:
            - name: put-metric-data
              method: POST
    - namespace: sns-ses
      type: http
      baseUri: "https://sns.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sns_token"
        placement: header
      resources:
        - name: publish
          path: "/"
          operations:
            - name: publish
              method: POST

Queries Snowflake task history to detect failed or long-running data pipeline tasks, creates a Jira data-engineering ticket, and posts an alert to the data-platform Slack channel.

naftiko: "0.5"
info:
  label: "Snowflake Data Pipeline Health Monitor"
  description: "Queries Snowflake task history to detect failed or long-running data pipeline tasks, creates a Jira data-engineering ticket, and posts an alert to the data-platform Slack channel."
  tags:
    - data
    - analytics
    - monitoring
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-ops
      port: 8080
      tools:
        - name: monitor-pipeline-health
          description: "Given a Snowflake database and schema, query task execution history for failures or SLA breaches, open a Jira ticket for investigation, and alert the data-platform Slack channel."
          inputParameters:
            - name: snowflake_database
              in: body
              type: string
              description: "The Snowflake database name to check task history for, e.g. ANALYTICS_PROD."
            - name: snowflake_schema
              in: body
              type: string
              description: "The Snowflake schema containing the monitored tasks."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the data-platform alert."
          steps:
            - name: check-tasks
              type: call
              call: "snowflake.query-task-history"
              with:
                database: "{{snowflake_database}}"
                schema: "{{snowflake_schema}}"
            - name: create-ticket
              type: call
              call: "jira-data.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Pipeline health issue detected in {{snowflake_database}}.{{snowflake_schema}}"
                description: "Failed tasks: {{check-tasks.failed_count}}. Last failure: {{check-tasks.last_failed_task}}"
            - name: post-alert
              type: call
              call: "slack-data.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Data Pipeline Alert: {{check-tasks.failed_count}} failed tasks in {{snowflake_database}}. Jira: {{create-ticket.key}}"
  consumes:
    - namespace: snowflake
      type: http
      baseUri: "https://amazon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: task-history
          path: "/databases/{database}/schemas/{schema}/tasks"
          inputParameters:
            - name: database
              in: path
            - name: schema
              in: path
          operations:
            - name: query-task-history
              method: GET
    - namespace: jira-data
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: slack-data
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Runs a data quality check query against a Snowflake table, and if null counts or row anomalies exceed acceptable thresholds, creates a Jira data-quality ticket and alerts the data-platform Slack channel.

naftiko: "0.5"
info:
  label: "Snowflake Data Quality Gate"
  description: "Runs a data quality check query against a Snowflake table, and if null counts or row anomalies exceed acceptable thresholds, creates a Jira data-quality ticket and alerts the data-platform Slack channel."
  tags:
    - data
    - analytics
    - data-quality
    - snowflake
    - jira
    - slack
capability:
  exposes:
    - type: mcp
      namespace: dq-ops
      port: 8080
      tools:
        - name: run-data-quality-check
          description: "Given a Snowflake table fully qualified name and a null threshold percentage, run a data quality query. If null rate exceeds the threshold, create a Jira DQ ticket and post a Slack alert."
          inputParameters:
            - name: table_fqn
              in: body
              type: string
              description: "The fully qualified Snowflake table name to check, e.g. ANALYTICS_PROD.SALES.ORDERS."
            - name: null_threshold_pct
              in: body
              type: number
              description: "Maximum allowable null percentage in the critical columns (0–100)."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID to notify when a data quality issue is found."
          steps:
            - name: run-dq-query
              type: call
              call: "snowflake-dq.run-statement"
              with:
                statement: "SELECT COUNT_IF(order_id IS NULL) / COUNT(*) * 100 AS null_pct FROM {{table_fqn}}"
            - name: create-dq-ticket
              type: call
              call: "jira-dq.create-issue"
              with:
                project_key: "DATA"
                issuetype: "Bug"
                summary: "Data quality issue: {{table_fqn}} null rate = {{run-dq-query.null_pct}}%"
                description: "Table: {{table_fqn}}\nNull rate: {{run-dq-query.null_pct}}%\nThreshold: {{null_threshold_pct}}%"
            - name: post-dq-alert
              type: call
              call: "slack-dq.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Data Quality Alert: {{table_fqn}} null rate = {{run-dq-query.null_pct}}% (max {{null_threshold_pct}}%). Jira: {{create-dq-ticket.key}}"
  consumes:
    - namespace: snowflake-dq
      type: http
      baseUri: "https://amazon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: statement
          path: "/statements"
          operations:
            - name: run-statement
              method: POST
    - namespace: jira-dq
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: slack-dq
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Snowflake for long-running or expensive queries over the past 24 hours and publishes a performance digest to the data-platform Slack channel.

naftiko: "0.5"
info:
  label: "Snowflake Query Performance Digest"
  description: "Queries Snowflake for long-running or expensive queries over the past 24 hours and publishes a performance digest to the data-platform Slack channel."
  tags:
    - data
    - analytics
    - reporting
    - snowflake
    - slack
capability:
  exposes:
    - type: mcp
      namespace: data-reporting
      port: 8080
      tools:
        - name: digest-query-performance
          description: "Query the Snowflake QUERY_HISTORY view for the top expensive queries in the last 24 hours and post a performance digest to Slack. Invoke for daily data-platform health review."
          inputParameters:
            - name: warehouse_name
              in: body
              type: string
              description: "The Snowflake virtual warehouse name to analyze, e.g. COMPUTE_WH."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID where the performance digest will be posted."
          steps:
            - name: get-query-history
              type: call
              call: "snowflake-perf.get-query-history"
              with:
                warehouse_name: "{{warehouse_name}}"
            - name: post-digest
              type: call
              call: "slack-perf.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Snowflake Query Digest (24h) for {{warehouse_name}}: {{get-query-history.total_queries}} queries, avg execution: {{get-query-history.avg_execution_ms}}ms, credits used: {{get-query-history.credits_used}}."
  consumes:
    - namespace: snowflake-perf
      type: http
      baseUri: "https://amazon.snowflakecomputing.com/api/v2"
      authentication:
        type: bearer
        token: "$secrets.snowflake_token"
      resources:
        - name: query-history
          path: "/queries/history"
          inputParameters:
            - name: warehouse_name
              in: query
          operations:
            - name: get-query-history
              method: GET
    - namespace: slack-perf
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Lists all SNS topics in the AWS account and returns their ARNs for notification management.

naftiko: "0.5"
info:
  label: "SNS Topic List"
  description: "Lists all SNS topics in the AWS account and returns their ARNs for notification management."
  tags:
    - cloud
    - messaging
    - aws
    - sns
capability:
  exposes:
    - type: mcp
      namespace: sns-topics
      port: 8080
      tools:
        - name: list-topics
          description: "List all SNS topics in the AWS account. Returns topic ARNs for use in notification workflows."
          inputParameters:
            - name: next_token
              in: body
              type: string
              description: "Pagination token for listing topics. Pass empty string for first page."
          call: "sns-api.list-topics"
          with:
            next_token: "{{next_token}}"
          outputParameters:
            - name: topics
              type: array
              mapping: "$.Topics"
  consumes:
    - namespace: sns-api
      type: http
      baseUri: "https://sns.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sns_token"
        placement: header
      resources:
        - name: topics
          path: "/"
          inputParameters:
            - name: next_token
              in: query
          operations:
            - name: list-topics
              method: GET

Retrieves the approximate number of messages in an SQS queue to monitor backlog health.

naftiko: "0.5"
info:
  label: "SQS Queue Depth Check"
  description: "Retrieves the approximate number of messages in an SQS queue to monitor backlog health."
  tags:
    - cloud
    - messaging
    - aws
    - sqs
capability:
  exposes:
    - type: mcp
      namespace: sqs-depth
      port: 8080
      tools:
        - name: get-queue-attributes
          description: "Get the approximate message count and other attributes for an SQS queue. Use to monitor queue backlog."
          inputParameters:
            - name: queue_url
              in: body
              type: string
              description: "The full SQS queue URL to check."
          call: "sqs-api.get-queue-attributes"
          with:
            queue_url: "{{queue_url}}"
          outputParameters:
            - name: message_count
              type: number
              mapping: "$.Attributes.ApproximateNumberOfMessages"
  consumes:
    - namespace: sqs-api
      type: http
      baseUri: "https://sqs.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_sqs_token"
        placement: header
      resources:
        - name: queue
          path: "/"
          inputParameters:
            - name: queue_url
              in: body
          operations:
            - name: get-queue-attributes
              method: POST

Fetches the execution history of an AWS Step Functions workflow, summarizes success and failure states, and posts the report to Slack.

naftiko: "0.5"
info:
  label: "Step Functions Workflow Status Reporter"
  description: "Fetches the execution history of an AWS Step Functions workflow, summarizes success and failure states, and posts the report to Slack."
  tags:
    - cloud
    - orchestration
    - aws
    - step-functions
    - slack
capability:
  exposes:
    - type: mcp
      namespace: sfn-reporter
      port: 8080
      tools:
        - name: report-execution-status
          description: "Get the execution history for a Step Functions workflow and post a status summary to Slack."
          inputParameters:
            - name: execution_arn
              in: body
              type: string
              description: "The Step Functions execution ARN to report on."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel for the status report."
          steps:
            - name: get-execution
              type: call
              call: "sfn-api.describe-execution"
              with:
                execution_arn: "{{execution_arn}}"
            - name: get-history
              type: call
              call: "sfn-api.get-execution-history"
              with:
                execution_arn: "{{execution_arn}}"
            - name: post-report
              type: call
              call: "slack-sfn.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Step Functions Report: Execution {{execution_arn}} status: {{get-execution.status}}. Total events: {{get-history.event_count}}."
  consumes:
    - namespace: sfn-api
      type: http
      baseUri: "https://states.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_stepfunctions_token"
        placement: header
      resources:
        - name: execution
          path: "/"
          inputParameters:
            - name: execution_arn
              in: body
          operations:
            - name: describe-execution
              method: POST
            - name: get-execution-history
              method: POST
    - namespace: slack-sfn
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Triggers a Terraform Cloud plan run on a workspace to detect infrastructure drift, posts the plan summary to a Slack channel, and creates a Jira task if drift is found.

naftiko: "0.5"
info:
  label: "Terraform Infrastructure Drift Detector"
  description: "Triggers a Terraform Cloud plan run on a workspace to detect infrastructure drift, posts the plan summary to a Slack channel, and creates a Jira task if drift is found."
  tags:
    - cloud
    - infrastructure
    - terraform
    - jira
    - slack
    - drift-detection
capability:
  exposes:
    - type: mcp
      namespace: infra-ops
      port: 8080
      tools:
        - name: detect-infra-drift
          description: "Given a Terraform Cloud organization and workspace name, trigger a speculative plan run to detect infrastructure drift, and if drift is found, create a Jira task and alert Slack."
          inputParameters:
            - name: terraform_org
              in: body
              type: string
              description: "The Terraform Cloud organization name, e.g. amazon-infra."
            - name: workspace_name
              in: body
              type: string
              description: "The Terraform workspace name to run the drift-detection plan on."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID for the drift-detection alert."
          steps:
            - name: trigger-plan
              type: call
              call: "terraform.create-run"
              with:
                organization: "{{terraform_org}}"
                workspace_name: "{{workspace_name}}"
                plan_only: "true"
            - name: create-drift-ticket
              type: call
              call: "jira-infra.create-issue"
              with:
                project_key: "INFRA"
                issuetype: "Task"
                summary: "Infrastructure drift detected in {{workspace_name}}"
                description: "Terraform plan run ID: {{trigger-plan.run_id}}. Review and apply changes."
            - name: notify-infra-team
              type: call
              call: "slack-infra.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Infra Drift Detected: workspace {{workspace_name}} | Terraform run: {{trigger-plan.run_id}} | Jira: {{create-drift-ticket.key}}"
  consumes:
    - namespace: terraform
      type: http
      baseUri: "https://app.terraform.io/api/v2"
      authentication:
        type: bearer
        token: "$secrets.terraform_token"
      resources:
        - name: run
          path: "/runs"
          operations:
            - name: create-run
              method: POST
    - namespace: jira-infra
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: slack-infra
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Translates Amazon product listing content using Amazon Translate, updates the listing for the target marketplace, and logs the translation to DynamoDB.

naftiko: "0.5"
info:
  label: "Translate Product Listing Localizer"
  description: "Translates Amazon product listing content using Amazon Translate, updates the listing for the target marketplace, and logs the translation to DynamoDB."
  tags:
    - ecommerce
    - localization
    - aws
    - translate
    - marketplace
    - dynamodb
capability:
  exposes:
    - type: mcp
      namespace: listing-translate
      port: 8080
      tools:
        - name: localize-listing
          description: "Translate a product listing to a target language, update the marketplace listing, and log the translation."
          inputParameters:
            - name: asin
              in: body
              type: string
              description: "The ASIN of the product to translate."
            - name: source_language
              in: body
              type: string
              description: "Source language code, e.g. en."
            - name: target_language
              in: body
              type: string
              description: "Target language code, e.g. de."
          steps:
            - name: get-listing
              type: call
              call: "sp-translate.get-listing"
              with:
                asin: "{{asin}}"
            - name: translate-content
              type: call
              call: "translate-api.translate-text"
              with:
                text: "{{get-listing.title}} | {{get-listing.description}}"
                source_language: "{{source_language}}"
                target_language: "{{target_language}}"
            - name: log-translation
              type: call
              call: "dynamo-translate.put-item"
              with:
                table_name: "listing-translations"
                asin: "{{asin}}"
                target_language: "{{target_language}}"
                translated_text: "{{translate-content.translated_text}}"
  consumes:
    - namespace: sp-translate
      type: http
      baseUri: "https://sellingpartnerapi-na.amazon.com"
      authentication:
        type: bearer
        token: "$secrets.sp_api_token"
      resources:
        - name: listing
          path: "/listings/2021-08-01/items/ATVPDKIKX0DER/{asin}"
          inputParameters:
            - name: asin
              in: path
          operations:
            - name: get-listing
              method: GET
    - namespace: translate-api
      type: http
      baseUri: "https://translate.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_translate_token"
        placement: header
      resources:
        - name: translate
          path: "/"
          operations:
            - name: translate-text
              method: POST
    - namespace: dynamo-translate
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST

Generates a Twitch creator payout report by aggregating subscription and bits revenue, stores it in S3, and emails the report via SES.

naftiko: "0.5"
info:
  label: "Twitch Creator Payout Report"
  description: "Generates a Twitch creator payout report by aggregating subscription and bits revenue, stores it in S3, and emails the report via SES."
  tags:
    - media
    - twitch
    - payments
    - analytics
    - aws
    - s3
    - ses
capability:
  exposes:
    - type: mcp
      namespace: twitch-payout
      port: 8080
      tools:
        - name: generate-payout-report
          description: "Aggregate Twitch creator revenue, store the report in S3, and email it to the creator."
          inputParameters:
            - name: broadcaster_id
              in: body
              type: string
              description: "The Twitch broadcaster ID."
            - name: period
              in: body
              type: string
              description: "The reporting period, e.g. 2026-03."
            - name: creator_email
              in: body
              type: string
              description: "The creator email for the report."
          steps:
            - name: get-sub-revenue
              type: call
              call: "twitch-revenue.get-subscriptions"
              with:
                broadcaster_id: "{{broadcaster_id}}"
            - name: upload-report
              type: call
              call: "s3-twitch.put-object"
              with:
                bucket: "twitch-payout-reports"
                key: "{{broadcaster_id}}/{{period}}-payout.json"
                body: "{\"broadcaster\": \"{{broadcaster_id}}\", \"period\": \"{{period}}\", \"sub_revenue\": {{get-sub-revenue.total}}}"
            - name: email-report
              type: call
              call: "ses-twitch.send-email"
              with:
                to: "{{creator_email}}"
                subject: "Twitch Payout Report - {{period}}"
                body: "Your payout report for {{period}} is ready. Subscription revenue: ${{get-sub-revenue.total}}. Full report: s3://twitch-payout-reports/{{broadcaster_id}}/{{period}}-payout.json"
  consumes:
    - namespace: twitch-revenue
      type: http
      baseUri: "https://api.twitch.tv/helix"
      authentication:
        type: bearer
        token: "$secrets.twitch_api_token"
      resources:
        - name: subscriptions
          path: "/subscriptions"
          inputParameters:
            - name: broadcaster_id
              in: query
          operations:
            - name: get-subscriptions
              method: GET
    - namespace: s3-twitch
      type: http
      baseUri: "https://s3.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_s3_token"
        placement: header
      resources:
        - name: object
          path: "/{bucket}/{key}"
          inputParameters:
            - name: bucket
              in: path
            - name: key
              in: path
          operations:
            - name: put-object
              method: PUT
    - namespace: ses-twitch
      type: http
      baseUri: "https://email.us-east-1.amazonaws.com/v2"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_ses_token"
        placement: header
      resources:
        - name: email
          path: "/email/outbound-emails"
          operations:
            - name: send-email
              method: POST

Checks whether a Twitch channel is currently live and returns viewer count and stream title.

naftiko: "0.5"
info:
  label: "Twitch Stream Status"
  description: "Checks whether a Twitch channel is currently live and returns viewer count and stream title."
  tags:
    - media
    - streaming
    - twitch
capability:
  exposes:
    - type: mcp
      namespace: twitch-status
      port: 8080
      tools:
        - name: get-stream-status
          description: "Check if a Twitch channel is currently live. Returns stream title, viewer count, and game category."
          inputParameters:
            - name: user_login
              in: body
              type: string
              description: "The Twitch channel login name to check."
          call: "twitch-api.get-streams"
          with:
            user_login: "{{user_login}}"
          outputParameters:
            - name: is_live
              type: boolean
              mapping: "$.data.length > 0"
            - name: viewer_count
              type: number
              mapping: "$.data[0].viewer_count"
  consumes:
    - namespace: twitch-api
      type: http
      baseUri: "https://api.twitch.tv/helix"
      authentication:
        type: bearer
        token: "$secrets.twitch_api_token"
      resources:
        - name: streams
          path: "/streams"
          inputParameters:
            - name: user_login
              in: query
          operations:
            - name: get-streams
              method: GET

Retrieves purchase orders from Amazon Vendor Central, confirms them, and logs the confirmation to DynamoDB for tracking.

naftiko: "0.5"
info:
  label: "Vendor Central Purchase Order Processor"
  description: "Retrieves purchase orders from Amazon Vendor Central, confirms them, and logs the confirmation to DynamoDB for tracking."
  tags:
    - ecommerce
    - marketplace
    - vendor-central
    - supply-chain
    - dynamodb
capability:
  exposes:
    - type: mcp
      namespace: vendor-po
      port: 8080
      tools:
        - name: process-purchase-order
          description: "Fetch a purchase order from Vendor Central, confirm it, and log the confirmation."
          inputParameters:
            - name: purchase_order_number
              in: body
              type: string
              description: "The Vendor Central purchase order number."
          steps:
            - name: get-po
              type: call
              call: "vendor-api.get-purchase-order"
              with:
                purchase_order_number: "{{purchase_order_number}}"
            - name: confirm-po
              type: call
              call: "vendor-api.confirm-purchase-order"
              with:
                purchase_order_number: "{{purchase_order_number}}"
                items: "{{get-po.items}}"
            - name: log-confirmation
              type: call
              call: "dynamo-vendor.put-item"
              with:
                table_name: "vendor-po-confirmations"
                po_number: "{{purchase_order_number}}"
                status: "confirmed"
                item_count: "{{get-po.item_count}}"
  consumes:
    - namespace: vendor-api
      type: http
      baseUri: "https://sellingpartnerapi-na.amazon.com/vendor"
      authentication:
        type: bearer
        token: "$secrets.sp_api_vendor_token"
      resources:
        - name: purchase-order
          path: "/orders/v1/purchaseOrders/{purchase_order_number}"
          inputParameters:
            - name: purchase_order_number
              in: path
          operations:
            - name: get-purchase-order
              method: GET
        - name: confirmation
          path: "/orders/v1/purchaseOrders/confirmation"
          operations:
            - name: confirm-purchase-order
              method: POST
    - namespace: dynamo-vendor
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST

Adds an IP to an AWS WAF IP set block list, logs the change to DynamoDB for audit, and notifies the security team via Slack.

naftiko: "0.5"
info:
  label: "WAF Rule Update with Notification"
  description: "Adds an IP to an AWS WAF IP set block list, logs the change to DynamoDB for audit, and notifies the security team via Slack."
  tags:
    - cloud
    - security
    - aws
    - waf
    - dynamodb
    - slack
capability:
  exposes:
    - type: mcp
      namespace: waf-update
      port: 8080
      tools:
        - name: block-ip-and-notify
          description: "Add an IP address to a WAF block list, record the action in DynamoDB, and alert the security team."
          inputParameters:
            - name: ip_set_id
              in: body
              type: string
              description: "The WAF IP set ID to update."
            - name: ip_address
              in: body
              type: string
              description: "The IP address to block in CIDR format."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for security notifications."
          steps:
            - name: update-ip-set
              type: call
              call: "waf-api.update-ip-set"
              with:
                ip_set_id: "{{ip_set_id}}"
                ip_address: "{{ip_address}}"
            - name: log-action
              type: call
              call: "dynamo-waf.put-item"
              with:
                table_name: "waf-audit-log"
                ip_address: "{{ip_address}}"
                action: "BLOCK"
                ip_set_id: "{{ip_set_id}}"
            - name: notify-security
              type: call
              call: "slack-waf.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "WAF Update: IP {{ip_address}} added to block list {{ip_set_id}}. Audit record created."
  consumes:
    - namespace: waf-api
      type: http
      baseUri: "https://wafv2.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_waf_token"
        placement: header
      resources:
        - name: ip-set
          path: "/"
          operations:
            - name: update-ip-set
              method: POST
    - namespace: dynamo-waf
      type: http
      baseUri: "https://dynamodb.us-east-1.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_dynamodb_token"
        placement: header
      resources:
        - name: item
          path: "/"
          operations:
            - name: put-item
              method: POST
    - namespace: slack-waf
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Collects health telemetry from Amazon warehouse robotics systems, aggregates metrics in CloudWatch, and posts a fleet health summary to Slack.

naftiko: "0.5"
info:
  label: "Warehouse Robotics Health Dashboard"
  description: "Collects health telemetry from Amazon warehouse robotics systems, aggregates metrics in CloudWatch, and posts a fleet health summary to Slack."
  tags:
    - logistics
    - robotics
    - monitoring
    - warehouse
    - cloudwatch
    - slack
capability:
  exposes:
    - type: mcp
      namespace: robotics-health
      port: 8080
      tools:
        - name: report-fleet-health
          description: "Collect robotics fleet health data, log to CloudWatch, and post a summary to Slack."
          inputParameters:
            - name: warehouse_id
              in: body
              type: string
              description: "The Amazon fulfillment center ID."
            - name: slack_channel
              in: body
              type: string
              description: "Slack channel for robotics health reports."
          steps:
            - name: get-fleet-status
              type: call
              call: "robotics-api.get-fleet-health"
              with:
                warehouse_id: "{{warehouse_id}}"
            - name: log-metrics
              type: call
              call: "cw-robotics.put-metric-data"
              with:
                namespace: "Custom/WarehouseRobotics"
                metric_name: "ActiveRobots"
                value: "{{get-fleet-status.active_count}}"
            - name: post-summary
              type: call
              call: "slack-robotics.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Warehouse {{warehouse_id}} Robotics: {{get-fleet-status.active_count}} active, {{get-fleet-status.idle_count}} idle, {{get-fleet-status.error_count}} in error state."
  consumes:
    - namespace: robotics-api
      type: http
      baseUri: "https://api.amazon.com/warehouse/robotics/v1"
      authentication:
        type: bearer
        token: "$secrets.amazon_robotics_token"
      resources:
        - name: fleet
          path: "/warehouses/{warehouse_id}/fleet/health"
          inputParameters:
            - name: warehouse_id
              in: path
          operations:
            - name: get-fleet-health
              method: GET
    - namespace: cw-robotics
      type: http
      baseUri: "https://monitoring.amazonaws.com"
      authentication:
        type: apikey
        key: "Authorization"
        value: "$secrets.aws_cloudwatch_token"
        placement: header
      resources:
        - name: metric
          path: "/"
          operations:
            - name: put-metric-data
              method: POST
    - namespace: slack-robotics
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Aggregates GitHub PR merge rates, Jira issue cycle times, and Datadog error rates for the past week, then publishes a consolidated engineering health digest to the leadership Slack channel.

naftiko: "0.5"
info:
  label: "Weekly Engineering Metrics Digest"
  description: "Aggregates GitHub PR merge rates, Jira issue cycle times, and Datadog error rates for the past week, then publishes a consolidated engineering health digest to the leadership Slack channel."
  tags:
    - devops
    - reporting
    - github
    - jira
    - datadog
    - slack
    - metrics
capability:
  exposes:
    - type: mcp
      namespace: eng-reporting
      port: 8080
      tools:
        - name: publish-eng-metrics-digest
          description: "Given a GitHub org, Jira project key, and Datadog service tag, fetch the weekly PR merge count, Jira throughput, and service error rate, then post a combined engineering digest to Slack."
          inputParameters:
            - name: github_org
              in: body
              type: string
              description: "The GitHub organization to query PR merge stats for, e.g. amzn."
            - name: jira_project_key
              in: body
              type: string
              description: "The Jira project key to query issue throughput for."
            - name: datadog_service
              in: body
              type: string
              description: "The Datadog service tag to query error rate metrics for."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID where the weekly digest will be posted."
          steps:
            - name: get-pr-stats
              type: call
              call: "github-metrics.search-issues"
              with:
                q: "org:{{github_org}} is:pr is:merged merged:>-7d"
            - name: get-dd-error-rate
              type: call
              call: "datadog-metrics.query-metrics"
              with:
                query: "avg:trace.web.request.errors{service:{{datadog_service}}}.rollup(avg, 604800)"
            - name: post-digest
              type: call
              call: "slack-metrics.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Weekly Engineering Digest | PRs merged: {{get-pr-stats.total_count}} | Datadog error rate (7d avg): {{get-dd-error-rate.value}} | Project: {{jira_project_key}}"
  consumes:
    - namespace: github-metrics
      type: http
      baseUri: "https://api.github.com"
      authentication:
        type: bearer
        token: "$secrets.github_token"
      resources:
        - name: search-issues
          path: "/search/issues"
          inputParameters:
            - name: q
              in: query
          operations:
            - name: search-issues
              method: GET
    - namespace: datadog-metrics
      type: http
      baseUri: "https://api.datadoghq.com/api/v1"
      authentication:
        type: apikey
        key: "DD-API-KEY"
        value: "$secrets.datadog_api_key"
        placement: header
      resources:
        - name: metrics
          path: "/query"
          inputParameters:
            - name: query
              in: query
          operations:
            - name: query-metrics
              method: GET
    - namespace: slack-metrics
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Monitors Whole Foods inventory for low-stock items, creates a replenishment order in the supply chain system, and notifies the store manager via Slack.

naftiko: "0.5"
info:
  label: "Whole Foods Low Stock Replenishment"
  description: "Monitors Whole Foods inventory for low-stock items, creates a replenishment order in the supply chain system, and notifies the store manager via Slack."
  tags:
    - grocery
    - whole-foods
    - inventory
    - supply-chain
    - slack
capability:
  exposes:
    - type: mcp
      namespace: wfm-replenish
      port: 8080
      tools:
        - name: replenish-low-stock
          description: "Check inventory levels at a Whole Foods store, create replenishment orders for low-stock items, and notify the store manager."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "The Whole Foods store ID to check."
            - name: threshold
              in: body
              type: number
              description: "The minimum stock level before triggering replenishment."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel for store manager notifications."
          steps:
            - name: check-inventory
              type: call
              call: "wfm-inv.get-low-stock-items"
              with:
                store_id: "{{store_id}}"
                threshold: "{{threshold}}"
            - name: create-replenishment
              type: call
              call: "wfm-supply.create-order"
              with:
                store_id: "{{store_id}}"
                items: "{{check-inventory.low_stock_items}}"
            - name: notify-manager
              type: call
              call: "slack-wfm.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Low Stock Alert for Store {{store_id}}: {{check-inventory.item_count}} items below threshold. Replenishment order {{create-replenishment.order_id}} created."
  consumes:
    - namespace: wfm-inv
      type: http
      baseUri: "https://api.wholefoodsmarket.com/v2"
      authentication:
        type: bearer
        token: "$secrets.wfm_api_token"
      resources:
        - name: low-stock
          path: "/stores/{store_id}/inventory/low-stock"
          inputParameters:
            - name: store_id
              in: path
            - name: threshold
              in: query
          operations:
            - name: get-low-stock-items
              method: GET
    - namespace: wfm-supply
      type: http
      baseUri: "https://api.wholefoodsmarket.com/v2"
      authentication:
        type: bearer
        token: "$secrets.wfm_supply_token"
      resources:
        - name: order
          path: "/supply-chain/orders"
          operations:
            - name: create-order
              method: POST
    - namespace: slack-wfm
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Checks real-time inventory levels for a product at a specific Whole Foods Market store location.

naftiko: "0.5"
info:
  label: "Whole Foods Store Inventory Check"
  description: "Checks real-time inventory levels for a product at a specific Whole Foods Market store location."
  tags:
    - grocery
    - whole-foods
    - inventory
    - retail
capability:
  exposes:
    - type: mcp
      namespace: wfm-inventory
      port: 8080
      tools:
        - name: check-inventory
          description: "Check the current inventory level for a product at a Whole Foods Market store."
          inputParameters:
            - name: store_id
              in: body
              type: string
              description: "The Whole Foods store ID to check inventory at."
            - name: product_sku
              in: body
              type: string
              description: "The product SKU to check availability for."
          call: "wfm-api.get-inventory"
          with:
            store_id: "{{store_id}}"
            product_sku: "{{product_sku}}"
          outputParameters:
            - name: quantity_on_hand
              type: number
              mapping: "$.inventory.quantityOnHand"
            - name: in_stock
              type: boolean
              mapping: "$.inventory.inStock"
  consumes:
    - namespace: wfm-api
      type: http
      baseUri: "https://api.wholefoodsmarket.com/v2"
      authentication:
        type: bearer
        token: "$secrets.wfm_api_token"
      resources:
        - name: inventory
          path: "/stores/{store_id}/inventory/{product_sku}"
          inputParameters:
            - name: store_id
              in: path
            - name: product_sku
              in: path
          operations:
            - name: get-inventory
              method: GET

When an employee submits a time-off request in Workday, notifies the manager via Slack and creates a Jira task for the manager to approve or deny the request.

naftiko: "0.5"
info:
  label: "Workday Absence Request Processor"
  description: "When an employee submits a time-off request in Workday, notifies the manager via Slack and creates a Jira task for the manager to approve or deny the request."
  tags:
    - hr
    - time-off
    - workday
    - slack
    - jira
capability:
  exposes:
    - type: mcp
      namespace: hr-absence
      port: 8080
      tools:
        - name: process-absence-request
          description: "Given a Workday time-off request ID and manager Slack user ID, fetch request details, notify the manager in Slack, and create a Jira approval task."
          inputParameters:
            - name: time_off_request_id
              in: body
              type: string
              description: "The Workday time-off request ID submitted by the employee."
            - name: manager_slack_id
              in: body
              type: string
              description: "The Slack user ID of the employee's manager for the approval notification."
          steps:
            - name: get-request
              type: call
              call: "workday-abs.get-time-off-request"
              with:
                request_id: "{{time_off_request_id}}"
            - name: notify-manager
              type: call
              call: "slack-abs.post-message"
              with:
                channel: "{{manager_slack_id}}"
                text: "Time-off request pending approval: {{get-request.employee_name}} has requested {{get-request.days}} days from {{get-request.start_date}} to {{get-request.end_date}}."
            - name: create-approval-task
              type: call
              call: "jira-abs.create-issue"
              with:
                project_key: "HR"
                issuetype: "Task"
                summary: "Approve time-off: {{get-request.employee_name}} ({{get-request.start_date}} – {{get-request.end_date}})"
                description: "Workday request ID: {{time_off_request_id}}"
  consumes:
    - namespace: workday-abs
      type: http
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: time-off-request
          path: "/timeOffRequests/{request_id}"
          inputParameters:
            - name: request_id
              in: path
          operations:
            - name: get-time-off-request
              method: GET
    - namespace: slack-abs
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST
    - namespace: jira-abs
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST

Fetches current headcount data from Workday by department and publishes a summary report to a Slack channel for people-ops review.

naftiko: "0.5"
info:
  label: "Workday Headcount Snapshot"
  description: "Fetches current headcount data from Workday by department and publishes a summary report to a Slack channel for people-ops review."
  tags:
    - hr
    - reporting
    - workday
    - slack
    - headcount
capability:
  exposes:
    - type: mcp
      namespace: hr-reporting
      port: 8080
      tools:
        - name: digest-headcount
          description: "Given a Workday organization ID, fetch a headcount summary by department and post the digest to a designated Slack channel. Invoke when a people-ops or finance team member requests a headcount report."
          inputParameters:
            - name: org_id
              in: body
              type: string
              description: "The Workday organization ID to query headcount for."
            - name: slack_channel
              in: body
              type: string
              description: "The Slack channel ID where the headcount digest will be posted."
          steps:
            - name: get-headcount
              type: call
              call: "workday-hc.get-headcount"
              with:
                org_id: "{{org_id}}"
            - name: post-digest
              type: call
              call: "slack-hc.post-message"
              with:
                channel: "{{slack_channel}}"
                text: "Headcount for org {{org_id}}: {{get-headcount.total}} total employees across {{get-headcount.department_count}} departments."
  consumes:
    - namespace: workday-hc
      type: http
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: headcount
          path: "/orgs/{org_id}/headcount"
          inputParameters:
            - name: org_id
              in: path
          operations:
            - name: get-headcount
              method: GET
    - namespace: slack-hc
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST

Queries Workday for employees with pending performance reviews, sends reminder messages to each employee and their manager via Slack, and creates tracking tasks in Jira.

naftiko: "0.5"
info:
  label: "Workday Performance Review Reminder"
  description: "Queries Workday for employees with pending performance reviews, sends reminder messages to each employee and their manager via Slack, and creates tracking tasks in Jira."
  tags:
    - hr
    - performance-management
    - workday
    - slack
    - jira
capability:
  exposes:
    - type: mcp
      namespace: hr-perf
      port: 8080
      tools:
        - name: send-review-reminders
          description: "Given a Workday performance review cycle ID, fetch all employees with pending self-evaluations, send Slack reminders to employees and their managers, and create Jira tracking tasks for HR."
          inputParameters:
            - name: review_cycle_id
              in: body
              type: string
              description: "The Workday performance review cycle ID to query pending evaluations for."
            - name: hr_jira_project
              in: body
              type: string
              description: "The Jira project key for HR tracking tasks, e.g. HROPS."
            - name: hr_slack_channel
              in: body
              type: string
              description: "The Slack channel ID for HR operations notifications."
          steps:
            - name: get-pending-reviews
              type: call
              call: "workday-perf.get-pending-reviews"
              with:
                review_cycle_id: "{{review_cycle_id}}"
            - name: create-hr-task
              type: call
              call: "jira-perf.create-issue"
              with:
                project_key: "{{hr_jira_project}}"
                issuetype: "Task"
                summary: "Performance review cycle {{review_cycle_id}}: {{get-pending-reviews.pending_count}} reviews pending"
                description: "Review cycle: {{review_cycle_id}}\nPending count: {{get-pending-reviews.pending_count}}"
            - name: post-hr-alert
              type: call
              call: "slack-perf.post-message"
              with:
                channel: "{{hr_slack_channel}}"
                text: "Performance Review Reminder: {{get-pending-reviews.pending_count}} employees have pending self-evaluations in cycle {{review_cycle_id}}. Jira task: {{create-hr-task.key}}"
  consumes:
    - namespace: workday-perf
      type: http
      baseUri: "https://wd2-impl-services1.workday.com/ccx/api/v1"
      authentication:
        type: bearer
        token: "$secrets.workday_token"
      resources:
        - name: pending-reviews
          path: "/performanceManagement/{review_cycle_id}/pendingReviews"
          inputParameters:
            - name: review_cycle_id
              in: path
          operations:
            - name: get-pending-reviews
              method: GET
    - namespace: jira-perf
      type: http
      baseUri: "https://amazon.atlassian.net/rest/api/3"
      authentication:
        type: basic
        username: "$secrets.jira_user"
        password: "$secrets.jira_token"
      resources:
        - name: issue
          path: "/issue"
          operations:
            - name: create-issue
              method: POST
    - namespace: slack-perf
      type: http
      baseUri: "https://slack.com/api"
      authentication:
        type: bearer
        token: "$secrets.slack_token"
      resources:
        - name: message
          path: "/chat.postMessage"
          operations:
            - name: post-message
              method: POST